date: 2020-06-30title: K8s之deployment状态分析 #标题
tags: deployment状态分析 #标签
categories: k8s # 分类

Deployment 的生命周期中,将会进入不同的状态,这些状态可能是:

  • Progressing: 正在执行滚动更新
  • complete
  • fail to progress

Progressing 状态

当以下任何一个任务正在执行时,Kubernete 将 Deployment 的状态标记为 progressing:

  • Deployment 创建了一个新的 ReplicaSet
  • Deployment 正在 scale up 其最新的 ReplicaSet
  • Deployment 正在 scale down 其旧的 ReplicaSet
  • 新的 Pod 变为 就绪(ready) 或 可用(available)

注:可以使用kubectl rollout status指令监控 Deployment 滚动更新的过程。

Complete 状态

如果 Deployment 符合以下条件,Kubernetes 将其状态标记为 complete:

  • 该 Deployment 中的所有 Pod 副本都已经被更新到指定的最新版本。
  • 该 Deployment 中的所有 Pod 副本都处于 可用(available) 状态。
  • 该 Deployment 中没有旧的 ReplicaSet 正在运行。

简而言之就是更新过程已经完全成功,就会进入complete状态。以下是一个查询示例:

  1. $ kubectl get deployment
  2. NAME READY UP-TO-DATE AVAILABLE AGE
  3. web-nginx 2/2 2 2 36m
  4. $ kubectl rollout status deployment.v1.apps/web-nginx
  5. deployment "web-nginx" successfully rolled out

Failed 状态

Deployment 在更新其最新的 ReplicaSet 时,可能卡住而不能达到 complete 状态。如下原因都可能导致此现象发生:

  • 集群资源不够
  • 就绪检查(readiness probe)失败
  • 镜像抓取失败
  • 权限不够
  • 资源限制
  • 应用程序的配置错误导致启动失败

指定 Deployment 定义中的 .spec.progressDeadlineSeconds 字段,Deployment Controller 在等待指定的时长后,将 Deployment 的标记为处理失败。例如,执行命令 kubectl patch deployment.v1.apps/nginx-deployment -p ‘{“spec”:{“progressDeadlineSeconds”:600}}’ 使得 Deployment Controller 为 Deployment 的处理过程等候 15 分钟(一般使用默认的10分钟即可),输出结果如下所示:

  1. $ kubectl get deployment
  2. NAME READY UP-TO-DATE AVAILABLE AGE
  3. web-nginx 2/2 2 2 40m
  4. $ kubectl patch deployment.v1.apps/web-nginx -p '{"spec":{"progressDeadlineSeconds":900}}'
  5. deployment.apps/web-nginx patched

如果上面指定的900s(15分钟)到达之后,replicaset还没到达complete状态,deployment controoler将在deployment.status.conditions 字段添加如下 deploymentCondition

  1. Type=Progressing
  2. Status=False
  3. Reason=ProgressDeadlineExceeded

注:

  • 除了添加一个 Reason=ProgressDeadlineExceededDeploymentCondition.status.conditions 字段以外,Kubernetes 不会对被卡住的 Deployment 做任何操作。我们可以执行 kubectl rollout undo 命令,将 Deployment 回滚到上一个版本
  • 如果暂停了 Deployment,Kubernetes 将不会检查 .spec.progressDeadlineSeconds

处于failed状态的deployment如何解决

可以针对 Failed 状态下的 Deployment 执行任何适用于 Deployment 的指令,例如:

  • scale up / scale down
  • 回滚到前一个版本
  • 暂停(pause)Deployment,以对 Deployment 的 Pod template 执行多处更新

kubectl describe分析

  1. $ kubectl describe deployment web-nginx
  2. ....... # 省略部分输出
  3. Conditions:
  4. Type Status Reason
  5. ---- ------ ------
  6. Available True MinimumReplicasAvailable
  7. Progressing True NewReplicaSetAvailable
  • Type=Available 及 Status=True 代表您的 Deployment 具备最小可用的 Pod 数(minimum availability)。Minimum availability 由 Deployment 中的 strategy 参数决定。
  • Type=Progressing 及 Status=True 代表您的 Deployment 要么处于滚动更新的过程中,要么已经成功完成更新并且 Pod 数达到了最小可用的数量。

Deployment 中的 strategy 参数如下:

  1. strategy:
  2. rollingUpdate:
  3. maxSurge: 25% # 滚动更新过程中一次更新几个pod。
  4. maxUnavailable: 25% # 当pod不可用数为多少时,停止滚动更新。