更新 Deployment

通过 Deployment 部署应用后,经常会有 Deployment 文件的配置更改或者镜像版本迭代的需求,更改配置后该 Deployment 会创建新的 ReplicaSet,之后会对管理的 Pod 进行滚动升级

注意

当且仅当 Deployment 的 Pod 模板(即 .spec.template)更改时,才会触发 Deployment 更新,例如更改内存、CPU 配置或者容器的 image。

执行更新操作

主要存在两种更新方式:

  • 使用 kubectl set 命令:

    $ kubectl set image deploy nginx-deploy nginx=nginx:1.25.3
    deployment.apps/nginx-deploy image updated
  • 使用 kubectl edit 命令:

    $ kubectl edit deploy nginx-deploy
    deployment.apps/nginx-deploy edited

查看更新过程

可以使用 kubectl rollout status 查看更新过程(要快,不然信息会只有一部分):

$ kubectl rollout status deploy nginx-deploy
Waiting for deployment "nginx-deploy" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "nginx-deploy" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "nginx-deploy" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "nginx-deploy" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "nginx-deploy" rollout to finish: 1 old replicas are pending termination...
deployment "nginx-deploy" successfully rolled out

可以看出更新过程为新旧交替更新,首先新建一个 Pod,当 Pod 状态为 Running 时,删除一个旧的 Pod,同时创建一个新的 Pod

查看 ReplicaSet

当触发一个更新后,会有新的 ReplicaSet 产生,旧的 ReplicaSet 会被保存,查看此时的 ReplicaSet,可以从 AGE 或 READY 看出新旧 ReplicaSet:

$ kubectl get rs -l app=nginx
NAME                      DESIRED   CURRENT   READY   AGE
nginx-deploy-585ff57b46   2         2         2       39m
nginx-deploy-68c574c9f    0         0         0       16m
nginx-deploy-c86995cd6    0         0         0       6m32s

查看 deployment 详细信息

通过 describe 查看 Deployment 的详细信息:

$ kubectl describe deploy nginx-deploy
Name:                   nginx-deploy
Namespace:              default
CreationTimestamp:      Sun, 26 Nov 2023 10:32:16 +0800
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 4
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.14.2
    Port:       80/TCP
    Host Port:  0/TCP
    Limits:
      cpu:        500m
      memory:     128Mi
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  nginx-deploy-68c574c9f (0/0 replicas created), nginx-deploy-c86995cd6 (0/0 replicas created)        
NewReplicaSet:   nginx-deploy-585ff57b46 (2/2 replicas created)
Events:
  Type    Reason             Age                    From                   Message
  ----    ------             ----                   ----                   -------
  Normal  ScalingReplicaSet  42m                    deployment-controller  Scaled up replica set nginx-deploy-585ff57b46 to 2
  Normal  ScalingReplicaSet  18m                    deployment-controller  Scaled up replica set nginx-deploy-68c574c9f to 1
  Normal  ScalingReplicaSet  18m                    deployment-controller  Scaled down replica set nginx-deploy-585ff57b46 to 1 from 2
  Normal  ScalingReplicaSet  18m                    deployment-controller  Scaled up replica set nginx-deploy-68c574c9f to 2 from 1
  Normal  ScalingReplicaSet  17m                    deployment-controller  Scaled down replica set nginx-deploy-585ff57b46 to 0 from 1

在 describe 中可以看出:

  • (第35行)第一次创建时,它创建了一个名为 nginx-deploy-585ff57b46 的 ReplicaSet,并直接将其扩展为 2 个副本。

  • (第36和37行)更新部署时,它创建了一个新的 ReplicaSet,命名为 nginx-deploy-68c574c9f,并将其副本数扩展为 1,然后将旧的 ReplicaSet 缩小为 1,这样至少可以有一个 Pod 可用,最多创建了 3 个 Pod。

  • (第38和39行)以此类推,使用相同的滚动更新策略向上和向下扩展新旧 ReplicaSet,最终新的 ReplicaSet 可以拥有 2 个副本,并将旧的 ReplicaSet 缩小为 0。

最后更新于