为什么 pod 会反复重启失败或意外删除?
虚拟私有云 经典基础架构
pod 运行状况良好,但被意外除去或卡在重新启动循环中。 在某些情况下,容器会显示 CrashLoopBackOff
状态。
容器可能超过其资源限制,或者 pod 可能被更高优先级的 pod 所替换。 当 Kubernetes 容器反复启动失败时,它会进入 CrashLoopBackOff
状态,表明 pod 内存在持续重启循环。 出现这种错误通常是由于各种问题导致容器无法正常启动。 常见原因包括内存不足、资源超载、部署错误、第三方服务问题(如 DNS 错误)、依赖关系缺失或端口冲突导致的容器故障。
请参阅下列各部分:
固定容器资源限制
- 获取 pod 的名称。 如果使用了标签,那么可以包含该标签来过滤结果。
kubectl get pods --selector='app=wasliberty'
- 描述 pod,并查找重新启动计数。
kubectl describe pod
- 如果 pod 在短时间内多次重新启动,请访存其状态。
kubectl get pod <pod_name> -n <namespace> -o go-template='{{range.status.containerStatuses}}{{"Container Name: "}}{{.name}}{{"\r\nLastState: "}}{{.lastState}}{{end}}'
- 查看原因。 例如,
OOM Killed
表示内存不足,表示容器因资源限制而崩溃。 - 向集群添加容量,例如通过调整工作程序池大小来实现资源。 有关更多信息,请参阅 调整经典工作程序池的大小 或 调整 VPC 工作程序池的大小。
通过更高优先级的 Pod 修复 Pod 更换
要查看 pod 是否被更高优先级的 pod 所替换,请执行以下操作:
-
获取 pod 的名称。
kubectl get pods
-
描述 pod YAML。
kubectl get pod <pod_name> -o yaml
-
检查
priorityClassName
字段。-
如果没有
priorityClassName
字段值,说明您的 pod 具有globalDefault
优先级类。 如果集群管理员未设置globalDefault
优先级类,那么缺省值为零 (0) 或最低优先级。 具有更高优先级类的任何 pod 都可以抢占或除去您的 pod。 -
如果有
priorityClassName
字段值,请获取优先级类。kubectl get priorityclass <priority_class_name> -o yaml
-
记下
value
字段以检查 pod 的优先级。
-
-
列出集群中的现有优先级类。
kubectl get priorityclasses
-
对于每个优先级类,获取 YAML 文件,并记下
value
字段。kubectl get priorityclass <priority_class_name> -o yaml
-
将您的 pod 的优先级类值与其他优先级类值进行比较,以查看其优先级是更高还是更低。
-
对集群中的其他 pod 重复步骤 1 到 3,以检查它们使用的优先级类。 如果其他 pod 的优先级类高于您的 pod,那么除非有足够的资源供您的 pod 和具有更高优先级的每个 pod 使用,否则不会供应您的 pod。
-
请联系群集管理员,为群集增加更多容量,并确认分配了正确的优先级。