部署

A.部署提供声明性更新豆荚ReplicaSets

请形容期望状态和部署控制器以受控速率将实际状态更改为所需状态。您可以定义部署以创建新的复制集,或删除现有部署并在新部署中采用其所有资源。

注:不要管理部署拥有的ReplicaSets。如果您的用例没有在下面讨论,请考虑在主Kubernetes存储库中打开一个问题。

用例

下面是部署的典型用例:

创建一个部署

下面是一个部署示例。它创建一个ReplicaSet以调出三个nginx豆荚:

蜂房:应用程序/ v1种类:部署元数据:的名字:nginx-deployment标签:应用程序:nginx规范:副本:3.选择器:matchLabels:应用程序:nginx模板:元数据:标签:应用程序:nginx规范:容器:-的名字:nginx图像:nginx: 1.14.2港口:-containerPort:80

在这个例子中:

  • 部署命名nginx-deployment,由.metadata.name领域

  • 部署创建三个复制的Pods,由.spec.replicas领域

  • 这个.spec.selector字段定义部署如何找到要管理的Pods。在本例中,选择Pod模板中定义的标签(应用:nginx).但是,只要Pod模板本身满足该规则,就可以使用更复杂的选择规则。

    注:这个.spec.selector.matchLabels字段是{key,value}对的映射。中单个的{key,value}matchLabelsmap相当于matchExpressions,他的关键字段为“key”,则操作人员是“In”,而the数组中只包含“value”。所有的要求,来自双方matchLabelsmatchExpressions,必须满足才能匹配。
  • 这个模板字段包含以下子字段:

    • 豆荚被标记应用:nginx使用.metadata.labels领域
    • Pod模板的规范,或.template.spec字段,指示吊舱运行一个容器,nginx,运行nginx码头工人中心图片版本1.14.2。
    • 创建一个容器并命名它nginx使用.spec.template.spec.containers [0] . name领域

在开始之前,请确保Kubernetes集群已经启动并运行。按照下面给出的步骤创建上述部署:

  1. 运行以下命令创建部署:

    Kubectl应用-f https://k8s.io/examples/controllers/nginx-deployment.yaml
  2. kubectl得到部署检查是否创建了Deployment。

    如果仍然在创建deploy,则输出类似如下:

    NAME READY - up AVAILABLE AGE nginx-deployment 0/3 0 0 1

    当您检查集群中的部署时,会显示以下字段:

    • 的名字列出名称空间中部署的名称。
    • 准备好了显示您的用户可以使用应用程序的多少副本。它遵循现成的/期望的模式。
    • 最新的显示已更新以达到所需状态的副本数量。
    • 可用显示您的用户可以使用应用程序的多少副本。
    • 年龄显示应用程序运行的时间。

    请注意,期望的副本数量是3是根据什么来确定的.spec.replicas领域

  3. 要查看部署推出状态,请运行Kubectl rollout status deployment/nginx-deployment

    输出类似于:

    正在等待卷展完成:3个新副本中有2个已更新。。。部署“nginx部署”成功推出
  4. 运行kubectl得到部署几秒钟后又来了。输出与此类似:

    NAME READY - up AVAILABLE AGE nginx-deployment 3/3 3 18s

    请注意,Deployment已经创建了所有三个副本,并且所有副本都是最新的(它们包含最新的Pod模板)并且可用。

  5. 要查看ReplicaSet (rs)由部署创建,运行kubectl得到rs.输出类似如下:

    NAME DESIRED CURRENT READY AGE nginx-deploy -75675f5897 3 3 3 18s

    ReplicaSet输出显示如下字段:

    • 的名字列出命名空间中ReplicaSets的名称。
    • 想要的显示所需的数量副本,它是在创建Deployment时定义的。这是期望状态
    • 当前的显示当前运行的副本数量。
    • 准备好了显示您的用户可以使用应用程序的多少副本。
    • 年龄显示应用程序运行的时间。

    请注意,复制集的名称的格式始终为[DEPLOYMENT-NAME] -[随机字符串).随机生成的字符串使用pod模板散列作为种子。

  6. 要查看为每个Pod自动生成的标签,请运行Kubectl得到了豆荚——展示标签.输出类似于:

    姓名就绪状态重启年龄标签nginx部署- 75675 - f5897 7 - ci7o 1/1 0 18岁应用=运行nginx, pod-template-hash = 3123191453 nginx -部署3123191453 - f5897 kzszj 1/1 0 18岁应用=运行nginx, pod-template-hash = 3123191453 nginx -部署3123191453 - f5897 qqcnn 1/1 0 18岁应用=运行nginx, pod-template-hash = 3123191453

    创建的复制集确保有三个nginx豆荚。

注:

必须在展开中指定适当的选择器和Pod模板标签(在本例中,应用:nginx).

不要将标签或选择器与其他控制器(包括其他部署和StatefulSets)重叠。Kubernetes不能阻止重叠,如果多个控制器有重叠的选择器,这些控制器可能会冲突并表现出意外。

Pod-template-hash标签

警告:不要更改这个标签。

这个pod模板散列标签由部署控制器添加到部署创建或采用的每个ReplicaSet。

此标签确保部署的子ReplicaSets不重叠。它是通过对PodTemplate,并使用得到的散列作为标签值,添加到ReplicaSet选择器、Pod模板标签以及ReplicaSet可能拥有的任何现有Pods中。

更新部署

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

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

  1. 让我们更新nginx pod来使用nginx: 1.16.1图像,而不是nginx: 1.14.2的形象。

    kubectl deployment.apps / nginx-deployment图像deployment.v1.apps / nginx-deploymentnginx=nginx: 1.16.1

    或者使用以下命令:

    kubectl映像部署/nginx部署nginx=nginx: 1.16.1

    输出类似于:

    部署。应用程序s/nginx-deployment image updated

    或者,您可以编辑部署和更改.spec.template.spec.containers [0] .imagenginx: 1.14.2nginx: 1.16.1:

    kubectl编辑deployment.v1.apps / nginx-deployment

    输出类似于:

    deployment.apps/nginx-deployment已编辑
  2. 要查看rollout状态,执行命令:

    Kubectl rollout status deployment/nginx-deployment

    输出类似如下:

    等待推出完成:3个新副本中的2个已经更新…

    部署“nginx-deployment”成功推出

获取关于更新部署的更多细节:

  • 上线成功后,可以通过运行命令查看“Deployment”kubectl得到部署.输出类似如下:

    名称已准备好,最新可用的年龄Nginx-deployment 3/3 3 3 36秒
  • kubectl得到rs查看部署通过创建新的ReplicaSet并将其扩展到3个副本,以及将旧的ReplicaSet缩小到0个副本来更新Pods。

    kubectl得到rs

    输出类似如下:

    NAME DESIRED CURRENT READY AGE nginx-deployment-1564180365 3 3 36s nginx-deployment-2035384211 0 0 0 36s
  • 跑步得到豆荚现在应该只显示新的pod:

    kubectl得到豆荚

    输出类似如下:

    NAME READY STATUS restart AGE nginx-deploy -1564180365-khku8 1/1 Running 0 14s nginx-deploy -1564180365-nacti 1/1 Running 0 14s nginx-deploy -1564180365-z9gth 1/1 Running 0 14s

    下次要更新这些Pod时,只需要再次更新Deployment的Pod模板。

    部署可以确保在更新pod时只关闭一定数量的pod。默认情况下,它确保至少75%所需的pod数量上升(25%最大不可用)。

    部署还确保在所需的Pods数量之上只创建一定数量的Pods。默认情况下,它确保最多125%的理想数量的豆荚(25%最大激增)。

    例如,如果您仔细查看上面的Deployment,您将看到它首先创建了一个新的Pod,然后删除了一些旧的Pod,并创建了新的Pod。它不会杀死旧豆荚直到有足够数量的新豆荚出现,也不会创造新的豆荚直到有足够数量的旧豆荚被杀死。它确保至少2个pod是可用的,最多4个pod总共是可用的。

  • 获取部署的详细信息:

    kubectl描述部署

    输出类似如下:

    名称:nginx-deployment命名空间:default CreationTimestamp: Thu, 30 Nov 2017 10:56:25 +0000标签:app=nginx annotation: 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模板:Labels: app=nginx Containers: nginx: Image: nginx:1.16.1 Port: 80/TCP Environment:  mounted:  Volumes: Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable progress True NewReplicaSetAvailable OldReplicaSets:  NewReplicaSet: nginx-deploy -1564180365 (3/3 replicas created)事件:年龄从消息类型原因  ---- ------ ---- ---- ------- 正常ScalingReplicaSet 2 m deployment-controller扩大副本集nginx -部署2035384211 3正常ScalingReplicaSet 24 s deployment-controller扩大副本设置nginx——部署- 1564180365 1正常ScalingReplicaSet 22 s deployment-controller缩减副本集nginx -部署2035384211 2正常ScalingReplicaSet 22 s deployment-controller扩大副本集nginx -部署1564180365 2正常ScalingReplicaSet 19 s deployment-controller按比例缩小的复制品nginx -部署2035384211设置为1正常ScalingReplicaSet 19 s deployment-controller扩大nginx -部署1564180365设置为复制品3.不rmal ScalingReplicaSet 14s deployment-controller Scaled down replica set nginx-deployment-2035384211 to 0

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

翻转(也就是飞行中多次更新)

每当部署控制器观察到一个新的部署时,就会创建一个ReplicaSet以调出所需的Pods。如果更新了Deployment,则控制其标签匹配的Pods的现有ReplicaSet.spec.selector但其模板不匹配.spec.template按比例缩小。最终,新的复制集被扩展到.spec.replicas所有旧的复制集都缩放为0。

如果你更新一个部署在现有的推广过程中,部署创建一个新的ReplicaSet按照更新并开始扩展,和卷ReplicaSet是扩大之前,它会将它添加到列表的旧ReplicaSets并开始扩展。

例如,假设您创建一个部署来创建的5个副本nginx: 1.14.2,然后更新Deployment以创建5个副本nginx: 1.16.1,而只有3个nginx: 1.14.2被创建。在这种情况下,部署立即开始杀死3nginx: 1.14.2它已经创建了豆荚,并开始创建nginx: 1.16.1豆荚。它不会等待的5个副本nginx: 1.14.2在改变航向之前创建。

标签选择器更新

通常不鼓励进行标签选择器更新,建议提前规划选择器。在任何情况下,如果您需要执行标签选择器更新,请非常小心,并确保您已经掌握了所有的含义。

注:在API版本中应用程序/ v1,部署的标签选择器在创建后是不可变的。
  • 选择器添加要求使用新标签更新部署规范中的Pod模板标签,否则将返回验证错误。此更改是不重叠的,这意味着新选择器不会选择使用旧选择器创建的ReplicaSet和POD,从而导致孤立所有旧ReplicaSet并创建新ReplicaSet。
  • 选择器更新更改选择器键中的现有值——导致与添加相同的行为。
  • 选择器删除从部署选择器中删除现有密钥——不需要对Pod模板标签进行任何更改。现有的ReplicaSet不是孤立的,并且不会创建新的ReplicaSet,但请注意,删除的标签仍然存在于任何现有的POD和ReplicaSet中。

回滚部署

有时,您可能希望回滚部署;例如,当部署不稳定时,例如崩溃循环。默认情况下,所有部署的推出历史记录都保存在系统中,以便您可以随时回滚(您可以通过修改修订历史记录限制来更改它)。

注:当触发部署的rollout时,将创建部署的修订。这意味着当且仅当Deployment的Pod模板(.spec.template),例如,如果您更新了模板的标签或容器图像。其他更新(如扩展部署)不创建部署修订,因此您可以方便地同时进行手动或自动扩展。这意味着当您回滚到以前的版本时,只回滚Deployment的Pod模板部分。
  • 假设您在更新部署时输入了一个错误,将映像名称设置为nginx: 1.161而不是nginx: 1.16.1:

    kubectl图像deployment.v1.apps / nginx-deploymentnginx=nginx: 1.161

    输出类似如下:

    部署。应用程序s/nginx-deployment image updated
  • 推出卡住了。你可以通过检查rollout状态来验证它:

    Kubectl rollout status deployment/nginx-deployment

    输出类似如下:

    等待启动完成:3个新副本中有1个已经更新…
  • 按Ctrl-C停止上面的滚动状态监视。想了解更多关于卡钻的信息,在这里阅读更多

  • 您可以看到旧副本的数量(nginx -部署1564180365nginx -部署2035384211)为2,new replicas (nginx-deployment-3066724191)为1。

    kubectl得到rs

    输出类似如下:

    NAME DESIRED CURRENT READY AGE nginx-deployment-1564180365 3 3 25s nginx-deployment-2035384211 0 0 0 36s nginx-deployment-3066724191 11 0 6s
  • 查看创建的Pod,您会看到new ReplicatSet创建的1个Pod卡在图像拉循环中。

    kubectl得到豆荚

    输出类似如下:

    NAME READY STATUS restart AGE nginx-deploy -1564180365-70iae 1/1 Running 0 25s nginx-deploy -1564180365-jbqqo 1/1 Running 0 25s nginx-deploy -1564180365-hysrc 1/1 Running 0 25s nginx-deploy -3066724191-08mng 0/1 ImagePullBackOff 0 6s . log . log . log . log
    注:部署控制器自动停止坏的rollout,并停止扩展新的ReplicaSet。这取决于rollingUpdate参数(maxUnavailable具体地)你已经指定的。Kubernetes默认将该值设置为25%。
  • 获取部署的描述:

    kubectl描述部署

    输出类似如下:

    名称:nginx-deployment名称空间:默认CreationTimestamp:星期二,2016年3月15日14:48:04 -0700标签:应用= nginx选择器:应用= nginx副本:3所需的更新| 1 | 4 | 3 |可用1总用时StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max用时,25% max飙升Pod模板:标签:app=nginx Containers: nginx: Image: nginx:1.161端口:80/TCP主机端口:0/TCP环境:挂载:卷:条件:类型状态原因---- ------ ------ Available True MinimumReplicasAvailable progress True replicasetupdate OldReplicaSets: nginx-deploy -1564180365 (3/3 replicaset已创建)NewReplicaSet:nginx-deployment-3066724191 (1/1 replicas created)事件解释从SubObjectPath FirstSeen LastSeen数类型消息的原因  --------- -------- ----- ---- ------------- -------- ------ ------- 1米1米1 {deployment-controller}正常ScalingReplicaSet扩大复制品nginx -部署2035384211设置为3 22 22年代1 {deployment-controller}正常ScalingReplicaSet扩大副本集nginx -部署1564180365 1 22 22年代1 {deployment-controller}正常ScalingReplicaSet按比例缩小的复制品nginx -部署2035384211设置为2 22 22年代1 {deployment-controller}正常ScalingReplicaSet扩大副本集nginx -部署1564180365 21岁21岁到2 1 {deployment-controller}正常ScalingReplicaSet缩减副本集nginx -部署- 2035384211 1 21岁21岁1 {deployment-controller}正常ScalingReplicaSet扩大复制品nginx -部署1564180365设置为3 13 13年代1 {deployment-controller}正常ScalingReplicaSet缩小复制设置nginx——部署- 2035384211 0 13 13年代1 {deployment-controller}正常ScalingReplicaSet扩大副本集nginx -部署3066724191比1

    要解决这个问题,您需要回滚到以前稳定的Deployment版本。

检查展开的卷展栏历史记录

按照下面给出的步骤检查rollout历史记录:

  1. 首先,检查这个部署的修订:

    kubectl推出历史deployment.v1.apps/nginx-deployment

    输出类似如下:

    kubectl apply——filename=https://k8s.io/examples/controllers/nginx-deployment。Yaml 2 kubectl设置映像部署。v1。应用程序s/nginx-deployment nginx=nginx:1.16.1 3 kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.161

    改变原因是从Deployment注释中复制的www.amasoeur.com /变化带来到它被创造时的修正。您可以指定改变原因消息:

    • 使用kubectl annotate deployment.v1.apps/nginx-deployment www.amasoeur.com/change cause=“图像更新为1.16.1”
    • 手动编辑资源的清单。
  2. 要查看每个版本的详细信息,请运行:

    kubectl推出历史deployment.v1.apps/nginx-deployment--revision=2.

    输出类似如下:

    部署“nginx部署”修订版2标签:app=nginx pod template hash=1159050644注释:www.amasoeur.com/change cause=kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.16.1容器:nginx:image:nginx:1.16.1端口:80/TCP QoS层:cpu:bestforce内存:bestforce环境变量:无卷。

回滚到以前的修订

按照下面给出的步骤将Deployment从当前版本回滚到以前的版本,即版本2。

  1. 现在,您已经决定撤销当前的rollout并回滚到上一个版本:

    Kubectl rollout undo deployment.v1.apps/nginx-deployment

    输出类似如下:

    部署。应用程序s/nginx-deployment rolled back

    或者,您也可以通过指定它来回滚到特定的版本——进一步修正:

    Kubectl rollout undo deployment.v1.apps/nginx-deployment——进一步修正=2.

    输出类似如下:

    部署。应用程序s/nginx-deployment rolled back

    有关rollout相关命令的详细信息,请阅读kubectl推出

    部署现在回滚到以前的稳定版本。如你所见,a部署回滚从部署控制器生成回滚到修订2的事件。

  2. 检查回滚是否成功,部署是否按照预期运行,运行:

    Kubectl get deployment nginx-deployment

    输出类似如下:

    NAME READY - up AVAILABLE AGE nginx-deployment 3/3 3 30m
  3. 获取部署的描述:

    Kubectl描述了nginx-deployment

    输出类似如下:

    名称:nginx-deployment命名空间:default CreationTimestamp: Sun, 02 Sep 2018 18:17:55 -0500 Labels: app=nginx annotation: deployment.kubernetes。= 4 kubernetes io /修订。kubectl set image deployment.v1. Io /change-cause=kubectl set image deployment.v1.应用程序s/nginx-deployment nginx=nginx:1.16.1 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.16.1 Port: 80/TCP Host Port: 0/TCP Environment:  Mounts:  Volumes:  Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable Progressing True NewReplicaSetAvailable OldReplicaSets:  NewReplicaSet: nginx-deployment-c4747d96c (3/3 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 12m deployment-controller Scaled up replica set nginx-deployment-75675f5897 to 3 Normal ScalingReplicaSet 11m deployment-controller Scaled up replica set nginx-deployment-c4747d96c to 1 Normal ScalingReplicaSet 11m deployment-controller Scaled down replica set nginx-deployment-75675f5897 to 2 Normal ScalingReplicaSet 11m deployment-controller Scaled up replica set nginx-deployment-c4747d96c to 2 Normal ScalingReplicaSet 11m deployment-controller Scaled down replica set nginx-deployment-75675f5897 to 1 Normal ScalingReplicaSet 11m deployment-controller Scaled up replica set nginx-deployment-c4747d96c to 3 Normal ScalingReplicaSet 11m deployment-controller Scaled down replica set nginx-deployment-75675f5897 to 0 Normal ScalingReplicaSet 11m deployment-controller Scaled up replica set nginx-deployment-595696685f to 1 Normal DeploymentRollback 15s deployment-controller Rolled back deployment "nginx-deployment" to revision 2 Normal ScalingReplicaSet 15s deployment-controller Scaled down replica set nginx-deployment-595696685f to 0

扩展部署

您可以使用以下命令扩展部署:

kubectl scale deployment.v1.apps/nginx-deployment--副本=10

输出类似如下:

部署。应用程序s/nginx-deployment scaled

假设水平吊舱自动定量如果在集群中启用,则可以为部署设置自动缩放器,并根据现有POD的CPU利用率选择要运行的最小和最大POD数。

kubectl自动定量deployment.v1。应用程序/ nginx-deployment——最小=10——马克思=15——cpu百分比=80

输出类似如下:

部署。应用程序s/nginx-deployment scaled

比例缩放

RollingUpdate deployment支持同时运行一个应用程序的多个版本。当您或自动缩放器扩展处于推出(进行中或暂停)的RollingUpdate Deployment时,部署控制器平衡现有活动ReplicaSets (ReplicaSets with Pods)中的额外副本,以降低风险。这就是所谓的比例缩放

例如,您正在运行一个包含10个副本的部署,maxSurge=3,以及maxUnavailable= 2。

  • 确保部署中的10个副本正在运行。

    kubectl得到部署

    输出类似如下:

    名称期望当前最新可用年龄nginx-deployment 10 10 10 10 50
  • 你更新到一个新映像,这个映像在集群内部是不可解析的。

    kubectl图像deployment.v1.apps / nginx-deploymentnginx=nginx: sometag

    输出类似如下:

    部署。应用程序s/nginx-deployment image updated
  • 镜像更新使用ReplicaSet nginx-deployment-1989198191启动了一个新的发布,但是由于maxUnavailable你上面提到的要求。查看推出状态:

    kubectl得到rs
    输出类似如下:
    名称期望当前就绪年龄nginx-deploy -1989198191 5 5 0 9s nginx-deploy -618515232 8 8 8 1m . nginx-deploy -618515232
  • 然后出现了一个新的部署扩展请求。自动缩放器将Deployment副本增加到15。部署控制器需要决定在哪里添加这些新的5个副本。如果您没有使用比例缩放,那么所有5个都将添加到新的ReplicaSet中。通过比例缩放,可以将额外的副本分散到所有replicaset。更大的比例是副本最多的ReplicaSets,更小的比例是副本较少的ReplicaSets。任何剩余物都将添加到具有最多副本的ReplicaSet中。没有副本的ReplicaSets不会被放大。

在上面的示例中,3个副本添加到旧的ReplicaSet,2个副本添加到新的ReplicaSet。假设新复制副本变得正常,则卷展过程最终应将所有复制副本移动到新的复制集。要确认这一点,请运行:

kubectl得到部署

输出类似如下:

名称期望当前最新可用年龄nginx-deployment 15 18 7 8 m

卷展栏状态确认复制副本是如何添加到每个复制集的。

kubectl得到rs

输出类似如下:

名称期望当前就绪年龄nginx-deployment-1989198191 7 7 0 m nginx-deployment-618515232 11 11 11 m

暂停和恢复部署

您可以在触发一个或多个更新之前暂停部署,然后恢复部署。这允许您在暂停和恢复之间应用多个修复程序,而不会触发不必要的卷展栏。

  • 例如,使用已创建的部署:

    kubectl得到部署

    输出类似如下:

    名称期望当前最新可用年龄nginx 3 3 3 3 1m

    获取卷展栏状态:

    kubectl得到rs

    输出类似如下:

    NAME DESIRED CURRENT READY AGE nginx-2142116321 3 3 3 1m
  • 执行如下命令暂停:

    Kubectl rollout pause deployment.v1.apps/nginx-deployment

    输出类似如下:

    部署。应用程序s/nginx-deployment paused
  • 然后更新部署的映像:

    kubectl图像deployment.v1.apps / nginx-deploymentnginx=nginx: 1.16.1

    输出类似如下:

    部署。应用程序s/nginx-deployment image updated
  • 请注意,没有启动新的卷展栏:

    kubectl推出历史deployment.v1.apps/nginx-deployment

    输出类似如下:

    nginx" REVISION CHANGE-CAUSE 1  .
  • 获取rollout状态,以确保成功更新Deployment:

    kubectl得到rs

    输出类似如下:

    NAME DESIRED CURRENT READY AGE nginx-2142116321 3 3 3 2m
  • 你可以做尽可能多的更新,例如,更新将被使用的资源:

    kubectldeployment.v1资源。应用程序/ nginx-deployment - c=nginx,限制=cpu=200、内存=512Mi

    输出类似如下:

    部署。应用程序s/nginx-deployment resource requirements updated

    在暂停部署之前,部署的初始状态将继续其功能,但只要暂停部署,对部署的新更新将不起任何作用。

  • 最后,继续部署并观察一个新的ReplicaSet,它会出现所有新的更新:

    kubectl卷展栏resume deployment.v1.apps/nginx-deployment

    输出类似如下:

    部署。应用程序s/nginx-deployment resumed
  • 观察rollout的状态,直到它完成。

    Kubectl得到rs -w

    输出类似如下:

    名称所需的当前准备nginx - 2142116321 2岁2 2 2 m nginx - 3926361531 2 2 0 6 s nginx - 3926361531 2 2 1 18 s nginx - 2142116321 1 2 2 2 m nginx - 2142116321 1 2 2 2 m nginx - 3926361531 3 2 1 18 s nginx - 3926361531 3 2 1 18 s nginx - 2142116321 1 1 1 2 m nginx - 3926361531 3 3 1 18 s nginx - 3926361531 3 3 2 19 s nginx - 2142116321 0 1 1 2 m nginx - 2142116321 0 1 1 2 mnginx-3926361531 3 3 3 20秒
  • 获取最新卷展栏的状态:

    kubectl得到rs

    输出类似如下:

    名称所需当前就绪年龄nginx-2142116321 0 0 2m nginx-3926361531 3 28s
注:在恢复已暂停的部署之前,无法回滚该部署。

部署状态

部署在生命周期中进入各种状态。它可以进展在推出一个新的ReplicaSet时,它可以完整的,或者可以不进则退

进行部署

Kubernetes将部署标记为进展执行以下任务之一时:

  • 部署将创建一个新的ReplicaSet。
  • 部署正在扩展其最新的ReplicaSet。
  • 部署正在缩小其旧的ReplicaSet。
  • 新的pod已经准备好或可用了(至少准备好了MinReadySeconds).

可以使用以下命令监视部署的进度kubectl推出状态

完成部署

Kubernetes将部署标记为完整的当它具有以下特点时:

  • 与Deployment关联的所有副本都已更新到您指定的最新版本,这意味着您所请求的任何更新都已完成。
  • 与部署相关联的所有副本都是可用的。
  • 部署的旧副本没有运行。

您可以使用检查部署是否已完成kubectl推出状态.如果推出成功,kubectl推出状态返回零退出码。

Kubectl rollout status deployment/nginx-deployment

输出类似如下:

等待rollout完成:3个更新副本中的2个可用…部署“nginx-deployment”成功推出

和退出状态kubectl推出是0(成功):

回响$?
0

失败的部署

您的部署可能会在未完成部署最新的ReplicaSet时卡住。这可能是由于下列因素造成的:

  • 配额不足
  • 准备调查的失败
  • 图像提取错误
  • 权限不足
  • 极限范围
  • 应用程序运行时错误配置

检测此条件的一种方法是在部署规范中指定一个截止日期参数:(.spec.progressDeadlineSeconds)..spec.progressDeadlineSeconds表示部署控制器在指示(在部署状态中)部署进度已停止之前等待的秒数。

以下kubectl命令将等级库设置为progressDeadlineSeconds,使控制器在10分钟后报告部署无进展:

deployment.v1 kubectl补丁。应用程序/ nginx-deployment - p{“规范”:{“progressDeadlineSeconds”:600}}”

输出类似如下:

deployment.apps/nginx-deployment已修补

一旦超过了最后期限,部署控制器将带有以下属性的DeploymentCondition添加到部署的条件中.状况:

  • 类型=进步
  • 状态= False
  • 原因= ProgressDeadlineExceeded

看到Kubernetes API约定有关状态条件的更多信息。

注:Kubernetes对停滞的部署不采取任何行动,只是报告状态状态原因= ProgressDeadlineExceeded.更高级别的协调器可以利用它并相应地采取行动,例如,将Deployment回滚到以前的版本。
注:如果您暂停部署,Kubernetes不会根据您指定的截止日期检查进度。您可以在启动和恢复过程中安全地暂停部署,而不会触发超过最后期限的条件。

您的部署可能会遇到暂时的错误,这可能是由于您设置的较低的超时时间,也可能是由于任何其他类型的错误,可以视为暂时的。例如,假设您的配额不足。如果您描述部署,您将注意到以下部分:

Kubectl描述了nginx-deployment

输出类似如下:

<……>条件:类型状态原因---- ------ ------ Available True MinimumReplicasAvailable progress True replicasetupdate replicfailure True FailedCreate <

如果你运行Kubectl get deployment nginx-deployment -o yaml,部署状态类似如下:

状态:可用副本:2个条件:-lastTransitionTime:2016-10-04T12:25:39Z lastUpdateTime:2016-10-04T12:25:39Z消息:副本集“nginx-deployment-4262182780”正在进行中。原因:ReplicaSetUpdated状态:“True”类型:Progressing-lastTransitionTime:2016-10-04T12:25:42Z lastUpdateTime:2016-10-04T12:25:42Z消息:部署具有最低可用性。原因:MinimumReplicasAvailable状态:“True”类型:Available-lastTransitionTime:2016-10-04T12:25:39Z lastUpdateTime:2016-10-04T12:25:39Z消息:“创建错误:pods”nginx-Deployment-4262182780-禁止:超出配额:对象计数,请求:pods=1,使用:pods=3,限制:pods=2'原因:失败创建状态:“True”类型:ReplicaFailure observedGeneration:3个副本:2个不可用副本:2

最终,一旦超过部署进度期限,Kubernetes会更新状态和progress条件的原因:

条件:类型状态原因---- ------ ------ Available True MinimumReplicasAvailable progress False ProgressDeadlineExceeded replicaffailure True FailedCreate

可以通过缩小部署、缩小可能正在运行的其他控制器或增加名称空间中的配额来解决配额不足的问题。如果您满足配额条件,并且部署控制器随后完成了部署rollout,您将看到带有成功条件的部署状态更新(状态= True原因= NewReplicaSetAvailable).

条件:类型状态原因-------Available True MinimumReplicasAvailable Progressing True NewReplicaSetAvailable

类型=可用状态= True意味着您的部署具有最低可用性。最低可用性由部署策略中指定的参数决定。类型=进步状态= True意味着您的部署处于推出的中间,它正在进行中,或者它已经成功地完成了它的进程,并且提供了所需的最小新副本(详情请参阅条件原因—在我们的例子中原因= NewReplicaSetAvailable意味着部署已经完成)。

您可以使用kubectl推出状态kubectl推出状态如果部署已超过进度截止日期,则返回一个非零退出码。

Kubectl rollout status deployment/nginx-deployment

输出类似如下:

等待推出完成:3个新副本中的2个已经更新…错误:部署"nginx"超过了进度截止日期

和退出状态kubectl推出是1(表示错误):

回响$?
1.

在失败的部署上操作

适用于完整部署的所有操作也适用于失败的部署。如果需要在Deployment Pod模板中应用多个调整,您可以将其放大/缩小、回滚到以前的版本,甚至可以暂停它。

清理政策

你可以设置.spec.revisionHistoryLimit字段,以指定要为此部署保留多少旧复制集。其余的将在后台进行垃圾收集。默认情况下,它是10。

注:显式地将此字段设置为0,将导致清除部署的所有历史记录,因此部署将无法回滚。

金丝雀部署

如果您想使用Deployment向用户或服务器的子集推出发布版本,可以按照中描述的canary模式创建多个Deployment,每个发布一个部署管理资源

编写部署规范

与所有其他Kubernetes配置一样,部署需要.apiVersion,.kind,. metadata字段。有关使用配置文件的一般信息,请参见部署应用程序,配置容器,以及使用kubectl管理资源文档。部署对象的名称必须是有效的DNS域名

部署还需要一个规格部分

豆荚模板

这个.spec.template.spec.selector的唯一必填字段是规格

这个.spec.template是一个豆荚模板.它和a有完全相同的基模豆荚,但它是嵌套的,没有蜂房种类

除了Pod所需的字段外,部署中的Pod模板还必须指定适当的标签和适当的重启策略。对于标签,请确保不要与其他控制器重叠。看到选择器

只有一个.spec.template.spec.restartPolicy等于总是允许,如果未指定,则为默认值。

副本

.spec.replicas是一个可选字段,指定所需pod的数量。默认值为1。

选择器

.spec.selector指定一个标签选择器用于此部署所针对的吊舱。

.spec.selector必须匹配.spec.template.metadata.labels,否则将被API拒绝。

在API版本中应用程序/ v1,.spec.selector.metadata.labels不要默认为.spec.template.metadata.labels如果没有设置。所以它们必须显式地设置。还要注意,.spec.selector应用程序/ v1

如果标签与选择器匹配的POD的模板不同,则部署可能会终止这些POD.spec.template或者这些豆荚的总数超过.spec.replicas.它带来了新的pod.spec.template如果豆荚的数量小于所需的数量。

注:您不应该通过创建另一个Deployment或创建另一个控制器(如ReplicaSet或ReplicationController)来创建其他标签与这个选择器匹配的Pods。如果这样做,第一个部署会认为它创建了这些其他pod。库伯内特不会阻止你这么做。

如果有多个具有重叠选择器的控制器,则这些控制器将相互冲突,无法正常工作。

策略

.spec.strategy指定用新pod替换旧pod的策略。.spec.strategy.type可以是“重建”或“RollingUpdate”。RollingUpdate为默认值。

重新创建部署

当创建新的pod之前,所有现有的pod将被杀死.spec.strategy.type = =重现

注:这只会保证Pod在创建升级之前终止。如果您升级一个部署,所有旧版本的pod将立即终止。在创建新版本的任何Pod之前,需要等待成功删除。如果手动删除Pod,则生命周期由ReplicaSet控制,替换将立即创建(即使旧Pod仍处于terminate状态)。如果您需要pod的“最多”保证,您应该考虑使用StatefulSet

滚动更新部署

部署以滚动更新的方式更新Pods.spec.strategy.type==滚动更新.您可以指定maxUnavailablemaxSurge控制滚动更新过程。

最大不可用

.spec.strategy.rollingUpdate.maxUnavailable是一个可选字段,指定在更新过程中可能不可用的Pods的最大数量。该值可以是一个绝对数字(例如5)或所需Pods的百分比(例如10%)。绝对数字由百分数四舍五入计算。如果是,则该值不能为0.spec.strategy.rollingUpdate.maxSurge是0。默认值为25%。

例如,当该值设置为30%时,当滚动更新开始时,旧的ReplicaSet可以立即缩小到所需POD的70%。一旦新的POD准备就绪,旧的ReplicaSet可以进一步缩小,然后再放大新的ReplicaSet,以确保在更新过程中随时可用的POD总数至少为所需POD的70%。

马克斯飙升

.spec.strategy.rollingUpdate.maxSurge是一个可选字段,指定可以在所需数量的吊舱上创建的最大吊舱数量。该值可以是绝对数(例如,5)或所需吊舱的百分比(例如,10%)。如果发生以下情况,则该值不能为0MaxUnavailable为0。绝对数通过向上舍入百分比计算得出。默认值为25%。

例如,当这个值设置为30%时,可以在滚动更新开始时立即扩大新的ReplicaSet,这样旧的和新的Pods的总数不会超过所需Pods的130%。一旦旧的pod被删除,新的ReplicaSet可以进一步扩大,确保在更新期间任何时候运行的pod的总数最多是所需pod的130%。

进步的最后期限秒

.spec.progressDeadlineSeconds是一个可选字段,它指定在系统报告部署已完成的任务之前,您希望等待部署进行的秒数没有进步-作为一种条件类型=进步,状态= False.和原因= ProgressDeadlineExceeded资源的状态。部署控制器将继续重试部署。默认值为600。将来,一旦实现了自动回滚,一旦部署控制器观察到这种情况,就会回滚部署。

如果指定,该字段需要大于.spec.minReadySeconds

最小就绪秒数

.spec.minReadySeconds是一个可选字段,它指定新创建的Pod在没有任何容器崩溃的情况下准备就绪的最小秒数,以便将其视为可用。默认值为0 (Pod一旦准备好就被认为是可用的)。要了解更多关于Pod何时被认为是就绪的信息,请参见容器探针

修订历史限制

部署的修订历史记录存储在它控制的ReplicaSets中。

.spec.revisionHistoryLimit是一个可选字段,指定要保留的允许回滚的旧ReplicaSets的数量。这些旧的ReplicaSets消耗资源etcd和拥挤的输出kubectl得到rs.每个部署版本的配置存储在其ReplicaSets中;因此,一旦删除旧的ReplicaSet,您就失去了回滚到那个Deployment版本的能力。默认情况下,将保留10个旧的ReplicaSets,但是它的理想值取决于新部署的频率和稳定性。

更具体地说,将此字段设置为零意味着将清除所有具有0个副本的旧复制集。在这种情况下,无法撤消新的展开卷展栏,因为其修订历史记录已被清除。

停顿了一下

.规格暂停是一个可选的布尔字段,用于暂停和恢复部署。暂停部署和未暂停部署之间的唯一区别是,只要暂停部署,对暂停部署的PodTemplateSpec的任何更改都不会触发新的rollout。默认情况下,在创建部署时不会暂停。

接下来是什么

最后修改于2021年9月28日上午1:16太平洋标准时间:更新工作负载概念页面的“下一步是什么”部分(#29730)(5b373f5bb)