Pod的升级与回滚
一、 Deployment的升级与回滚
Deployment的升级
①kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
②kubectl edit deployment nginx-deployment进入编辑版本
镜像名一旦发生修改,则将触发系统完成Deployment所有运行Pod的滚动升级操作,可以使用kubectl rollout status命令查看Deployment的更新过程
[root@k8s-master k8s]# kubectl set image deployment/nginx-deployment nginx=nginx:1.9.9
deployment.apps/nginx-deployment image updated
[root@k8s-master k8s]# kubectl rollout status deployment/nginx-deployment
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
deployment "nginx-deployment" successfully rolled out
[root@k8s-master k8s]# kubectl get pods|grep nginx|grep -i running
nginx-deployment-595cf8f5f8-52hqs 1/1 Running 0 2m1s
nginx-deployment-595cf8f5f8-vrc2s 1/1 Running 0 2m30s
[root@k8s-master k8s]# kubectl describe pod/nginx-deployment-595cf8f5f8-52hqs|grep image
Normal Pulled 2m8s kubelet Container image "nginx:1.9.9" already present on machine
运行过程示意图
[root@k8s-master k8s]# kubectl describe deployment nginx-deployment
Name: nginx-deployment
Namespace: default
CreationTimestamp: Wed, 14 Dec 2022 11:27:11 -0800
Labels: <none>
Annotations: deployment.kubernetes.io/revision: 3
Selector: app=nginx
Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=nginx
Containers:
nginx:
Image: nginx:1.9.9
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-deployment-595cf8f5f8 (2/2 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 23m deployment-controller Scaled up replica set nginx-deployment-69c44dfb78 to 1
Normal ScalingReplicaSet 22m deployment-controller Scaled down replica set nginx-deployment-5d59d67564 to 1
Normal ScalingReplicaSet 22m deployment-controller Scaled up replica set nginx-deployment-69c44dfb78 to 2
Normal ScalingReplicaSet 22m deployment-controller Scaled down replica set nginx-deployment-5d59d67564 to 0
Normal ScalingReplicaSet 17m deployment-controller Scaled up replica set nginx-deployment-595cf8f5f8 to 1
Normal ScalingReplicaSet 17m deployment-controller Scaled down replica set nginx-deployment-69c44dfb78 to 1
Normal ScalingReplicaSet 17m deployment-controller Scaled up replica set nginx-deployment-595cf8f5f8 to 2
Normal ScalingReplicaSet 17m deployment-controller Scaled down replica set nginx-deployment-69c44dfb78 to 0 # 这里经过2次升级。
通过查看ReplicaSet信息也可以看出:
[root@k8s-master k8s]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-595cf8f5f8 2 2 2 22m
nginx-deployment-5d59d67564 0 0 0 3d21h
nginx-deployment-69c44dfb78 0 0 0 28m
之所以不删除,是为了后面回滚。
Deployment的回滚
查看Deployment的历史部署记录
[root@k8s-master k8s]# kubectl rollout history deployment/nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 <none>
2 <none>
3 <none>
当部署升级的时候,写错版本即一个不存在镜像时,就会一直拉取不到,如下
[root@k8s-master k8s]# kubectl set image deployment/nginx-deployment nginx=nginx:1.9.99
deployment.apps/nginx-deployment image updated
[root@k8s-master k8s]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-595cf8f5f8 2 2 2 27m
nginx-deployment-5d59d67564 0 0 0 3d21h
nginx-deployment-69c44dfb78 0 0 0 33m
nginx-deployment-74cdcd844f 1 1 0 5s
[root@k8s-master k8s]# kubectl get po|grep nginx
nginx-deployment-595cf8f5f8-52hqs 1/1 Running 0 27m
nginx-deployment-595cf8f5f8-vrc2s 1/1 Running 0 27m
nginx-deployment-5d59d67564-ccxv7 1/1 Terminating 0 3d21h
nginx-deployment-5d59d67564-sfqjc 1/1 Terminating 0 3d21h
nginx-deployment-74cdcd844f-mmc4s 0/1 ErrImagePull 0 27s
回滚
[root@k8s-master k8s]# kubectl rollout undo deployment/nginx-deployment
deployment.apps/nginx-deployment rolled back
[root@k8s-master k8s]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-595cf8f5f8 2 2 2 31m
nginx-deployment-5d59d67564 0 0 0 3d21h
nginx-deployment-69c44dfb78 0 0 0 37m
nginx-deployment-74cdcd844f 0 0 0 4m5s
[root@k8s-master k8s]# kubectl describe pod nginx-deployment-595cf8f5f8-52hqs|grep -i image
Image: nginx:1.9.9 # 版本回到了1.9.9版本
Image ID: docker-pullable://nginx@sha256:c56e8eaec9ff118688c857e263f744039f5ba9fe3b30efcaeef5342f27534a01
Normal Pulled 32m kubelet Container image "nginx:1.9.9" already present on machine
对于复杂的更新操作,可以先配置暂停更新,然后一次性进行更新操作
kubectl rollout pause deployment/nginx-deployment # 暂停Deployment的更新操作
kubectl set image deploy nginx-deployment nginx=nginx:1.9.1 # 修改镜像信息
kubectl set resources deployment nginx-deployment -c=nginx --limits=cpu=200m,memory=512Mi # 修改资源限制
kubectl rollout resume deploy nginx-deployment # 恢复Deployment的更新
kubectl describe deploy nginx-deployment # 检查Deployment的更新情况
DaemonSet与StatefulSet的更新策略
DaemonSet
1.6版本开始支持滚动更新。如如下两种策略
OnDelete : 默认升级策略,在创建好新的DaemonSet配置之后,新的Pod不会被自动创建,用户需要手动删除旧版本的Pod,才出发新建操作。
RollingUpdate: 旧版本的POD 将被自动杀掉,然后自动创建新版的DaemonSet Pod。与Deployment 不同为不支持查看和管理DaemonSet的更新记录;回滚操作是通过再次提交旧版本配置而不是 rollback命令实现
StatefulSet
OnDelete : 默认升级策略,在创建好新的StatefulSetSet配置之后,新的Pod不会被自动创建,用户需要手动删除旧版本的Pod,才出发新建操作。
RollingUpdate: StatefulSet 控制器将删除并重新创建 StatefulSet 中的每个 Pod。它将按照与 Pod 终止相同的顺序进行(从最大的序数到最小的),依次更新每个 Pod。Kubernetes 控制平面会等到更新的 Pod 运行并准备好,然后再更新其前任。如果您已设置.spec.minReadySeconds(请参阅“最小就绪秒数”),则控制平面会在 Pod 准备就绪后额外等待该时间,然后再继续。
partitioned:分区滚动更新。如果指定了分区,则在更新 StatefulSet 时,将更新序数大于或等于该分区的所有 Pod .spec.template。所有序号小于分区的 Pod 都不会更新,即使删除了,也会在之前的版本中重新创建。如果 StatefulSet 的.spec.updateStrategy.rollingUpdate.partition大于其.spec.replicas,则对其的更新.spec.template将不会传播到其 Pod。在大多数情况下,您不需要使用分区,但如果您想要暂存更新、roll out Canary 或执行分阶段roll out,它们会很有用
回滚更新: 一旦更新配置有误,即使修改了配置,k8s也不会继续更新,而是等待异常POD恢复至正常。这时我们需要手动删除异常POD