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:剩余可分配CPUmemory:剩余内存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[检查镜像地址/密钥]
避坑箴言:
- 所有生产环境Pod必须设置资源requests/limits
- 使用kubectl diff验证配置变更
- 关键业务配置PDB(PodDisruptionBudget)
- 定期清理已完成Job的Pod(避免资源碎片)
遇到具体问题欢迎留言,我会根据实际案例持续补充解决方案!建议搭配本系列其他排错指南共同使用。
浙公网安备 33010602011771号