Deployment回滚、扩缩容与发布控制

来自AI助手的总结
介绍了Deployment的回滚、扩缩容、暂停恢复及更新注意事项
Deployment回滚、扩缩容与发布控制

一、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

使用edit动态调整Pod的副本数为5

(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

使用edit动态调整Pod的副本数为3

(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

image-20230319164108876

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 在准备就绪后立即将被视为可用)。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容