Kubernetes Pod创建失败排查

Kubernetes Pod创建失败终极排查指南(生产环境实战手册)

作为处理过上千次Pod创建故障的运维老兵,我整理了生产环境中Pod创建失败的9大核心原因和18种解决方案,附带真实故障场景和诊断命令。建议收藏备用!


一、快速定位问题方向

查看Pod状态特征:

kubectl get pod <pod-name> -o wide

典型状态解读:

  • Pending → 调度问题(占70%)
  • ContainerCreating → 容器运行时问题
  • ImagePullBackOff → 镜像拉取失败
  • CreateContainerError → 容器配置错误

查看事件日志(黄金信息来源):

kubectl describe pod <pod-name> | grep -A 30 'Events'

关键事件示例:

Events:
  Type     Reason            Age   From               Message
  ----     ------            ----  ----               -------
  Warning  FailedScheduling  2m    default-scheduler  0/5 nodes are available: 3 node(s) had taint {node-role.kubernetes.io/master: }, 2 Insufficient memory.
  Warning  FailedCreate      1m    kubelet            Error creating: pods "myapp" is forbidden: exceeded quota

二、高频故障场景与解决方案

场景1:节点调度失败(Pending状态)

kubectl describe pod | grep "FailedScheduling" -A 10

常见原因:

  • 节点资源不足 → 调整requests/limits
  • 污点(Taint)不匹配 → 添加toleration
  • 节点选择器错误 → 检查nodeSelector

场景2:镜像拉取失败

kubectl describe pod | grep -i "image"

典型错误:

  • ErrImagePull → 镜像地址错误/权限不足
  • ImagePullBackOff → 网络超时/镜像过大
  • ImageInspectError → 镜像损坏

场景3:存储卷挂载失败

kubectl describe pod | grep -A 10 "Volumes"

排查要点:

  • PVC是否绑定成功(kubectl get pvc)
  • StorageClass是否配置正确
  • 挂载路径是否冲突

三、生产环境专用排查工具包

1. 调度模拟测试

# 验证Pod能否被调度
kubectl apply -f pod.yaml --dry-run=server
kubectl get pods --field-selector=spec.nodeName= -A  # 查看未调度Pod

2. 节点资源分析

kubectl describe node | grep -A 10 "Allocatable"

重点关注:

  • cpu:剩余可分配CPU
  • memory:剩余内存
  • ephemeral-storage:本地存储空间

3. 高级事件过滤

# 实时监控事件(需安装watch)
watch -n 1 'kubectl get events --sort-by=.metadata.creationTimestamp'

四、高级故障场景解决方案

案例1:资源配额限制

kubectl describe quota  # 查看资源配额

解决方法:

# 调整ResourceQuota
apiVersion: v1
kind: ResourceQuota
metadata:
  name: pod-quota
spec:
  hard:
    pods: "50"
    requests.cpu: "20"
    requests.memory: 40Gi

案例2:Pod安全策略拦截

kubectl get psp  # 查看安全策略

典型错误:

  • 容器以root运行
  • 挂载敏感目录
  • 缺少必要权限

案例3:优先级抢占失败

# 配置优先级类
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority
value: 1000000
globalDefault: false

五、生产环境最佳实践

1. Pod创建Checklist

2. 调试模板

apiVersion: v1
kind: Pod
metadata:
  name: debug-pod
spec:
  containers:
  - name: debugger
    image: nicolaka/netshoot
    command: ["sleep", "3600"]
    resources:
      requests:
        memory: "64Mi"
        cpu: "50m"

3. 监控告警配置

# 关键监控指标
kube_pod_status_phase{phase="Pending"} > 0
kube_pod_container_status_waiting_reason{reason="ImagePullBackOff"}

六、终极排错流程图

graph TD A[Pod创建失败] --> B{查看Pod状态} B --> |Pending| C[检查调度事件] B --> |ContainerCreating| D[检查容器运行时] B --> |其他状态| E[查看具体错误] C --> F[资源不足?] C --> G[污点/标签问题?] D --> H[镜像拉取失败?] D --> I[存储卷挂载失败?] F --> J[调整requests/limits] G --> K[添加toleration] H --> L[检查镜像地址/密钥]

避坑箴言:

  1. 所有生产环境Pod必须设置资源requests/limits
  2. 使用kubectl diff验证配置变更
  3. 关键业务配置PDB(PodDisruptionBudget)
  4. 定期清理已完成Job的Pod(避免资源碎片)

遇到具体问题欢迎留言,我会根据实际案例持续补充解决方案!建议搭配本系列其他排错指南共同使用。

posted on 2025-03-19 17:31  Leo_Yide  阅读(299)  评论(0)    收藏  举报