暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

怎么更新deployment?

kubernetes每日一炼 2019-10-29
302

Update Deployment

注意:仅当.spec.template
更改部署的Pod模板(即)(例如,模板的标签或容器映像已更新)时,才会触发部署的推出其他更新,例如扩展部署,不会触发部署。

请按照下面给出的步骤更新您的部署:

  1. 让我们更新nginx Pods以使用nginx:1.9.1
    图像而不是nginx:1.7.9
    图像。

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

    或简单地使用以下命令:

    kubectl set image deployment/nginx-deployment nginx=nginx:1.91 --record

    输出类似于以下内容:

    deployment.apps/nginx-deployment image updated

    或者,您可以edit
    部署并.spec.template.spec.containers[0].image
    更改nginx:1.7.9
    nginx:1.9.1

    kubectl edit deployment.v1.apps/nginx-deployment

    输出类似于以下内容:

    deployment.apps/nginx-deployment edited

  2. 要查看部署状态,请运行:

    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

获取有关更新的部署的更多详细信息:

  • 部署成功后,您可以通过运行查看部署kubectl get deployments
    输出类似于以下内容:

    NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    nginx-deployment 3 3 3 3 36s

  • 运行kubectl get rs
    以查看部署通过创建新的ReplicaSet并将其缩放到3个副本,以及将旧的ReplicaSet缩小到0个副本来更新Pod。

    kubectl get rs

    输出类似于以下内容:

    NAME                          DESIRED   CURRENT   READY   AGE
    nginx-deployment-1564180365 3 3 3 6s
    nginx-deployment-2035384211 0 0 0 36s

  • 运行kubectl get pods
     应该只显示新的Pod:

    kubectl get pods

    输出类似于以下内容:

    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模板。

    部署可确保仅在更新某些Pod时将它们关闭。默认情况下,它确保至少有期望数量的Pod的75%可用(最大不可用25%)。

    部署还可以确保仅在所需数量的Pod之上创建一定数量的Pod。默认情况下,它确保最多容纳所需数量的Pod的125%(最大浪涌为25%)。

    例如,如果您仔细查看上述部署,您将看到它首先创建了一个新的Pod,然后删除了一些旧的Pod,然后创建了新的Pod。在足够数量的新Pod出现之前,它不会杀死旧Pod;在足够数量的老Pod被杀死之前,它不会创建新Pod。确保至少有2个Pod可用,最多总共有4个Pod可用。

  • 获取有关部署的详细信息:

    kubectl describe deployments

    输出类似于以下内容:

    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

    在这里,您看到当您首次创建部署时,它创建了一个ReplicaSet(nginx-deployment-2035384211)并将其直接扩展到最多3个副本。更新部署时,它会创建一个新的ReplicaSet(nginx-deployment-1564180365),并将其缩放到1,然后将旧的ReplicaSet缩小到2,这样至少有2个Pod可用,最多创建了4个Pod。一直。然后,它使用相同的滚动更新策略继续按比例缩放新的和旧的ReplicaSet。最后,新的ReplicaSet中将有3个可用副本,而旧的ReplicaSet将缩小为0。

过渡(又名进行中的多个更新)

每次由Deployment控制器观察到新的Deployment时,都会创建一个ReplicaSet来调出所需的Pod。如果部署已更新,则控制标签匹配.spec.selector
但模板不匹配的Pod的现有ReplicaSet将按.spec.template
比例缩小。最终,新的ReplicaSet缩放为.spec.replicas
,所有旧的ReplicaSet缩放为0。

如果在进行现有部署时更新部署,则部署会根据更新创建一个新的ReplicaSet并开始进行扩展,然后将其先前扩展的ReplicaSet进行滚动-它将添加到其旧列表中复制集并开始按比例缩小。

例如,假设您创建了一个Deployment来创建5个的副本nginx:1.7.9
,但是nginx:1.9.1
当只创建了3个副本时更新了Deployment以创建5个的副本nginx:1.7.9
在这种情况下,部署会立即开始杀死nginx:1.7.9
已创建的3个Pod,然后开始创建 nginx:1.9.1
Pod。nginx:1.7.9
更改路线之前,它不等待创建5个副本

标签选择器更新

通常不建议更新标签选择器,建议您预先计划选择器。无论如何,如果您需要执行标签选择器更新,请格外小心,并确保您已掌握所有含义。

注意:在API版本中apps/v1
,部署的标签选择器在创建后是不可变的。

  • 选择器的添加也需要使用新标签来更新Deployment规范中的Pod模板标签,否则将返回验证错误。此更改是不重叠的更改,这意味着新选择器不会选择使用旧选择器创建的副本集和Pod,从而导致所有旧副本集孤立,并创建新的副本集。

  • 选择器更新会更改选择器键中的现有值-产生与添加相同的行为。

  • 选择器的删除会从“部署”选择器中删除现有的密钥-不需要对Pod模板标签进行任何更改。现有的副本集不会被孤立,也不会创建新的副本集,但是请注意,已删除的标签仍然存在于任何现有的Pods和副本集中。



文章转载自kubernetes每日一炼,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论