Files
kuboard-press/learning/k8s-intermediate/workload/wl-deployment/update.md
2020-03-15 17:00:02 +08:00

8.4 KiB
Raw Blame History

vssueId, layout, description, meta
vssueId layout description meta
35 LearningLayout 本文描述了如何在 Kubernetes 中更新 Deployment
name content
keywords Kubernetes教程,K8S教程,Deployment,Kubernetes部署

更新 Deployment

返回 Deployment

执行更新

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

本文提供了两种途径对 Deployment 执行发布更新rollout

  • 使用 kubectl 更新 Deployment
  • 使用 Kuboard 更新 Deployment

使用下述步骤更新您的 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

或者,您可以 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 以查看更新结果。输出信息如下所示:

    NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    nginx-deployment   3         3         3            3           36s
    
  • 执行命令 kubectl get rs Deployment 的更新是通过创建一个新的 3 个副本数的 ReplicaSet 并同时将旧的 Replicaset 的副本数缩容到 0 个副本 来达成的。输出结果如下所示:

    NAME                          DESIRED   CURRENT   READY   AGE
    nginx-deployment-1564180365   3         3         3       6s
    nginx-deployment-2035384211   0         0         0       36s
    
  • 执行命令 kubectl get pods,此时将只显示新的 Pod输出结果如下所示

    NAME                                READY     STATUS    RESTARTS   AGE
    nginx-deployment-1564180365-khku8   1/1       Running   0          14s
    nginx-deployment-1564180365-nacti   1/1       Running   0          14s
    nginx-deployment-1564180365-z9gth   1/1       Running   0          14s
    
    • 如果您想要修改这些新的 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 已经就绪Deployment Controller 也不会创新新 Pod 直到足够数量的旧 Pod 已经被 kill。这个过程将确保更新过程中任意时刻最少 2 个 / 最多 4 个 Pod 可用。

  • 执行命令 kubectl describe deployments 查看 Deployment 详情,输出结果如下所示:

    Name:                   nginx-deployment
    Namespace:              default
    CreationTimestamp:      Thu, 30 Nov 2017 10:56:25 +0000
    Labels:                 app=nginx
    Annotations:            deployment.kubernetes.io/revision=2
    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
        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。
  1. 进入 Deployment 查看界面,如下图所示:

    Kubernetes-教程

  2. 点击上图中的 调整镜像标签 按钮

    将新版本字段修改为 1.9.1,并点击 确定 按钮,如下图所示:

    Kubernetes-教程

  3. 等待 Kubernetes 完成应用的滚动更新:

    更新过程中,截图如下:

    Kubernetes-教程

    完成更新后,截图如下:

    Kubernetes-教程

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

每创建一个 DeploymentDeployment 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