Deployment一般用于部署公司的无状态服务,可以利用Deployment的高级功能做到无缝迁移、自动扩缩容、自动灾难恢复、一键回滚等功能。
1. 创建Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment # Deployment的名称;
labels:
app: nginx
spec:
replicas: 3 # 创建Pod的副本数;
selector: # 定义Deployment如何找到要管理的Pod,与template的label (标签)对应, apiVersion为apps/v1必须指定该字段;
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx # nginx使用label(标签)标记Pod;
spec:
containers:
- name: nginx # 表示Pod运行一个名字为nginx的容器;
image: registry.cn-beijing.aliyuncs.com/jiangxiaonan/nginx:1.22.1 # 运行此Pod使用的镜像;
ports:
- containerPort: 80 # 容器用于发送和接收流量的端口。
使用 kubectl create 创建此 Deployment:
kubectl create -f dp-nginx.yaml
使用 kubectl get 或者 kubectl describe 查看此 Deployment 的状态:
# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 4m47s
➢ NAME: 集群中Deployment的名称;
➢ READY: Pod就绪个数和总副本数;
➢ UP-TO-DATE: 显示已达到期望状态的被更新的副本数;
➢ AVAILABLE: 显示用户可以使用的应用程序副本数,当前为0, 说明目前还没有达到期望的Pod;
➢ AGE: 显示应用程序运行的时间。
查看此 Deployment 当前对应的 ReplicaSet:
# kubectl get rs -l app=nginx
NAME DESIRED CURRENT READY AGE
nginx-deployment-66b75bcd99 0 0 0 15m
nginx-deployment-694bb56878 3 3 3 89s
➢ DESIRED:应用程序副本数;
➢ CURRENT:当前正在运行的副本数;
当 Deployment 有过更新,对应的 RS 可能不止一个,可以通过-o yaml 获取当前对应的 RS是哪个,其余的 RS 为保留的历史版本,用于回滚等操作。
2. 更新 Deployment
当且仅当 Deployment 的 Pod 模板(即.spec.template)更改时,才会触发 Deployment更新,例如更改内存、 CPU 配置或者容器的 image。
假如更新 Nginx Pod 的 image,并使用--record 记录当前更改的参数,后期回滚时可以查看到对应的信息:
kubectl set image deployment nginx-deployment nginx=registry.cn-beijing.aliyuncs.com/jiangxiaonan/nginx:1.22.1 --record
# 其他修改,比如内存、CPU
kubectl set resources deployment.v1.apps/nginx-deployment -c=nginx --limits=cpu=200m,memory=512Mi --record
当然也可以使用 edit 命令直接编辑 Deployment,效果相同:
kubectl edit deployment.v1.apps/nginx-deployment
可以使用 kubectl rollout status 查看更新过程:
kubectl rollout status deployment.v1.apps/nginx-deployment
通过 describe 查看 Deployment 的详细信息:
kubectl describe deploy nginx-deployment
3. 回滚 Deployment
使用 kubectl rollout history 查看更新历史:
# kubectl rollout history deployment/nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 kubectl set image deployment nginx-deployment nginx=registry.cn-beijing.aliyuncs.com/jiangxiaonan/nginx:1.22.1 --record=true
2 kubectl set image deployment nginx-deployment nginx=registry.cn-beijing.aliyuncs.com/jiangxiaonan/nginx:1.16.1 --record=true
查看 Deployment 某次更新的详细信息,使用--revision 指定某次更新版本号:
kubectl rollout history deployment/nginx-deployment --revision=1
如果只需要回滚到上一个稳定版本,使用 kubectl rollout undo 即可:
kubectl rollout undo deployment/nginx-deployment
如果要回滚到指定版本,使用--to-revision 参数:
kubectl rollout undo deployment/nginx-deployment --to-revision=2
4. 扩容 Deployment
使用 kubectl scale 动态调整 Pod 的副本数,比如增加 Pod 为 5 个:
kubectl scale deployment.v1.apps/nginx-deployment --replicas=5
# 或者使用patch命令
kubectl patch deploy nginx-deployment -p '{"spec":{"replicas":5}}'
5. 暂停和恢复 Deployment 更新
上述演示的均为更改某一处的配置,更改后立即触发更新,大多数情况下可能需要针对一个资源文件更改多处地方,而并不需要多次触发更新,此时可以使用 Deployment 暂停功能,临时禁用更新操作,对 Deployment 进行多次修改后在进行更新。
使用 kubectl rollout pause 命令即可暂停 Deployment 更新:
kubectl rollout pause deployment/nginx-deployment
然后对 Deployment 进行相关更新操作,比如先更新镜像,然后对其资源进行限制(如果使用的是 kubectl edit 命令,可以直接进行多次修改,无需暂停更新,
进行完最后一处配置更改后,使用 kubectl rollout resume 恢复 Deployment 更新:
kubectl rollout resume deployment.v1.apps/nginx-deployment
6. 更新 Deployment 的注意事项
历史版本清理策略:
在默认情况下, revision 保留 10 个旧的 ReplicaSet,其余的将在后台进行垃圾回收,可以在.spec.revisionHistoryLimit 设置保留 ReplicaSet 的个数。 当设置为 0 时,不保留历史记录。
更新策略:
spec.strategy.type==Recreate,表示重建,先删掉旧的Pod再创建新的Pod;
spec.strategy.type==RollingUpdate,表示滚动更新,可以指定maxUnavailable和maxSurge来控制滚动更新过程;
spec.strategy.rollingUpdate.maxUnavailable,指定在回滚更新时最大不可用的Pod数量,可选字段,默认为25%,可以设置为数字或百分比,如果maxSurge为0,则该值不能为0;
spec.strategy.rollingUpdate.maxSurge可以超过期望值的最大Pod数,可选字段,默认为25%,可以设置成数字或百分比,如果maxUnavailable为0,则该值不能为0。