IBM Cloud Docs
为什么 pod 会反复重启失败或意外删除?

为什么 pod 会反复重启失败或意外删除?

虚拟私有云 经典基础架构

pod 运行状况良好,但被意外除去或卡在重新启动循环中。 在某些情况下,容器会显示 CrashLoopBackOff 状态。

容器可能超过其资源限制,或者 pod 可能被更高优先级的 pod 所替换。 当 Kubernetes 容器反复启动失败时,它会进入 CrashLoopBackOff 状态,表明 pod 内存在持续重启循环。 出现这种错误通常是由于各种问题导致容器无法正常启动。 常见原因包括内存不足、资源超载、部署错误、第三方服务问题(如 DNS 错误)、依赖关系缺失或端口冲突导致的容器故障。

请参阅下列各部分:

固定容器资源限制

  1. 获取 pod 的名称。 如果使用了标签,那么可以包含该标签来过滤结果。
    kubectl get pods --selector='app=wasliberty'
    
  2. 描述 pod,并查找重新启动计数
    kubectl describe pod
    
  3. 如果 pod 在短时间内多次重新启动,请访存其状态。
    kubectl get pod <pod_name> -n <namespace> -o go-template='{{range.status.containerStatuses}}{{"Container Name: "}}{{.name}}{{"\r\nLastState: "}}{{.lastState}}{{end}}'
    
  4. 查看原因。 例如,OOM Killed 表示内存不足,表示容器因资源限制而崩溃。
  5. 向集群添加容量,例如通过调整工作程序池大小来实现资源。 有关更多信息,请参阅 调整经典工作程序池的大小调整 VPC 工作程序池的大小

通过更高优先级的 Pod 修复 Pod 更换

要查看 pod 是否被更高优先级的 pod 所替换,请执行以下操作:

  1. 获取 pod 的名称。

    kubectl get pods
    
  2. 描述 pod YAML。

    kubectl get pod <pod_name> -o yaml
    
  3. 检查 priorityClassName 字段。

    1. 如果没有 priorityClassName 字段值,说明您的 pod 具有 globalDefault 优先级类。 如果集群管理员未设置 globalDefault 优先级类,那么缺省值为零 (0) 或最低优先级。 具有更高优先级类的任何 pod 都可以抢占或除去您的 pod。

    2. 如果有 priorityClassName 字段值,请获取优先级类。

      kubectl get priorityclass <priority_class_name> -o yaml
      
    3. 记下 value 字段以检查 pod 的优先级。

  4. 列出集群中的现有优先级类。

    kubectl get priorityclasses
    
  5. 对于每个优先级类,获取 YAML 文件,并记下 value 字段。

    kubectl get priorityclass <priority_class_name> -o yaml
    
  6. 将您的 pod 的优先级类值与其他优先级类值进行比较,以查看其优先级是更高还是更低。

  7. 对集群中的其他 pod 重复步骤 1 到 3,以检查它们使用的优先级类。 如果其他 pod 的优先级类高于您的 pod,那么除非有足够的资源供您的 pod 和具有更高优先级的每个 pod 使用,否则不会供应您的 pod。

  8. 请联系群集管理员,为群集增加更多容量,并确认分配了正确的优先级。