最近更新时间:2026-01-22 14:45:24
本文主要介绍Pod异常问题排查的诊断流程、排查方法、常见问题及对应的解决方案。
在K8s中创建Pod后,控制台查看Pod长时间在启动中。
通过kubectl get pod查看pod状态,可能存在如下状态。
状态 | 中文释义 | 核心说明 | 常见原因 & 排查方向 |
| 待调度 / 创建中 | Pod 已被 Kubernetes 接受,但容器尚未完全启动(可能是调度未完成、镜像拉取中、初始化容器未执行完) | 原因: 1. 节点资源不足(CPU / 内存不满足 2. 镜像拉取失败(镜像地址错误、私有镜像无拉取密钥、网络不通); 3. 调度策略限制(节点亲和性、Taints/Tolerations 不匹配); 4. 初始化容器(initContainer)执行失败;排查: |
#查看 pod 事件,提取关键错误(核心命令)
kubectl describe pod <pod-name> | grep -A 20 "Events:"从Events 中识别常见错误类型,错误类型以及对应解决方案如下:
调整Pod的resources.requests(降低资源需求)
扩容节点资源,扩容操作详见:调整配置,或者删除节点上低优先级Pod释放资源。
核对镜像地址的正确性(此处以金山云容器镜像服务地址为例):检查容器镜像服务中使用镜像是否存在,标签是否正确,如有问题请填写正确的镜像地址及名称。
修正Pod配置中的镜像地址。
# 原错误配置
spec:
containers:
- name: nginx
image: nginx:latest # 错误:标签不存在
# 修正后配置
spec:
containers:
- name: nginx
image: hub.kce.ksyun.com/you_namespace/名称:版本 特性 | 节点选择器(NodeSelector) | 污点与容忍(Taints and Tolerations) |
作用方向 | Pod主动选择节点(通过标签匹配) | 节点主动排斥Pod(通过污点)+ Pod主动容忍(通过容忍配置) |
实现方式 | Pod通过 | 节点通过 |
匹配逻辑 | 完全匹配(Pod标签必须与节点标签完全一致) | 灵活匹配(支持 |
调度控制 | 仅影响新Pod调度,不影响已运行Pod | 可影响新Pod调度( |
优先级 | 优先级较低,仅作为基础调度手段 | 优先级较高,可覆盖节点选择器的调度结果 |
# 首先通过kubectl describe 提取调度器(kube-scheduler)的错误日志
kubectl describe pod <pod-name> | grep -A 10 "FailedScheduling"
# 示例错误输出(核心信息)
0/1 nodes are available: 1 node(s) had untolerated taint {node.kubernetes.id: not-ready}. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling..
# 根据上述日志直接指出:1个节点有不可容忍的污染{node.kubernetes。id:没有准备好}。preemption: 0/1节点可用:1抢占对调度没有帮助,接下来针对性排查。
0/1 nodes are available: 1 node(s) didn't match Pod's node affinity/selector. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling..
#根据上述日志直接指出:1个节点不匹配Pod的节点亲和/选择器。preemption: 0/1节点可用:1抢占对调度没有帮助,接下来针对性排查。排查节点标签
kubectl get pod <pod-name> -o yaml | grep -A 5 "nodeSelector"
# 示例输出(pod要求节点必须有env:prod标签)
nodeSelector:
env: prod查看集群所有节点的标签
kubectl get nodes --show-labels
# 或过滤特定标签
kubectl get nodes -L env=prod # 查看是否有节点包含该标签修复方法
若标签配置错误:修改 Pod 的 nodeSelector 为节点实际存在的标签;
若节点无标签:给节点添加对应标签:
kubectl label node <node-name> env=prod控制台添加标签操作如下图:
查看节点的污点
kubectl describe node <node-name> | grep -A 5 "Taints"查看Pod的容忍配置
kubectl get pod <pod-name> -o yaml | grep -A 10 "tolerations"
# 若输出为空,说明Pod未配置任何容忍修复方法
# 给Pod添加对应污点的容忍
spec:
tolerations:
- key: "node.kubernetes.id"
operator: "Exists" # 匹配任意值
effect: "NoSchedule" # 匹配污点的 effect(NoSchedule/NoExecute/PreferNoSchedule)# 若无需调度到带污点的节点:移除节点的非必要污点(不推荐修改master节点)
kubectl taint node <node-name> node.kubernetes.id=not-ready:NoSchedule- # 后缀 "-" 表示删除污点控制台移除污点操作如下图:
纯净模式
