全部文档
当前文档

暂无内容

如果没有找到您期望的内容,请尝试其他搜索词

文档中心

Pod异常排查

最近更新时间:2026-01-22 14:45:24

本文主要介绍Pod异常问题排查的诊断流程、排查方法、常见问题及对应的解决方案。

现象描述

在K8s中创建Pod后,控制台查看Pod长时间在启动中。

通过kubectl get pod查看pod状态,可能存在如下状态。

状态

中文释义

核心说明

常见原因 & 排查方向

Pending

待调度 / 创建中

Pod 已被 Kubernetes 接受,但容器尚未完全启动(可能是调度未完成、镜像拉取中、初始化容器未执行完)

原因:

1. 节点资源不足(CPU / 内存不满足 requests);

2. 镜像拉取失败(镜像地址错误、私有镜像无拉取密钥、网络不通);

3. 调度策略限制(节点亲和性、Taints/Tolerations 不匹配);

4. 初始化容器(initContainer)执行失败;排查:kubectl describe pod <pod-name> 查看 Events 字段。

诊断流程

根因定位

#查看 pod 事件,提取关键错误(核心命令)
kubectl describe pod <pod-name> | grep -A 20 "Events:"

从Events 中识别常见错误类型,错误类型以及对应解决方案如下:

原因一:节点资源不足

错误界面
临时方案

调整Pod的resources.requests(降低资源需求)

长期方案

扩容节点资源,扩容操作详见:调整配置,或者删除节点上低优先级Pod释放资源。

原因二:镜像拉取失败(镜像地址错误、私有镜像无拉取密钥、网络不通)

错误界面
解决方案
  1. 核对镜像地址的正确性(此处以金山云容器镜像服务地址为例):检查容器镜像服务中使用镜像是否存在,标签是否正确,如有问题请填写正确的镜像地址及名称。

  2. 修正Pod配置中的镜像地址。

# 原错误配置
spec:
  containers:
  - name: nginx
    image: nginx:latest  # 错误:标签不存在

# 修正后配置
spec:
  containers:
  - name: nginx
    image: hub.kce.ksyun.com/you_namespace/名称:版本  

原因三:节点污点(Taint)导致的调度问题‌

错误界面
说明

特性

节点选择器(NodeSelector)

污点与容忍(Taints and Tolerations)

作用方向

Pod主动选择节点(通过标签匹配)

节点主动排斥Pod(通过污点)+ Pod主动容忍(通过容忍配置)

实现方式

Pod通过nodeSelector字段指定节点标签,仅能调度到匹配标签的节点

节点通过kubectl taint添加污点,Pod通过tolerations字段声明容忍特定污点

匹配逻辑

完全匹配(Pod标签必须与节点标签完全一致)

灵活匹配(支持Equal精确匹配、Exists存在性匹配)

调度控制

仅影响新Pod调度,不影响已运行Pod

可影响新Pod调度(NoSchedule)、已运行Pod(NoExecute驱逐)

优先级

优先级较低,仅作为基础调度手段

优先级较高,可覆盖节点选择器的调度结果

# 首先通过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抢占对调度没有帮助,接下来针对性排查。
排查节点选择器(nodeSelector)是否匹配(如日志输出:1 node(s) didn't match Pod's node affinity/selector)
  1. 排查节点标签

kubectl get pod <pod-name> -o yaml | grep -A 5 "nodeSelector"
# 示例输出(pod要求节点必须有env:prod标签)
nodeSelector:
  env: prod
  1. 查看集群所有节点的标签

kubectl get nodes --show-labels
# 或过滤特定标签
kubectl get nodes -L env=prod  # 查看是否有节点包含该标签
  1. 修复方法

  • 若标签配置错误:修改 Pod 的 nodeSelector 为节点实际存在的标签;

  • 若节点无标签:给节点添加对应标签:

kubectl label node <node-name> env=prod

控制台添加标签操作如下图:

排查「污点(Taints)」与「容忍(Tolerations)」是否匹配(如日志输出:1 node(s) had untolerated taint {node.kubernetes. id: not-ready}.)
  1. 查看节点的污点

kubectl describe node <node-name> | grep -A 5 "Taints"
  1. 查看Pod的容忍配置

kubectl get pod <pod-name> -o yaml | grep -A 10 "tolerations"
# 若输出为空,说明Pod未配置任何容忍
  1. 修复方法

# 给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-  # 后缀 "-" 表示删除污点

控制台移除污点操作如下图:

文档导读
纯净模式常规模式

纯净模式

点击可全屏预览文档内容
文档反馈