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状态。以下是一个查询示例:
$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
web-nginx 2/2 2 2 36m
$ kubectl rollout status deployment.v1.apps/web-nginx
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分钟即可),输出结果如下所示:
$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
web-nginx 2/2 2 2 40m
$ kubectl patch deployment.v1.apps/web-nginx -p '{"spec":{"progressDeadlineSeconds":900}}'
deployment.apps/web-nginx patched
如果上面指定的900s(15分钟)到达之后,replicaset还没到达complete状态,deployment controoler
将在deployment
的.status.conditions
字段添加如下 deploymentCondition
Type=Progressing
Status=False
Reason=ProgressDeadlineExceeded
注:
- 除了添加一个
Reason=ProgressDeadlineExceeded
的DeploymentCondition
到.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分析
$ kubectl describe deployment web-nginx
....... # 省略部分输出
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
- Type=Available 及 Status=True 代表您的 Deployment 具备最小可用的 Pod 数(minimum availability)。Minimum availability 由 Deployment 中的 strategy 参数决定。
- Type=Progressing 及 Status=True 代表您的 Deployment 要么处于滚动更新的过程中,要么已经成功完成更新并且 Pod 数达到了最小可用的数量。
Deployment 中的 strategy 参数如下:
strategy:
rollingUpdate:
maxSurge: 25% # 滚动更新过程中一次更新几个pod。
maxUnavailable: 25% # 当pod不可用数为多少时,停止滚动更新。