k8s控制器之Deployment第三弹之更新Deployment

当Deployment的Pod模板如容器镜像改变时,会触发Rollout。更新过程通过创建新ReplicaSet和缩容旧ReplicaSet完成,保证服务可用性。在更新期间再次修改Deployment,会创建新ReplicaSet并开始新一次更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

k8s控制器之Deployment第三弹之更新Deployment

执行更新

当且仅当 Deployment 的 Pod template(.spec.template)字段中的内容发生变更时(例如标签、容器的镜像被改变),Deployment 的发布更新(rollout)将被触发。Deployment 中其他字段的变化(例如修改 .spec.replicas 字段)将不会触发 Deployment 的发布更新(rollout)

下面然我带你走进Deployment的更新之旅

1、执行如下命令,将容器镜像从 nginx:1.7.9 更新到 nginx:1.9.1

kubectl --record deployment.apps/nginx-deployment set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1

输出结果

deployment.apps/nginx-deployment image updated
deployment.apps/nginx-deployment image updated

或者,您可以 edit 该 Deployment,并将 .spec.template.spec.containers[0].imagenginx:1.7.9 修改为 nginx:1.9.1

kubectl edit deployment.v1.apps/nginx-deployment

输出结果:

deployment.apps/nginx-deployment edited
  1. 查看发布更新(rollout)的状态,执行命令:

    kubectl rollout status deployment.v1.apps/nginx-deployment
    

输出结果:

立即执行,未更新完成时

Waiting for rollout to finish: 2 out of 3 new replicas have been updated...

更新完成时

deployment.apps/nginx-deployment successfully rolled out

查看更新后的Deployment详情:

  • 更新(rollout)成功后,您执行命令 kubectl get deployments 查看更新结果
kubectl get deployments 

输出结果:

NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           19h
  • 执行命令 kubectl get rs Deployment 的更新是通过创建一个新的 3 个副本数的 ReplicaSet 并同时将旧的 Replicaset 的副本数缩容到 0 个副本 来达成的。
kubectl get rs

输出结果:

NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-84df99548d   0         0         0       19h
nginx-deployment-8bf4959b6    3         3         3       3h55m
  • 执行命令 kubectl get pods,此时将只显示新的 Pod
kubectl get pods

输出结果:

NAME                               READY   STATUS    RESTARTS   AGE
nginx-deployment-8bf4959b6-pxf77   1/1     Running   0          4h11m
nginx-deployment-8bf4959b6-w4r85   1/1     Running   0          4h11m
nginx-deployment-8bf4959b6-w8lgr   1/1     Running   0          4h11m
  • 如果您想要修改这些新的 Pod,您只需要再次修改 Deployment 的 Pod template。
  • Deployment 将确保更新过程中,任意时刻只有一定数量的 Pod 被关闭。默认情况下,Deployment 确保至少 .spec.replicas 的 75% 的 Pod 保持可用(25% max unavailable)
  • Deployment 将确保更新过程中,任意时刻只有一定数量的 Pod 被创建。默认情况下,Deployment 确保最多 .spec.replicas 的 25% 的 Pod 被创建(25% max surge)

我们仔细观察一下上述Deployment 的更新过程就会发现, Deployment Controller 先创建一个新 Pod,然后删除一个旧 Pod,然后再创建新的,如此循环,直到全部更新。Deployment Controller 不会 kill 旧的 Pod,除非足够数量的新 Pod 已经就绪。这个过程将确保更新过程中,任意时刻,最少 2 个 / 最多 4 个 Pod 可用。

  • 执行命令 kubectl describe deployments 查看 Deployment 详情

    kubectl describe deployments
    

输出结果

Name:                   nginx-deployment
Namespace:              default
CreationTimestamp:      Mon, 22 May 2023 19:51:32 +0800
Labels:                 app=nginx
Annotations:            deployment.kubernetes.io/revision: 2
                        kubernetes.io/change-cause:
                          kubectl deployment.apps/nginx-deployment set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1 --record=true
Selector:               app=nginx
Replicas:               3 desired | 3 updated | 3 total | 3 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.1
    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-1564180365 (3/3 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  2m    deployment-controller  Scaled up replica set nginx-deployment-2035384211 to 3
  Normal  ScalingReplicaSet  24s   deployment-controller  Scaled up replica set nginx-deployment-1564180365 to 1
  Normal  ScalingReplicaSet  22s   deployment-controller  Scaled down replica set nginx-deployment-2035384211 to 2
  Normal  ScalingReplicaSet  22s   deployment-controller  Scaled up replica set nginx-deployment-1564180365 to 2
  Normal  ScalingReplicaSet  19s   deployment-controller  Scaled down replica set nginx-deployment-2035384211 to 1
  Normal  ScalingReplicaSet  19s   deployment-controller  Scaled up replica set nginx-deployment-1564180365 to 3
  Normal  ScalingReplicaSet  14s   deployment-controller  Scaled down replica set nginx-deployment-2035384211 to 0
 

此时,在 Events 中,您可以看到:

  • 您创建 Deployment 时,Deployment Controller 创建了一个 ReplicaSet (nginx-deployment-2035384211) 并直接将其 scale up 到 3 个副本。
  • 当您更新 Deployment 时,Deployment Controller 先创建一个新的 ReplicaSet (nginx-deployment-1564180365) 并将其 scale up 到 1 个副本,然后 scale down 旧的 ReplicaSet 到 2。
  • Deployment Controller 继续 scale up 新的 ReplicaSet 并 scale down 旧的 ReplicaSet,直到最后,新旧两个 ReplicaSet,一个副本数为 3,另一个副本数为 0。

覆盖更新 Rollover (更新过程中再更新)

每创建一个Deployment, Deployment Controller 都会为其创建一个ReplicaSet, 并设定其副本数为期望的pod数(.spec.replicas 字段)。如果Deployment 被更新,旧的ReplicaSet 将被Scale down, 新建的ReplicaSet 将被Scale up; 直到最后新旧两个ReplicaSet,一个副本数为.spec.replias,另一个副本数为 0。这个过程称为 rollout。

当 Deployment 的 rollout 正在进行中的时候,如果您再次更新 Deployment 的信息,此时 Deployment 将再创建一个新的 ReplicaSet 并开始将其 scale up,将先前正在 scale up 的 ReplicaSet 也作为一个旧的 ReplicaSet,并开始将其 scale down。

下面我们举个例子:

  • 假设您创建了一个 Deployment 有 5 个 nginx:1.7.9 的副本;
  • 您立刻更新该 Deployment 使得其 .spec.replicas 为 5,容器镜像为 nginx:1.9.1,而此时只有 3 个 nginx:1.7.9 的副本已创建;
  • 此时,Deployment Controller 将立刻开始 kill 已经创建的 3 个 nginx:1.7.9 的 Pod,并开始创建 nginx:1.9.1 的 Pod。Deployment Controller 不会等到 5 个 nginx:1.7.9 的 Pod 都创建完之后在开始新的更新

看到这里相信各位胖友也对更新Deployment有了一个较为清晰的认识和了解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

linus.lin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值