Deployment实现扩展/收缩,以及滚动更新
一、Deployment概述
- 功能:实现了Pod的“水平扩展/收缩”(horizontal scaling out/in),是Kubernetes中重要的编排能力。
- 核心概念:依赖ReplicaSet API对象实现。
二、ReplicaSet详解
- 定义:由副本数目的定义和一个Pod模板组成。
- 结构:
apiVersion: apps/v1 kind: ReplicaSet metadata:name: nginx-setlabels:app: nginx spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.7.9
- 关系:ReplicaSet是Deployment的一个子集,Deployment通过操纵ReplicaSet来间接控制Pod。
三、Deployment与ReplicaSet、Pod的关系
- 关系图:
Deployment → ReplicaSet → Pod
- 解释:
- ReplicaSet:负责保证系统中Pod的个数等于指定的个数。
- Deployment:通过操作ReplicaSet的个数和属性,实现“水平扩展/收缩”和“滚动更新”。
四、水平扩展/收缩
- 实现方式:Deployment Controller修改ReplicaSet的Pod副本个数。
- 命令示例:
kubectl scale deployment nginx-deployment --replicas=4
五、滚动更新
- 定义:通过交替升级Pod的方式,实现应用的平滑升级。
- 策略配置:
spec:strategy:type: RollingUpdaterollingUpdate:maxSurge: 1maxUnavailable: 1
- maxSurge:除了期望的Pod副本数之外,最多可以额外创建的Pod数。
- maxUnavailable:在升级过程中,最多可以同时不可用的Pod数。
- 触发方式:修改Deployment的Pod模板。
- 过程:
- 创建一个新的ReplicaSet,初始Pod副本数为0。
- 逐步将新ReplicaSet的Pod副本数增加到指定值,同时将旧ReplicaSet的Pod副本数减少到0。
- 在整个过程中,确保只有指定数量的Pod处于不可用状态,同时只有指定数量的新Pod被创建。
- 命令示例:
kubectl set image deployment/nginx-deployment nginx=nginx:1.91
- 状态查看:
kubectl rollout status deployment/nginx-deployment
六、滚动更新的好处
- 服务连续性:在升级过程中,始终有部分旧版本的Pod在线,减少服务中断的风险。
- 健康检查:依赖Pod的HealthCheck机制,确保新版本的Pod正常运行后再进行替换。
七、版本控制与回滚
- 版本记录:使用
kubectl rollout history
查看Deployment的变更历史。 - 回滚命令:
kubectl rollout undo deployment/nginx-deployment
- 回滚到指定版本:
kubectl rollout undo deployment/nginx-deployment --to-revision=2
八、优化ReplicaSet生成
- 暂停滚动更新:使用
kubectl rollout pause
暂停Deployment,修改后再恢复。 - 恢复滚动更新:使用
kubectl rollout resume
恢复Deployment。 - 控制历史版本数量:通过
spec.revisionHistoryLimit
字段限制保留的历史ReplicaSet数量。
九、总结
- Deployment的两层控制关系:
- Deployment控制ReplicaSet(版本)
- ReplicaSet控制Pod(副本数)
- 抽象与应用:Kubernetes通过Deployment实现了对应用的抽象,使得应用的描述、版本控制和发布变得更加简单和高效。
十、应用
- 金丝雀发布和蓝绿发布:
- 金丝雀发布:先发布少量机器进行验证,无误后再全面更新。
- 蓝绿发布:准备两组机器,一组为当前版本(蓝),一组为新版本(绿),通过切换流量实现更新。