
一、Deployment回滚
当更新版本后出现不稳定或配置不合理时,可以对其进行回滚操作。默认情况下,Deployment 的所有上线记录都保留在系统中,以便可以随时回滚 (你可以通过修改修订历史记录限制来更改这一约束)。当我们进行回滚时,既可以回滚到上一个版本,也可以回滚到指定版本。
假设我们又进行了几次更新 ,此处以更新镜像版本触发更新(更改配置效果类似):
$ k set image deployment nginx-deployment nginx=registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2 --record
$ k set image deployment nginx-deployment nginx=nginx:1.16.1 --record
1.1 回滚到上一个版本
1.查看更新历史,此时镜像版本为1.16.1
$ k rollout history deployment nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
5 kubectl set image deployment nginx-deployment nginx=registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2 --record=true
6 kubectl set image deployment nginx-deployment nginx=nginx:1.16.1 --record=true
2.查看 Deployment 某次更新的详细信息,使用–revision 指定某次更新版本号
$ k rollout history deployment nginx-deployment --revision=5
deployment.apps/nginx-deployment with revision #5
Pod Template:
Labels: app=nginx
pod-template-hash=df755dd4
Annotations: kubernetes.io/change-cause:
kubectl set image deployment nginx-deployment nginx=registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2 --record=true
Containers:
nginx:
Image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
3.回滚到上一个稳定版本
$ k rollout undo deployment nginx-deployment
deployment.apps/nginx-deployment rolled back
4.再次查看更新历史,此时镜像版本为1.14.2
$ k rollout history deployment nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
6 kubectl set image deployment nginx-deployment nginx=nginx:1.16.1 --record=true
7 kubectl set image deployment nginx-deployment nginx=registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2 --record=true
1.2 回滚到指定版本
1.查看更新历史,此时镜像版本为1.16.1
$ k rollout history deployment nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
5 kubectl set image deployment nginx-deployment nginx=registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2 --record=true
6 kubectl set image deployment nginx-deployment nginx=nginx:1.16.1 --record=true
2.查看 Deployment 某次更新的详细信息,使用–revision 指定某次更新版本号
$ k rollout history deployment nginx-deployment --revision=5
deployment.apps/nginx-deployment with revision #5
Pod Template:
Labels: app=nginx
pod-template-hash=df755dd4
Annotations: kubernetes.io/change-cause:
kubectl set image deployment nginx-deployment nginx=registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2 --record=true
Containers:
nginx:
Image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
3.回滚到指定稳定版本1.14.2,使用–to-revision 参数
$ k rollout undo deployment nginx-deployment --to-revision=5
deployment.apps/nginx-deployment rolled back
4.再次查看更新历史,此时镜像版本为1.14.2
$ k rollout history deployment nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
6 kubectl set image deployment nginx-deployment nginx=nginx:1.16.1 --record=true
7 kubectl set image deployment nginx-deployment nginx=registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2 --record=true
二、Deployment扩缩容
2.1 扩容Deployment
当公司访问量变大,或者有预期内的活动时,三个 Pod 可能已无法支撑业务时,可以提前对其进行扩展。
1.动态调整Pod的副本数,比如增加Pod到5个
(1)使用kubectl edit动态调整Pod的副本数,找到replicas所在行将冒号后面数字修改为5
$ k edit deployment nginx-deployment

(2)使用kubectl scale动态调整Pod的副本数
$ k scale deployment nginx-deployment --replicas=5
deployment.apps/nginx-deployment scaled
2.查看 Pod,此时 Pod 已经变成了 5 个
$ k get po
NAME READY STATUS RESTARTS AGE
nginx-deployment-df755dd4-5tj65 1/1 Running 0 7s
nginx-deployment-df755dd4-8bgl5 1/1 Running 0 18m
nginx-deployment-df755dd4-hqkqm 1/1 Running 0 7s
nginx-deployment-df755dd4-rf9zd 1/1 Running 0 18m
nginx-deployment-df755dd4-swsp9 1/1 Running 0 18m
2.2 缩容Deployment
当公司访问量变小时,五个 Pod 过于支撑业务时,可以提前对其进行缩容。这里需要注意:缩容只针对无状态服务。
1.调整Pod的副本数,比如减少Pod到3个
(1)使用kubectl edit动态调整Pod的副本数,找到replicas所在行将冒号后面数字修改为3
$ k edit deployment nginx-deployment

(2)使用kubectl scale动态调整Pod的副本数
$ k scale deployment nginx-deployment --replicas=3
deployment.apps/nginx-deployment scaled
2.查看 Pod,此时 Pod 已经变成了 3 个
$ k get po
NAME READY STATUS RESTARTS AGE
nginx-deployment-df755dd4-8bgl5 1/1 Running 0 24m
nginx-deployment-df755dd4-rf9zd 1/1 Running 0 24m
nginx-deployment-df755dd4-swsp9 1/1 Running 0 24m
三、暂停和恢复Deployment
在你更新一个 Deployment 的时候,或者计划更新它的时候, 你可以在触发一个或多个更新之前暂停 Deployment 的上线过程。 当你准备应用这些变更时,你可以重新恢复 Deployment 上线过程。 这样做使得你能够在暂停和恢复执行之间应用多个修补程序,而不会触发不必要的上线操作。
1.使用kubectl rollout pause命令即可暂停Deployment更新
$ k rollout pause deployment nginx-deployment
deployment.apps/nginx-deployment paused
2.对 Deployment 进行相关更新操作,比如先更新镜像,然后对其资源进行限制(如果使 用的是 kubectl edit 命令,可以直接进行多次修改,无需暂停更新,kubectl set命令一般会集成在 CICD 流水线中)
(1)更新镜像
$ k set image deployment nginx-deployment nginx=nginx:1.9.1
deployment.apps/nginx-deployment image updated
(2)更改系统配置参数
$ k set resources deployment nginx-deployment -c=nginx --limits=cpu=200m,memory=512Mi
deployment.apps/nginx-deployment resource requirements updated
3.使用kubectl rollout resume恢复 Deployment 更新
$ k rollout resume deployment nginx-deployment
deployment.apps/nginx-deployment resumed
4.观察上线的状态,直到完成
$ k get rs -w
5.获取最近上线的状态,可以查看到恢复更新的 Deployment 创建了一个新的 RS(ReplicaSet 缩写)nginx-deployment-765cbd8684
$ k get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-765cbd8684 1 1 0 8s
nginx-deployment-df755dd4 3 3 3 6h32m
nginx-deployment-ff6655784 0 0 0 5h53m
6.查看Deployment 的 image(镜像)已经变为 nginx:1.9.1
$ k get deploy nginx-deployment -oyaml

四、Deployment更新注意事项
4.1 历史版本清理策略
.spec.revisionHistoryLimit 是一个可选字段,用来设定出于回滚目的所要保留的旧 ReplicaSet 数量。 这些旧 ReplicaSet 会消耗 etcd 中的资源,并占用 kubectl get rs 的输出。 每个 Deployment 修订版本的配置都存储在其 ReplicaSets 中;因此,一旦删除了旧的 ReplicaSet, 将失去回滚到 Deployment 的对应修订版本的能力。 默认情况下,系统保留 10 个旧 ReplicaSet,但其理想值取决于新 Deployment 的频率和稳定性。
更具体地说,将此字段设置为 0 意味着将清理所有具有 0 个副本的旧 ReplicaSet。 在这种情况下,无法撤消新的 Deployment 上线,因为它的修订历史被清除了。
使用k edit命令进行查看
$ k edit deploy nginx-deployment

4.2 更新策略
.spec.strategy 策略指定用于用新 Pod 替换旧 Pod 的策略。 .spec.strategy.type 可以是 “Recreate” 或 “RollingUpdate”。“RollingUpdate” 是默认值。
1..spec.strategy.type==Recreate表示重建,先删掉旧的Pod再创建新的Pod;
2..spec.strategy.type==RollingUpdate表示滚动更新,可以指定maxUnavailable和maxSurge 来控制滚动更新过程;
(1).spec.strategy.rollingUpdate.maxUnavailable指定在回滚更新时最大不可用的Pod数量, 可选字段,默认为25%,可以设置为数字或百分比,如果maxSurge为0,则该值不能为0;
(2).spec.strategy.rollingUpdate.maxSurge可以超过期望值的最大Pod数,可选字段,默认为 25%,可以设置成数字或百分比,如果maxUnavailable为0,则该值不能为0
4.3 Ready 策略
.spec.minReadySeconds 是一个可选字段,用于指定新创建的 Pod 在没有任意容器崩溃情况下的最小就绪时间, 只有超出这个时间 Pod 才被视为可用。默认值为 0(Pod 在准备就绪后立即将被视为可用)。







暂无评论内容