K8S-POD的升级与回滚

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

运行过程示意图

image-20221218171150740
[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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值