← 中文资源

简体中文版本

Kubernetes Pod 一直 Pending — 未容忍 Taint

通过添加匹配的容忍、移除 taint,或调整节点亲和与选择器,修复不可调度的 Pod。

阅读英文原文

症状

错误“Kubernetes Pod 一直 Pending — 未容忍 Taint”指向一个明确的失效模式。下面依次给出症状、定位该原因的检查命令、根本原因、修复方案,以及证明修复有效的验证步骤。

可观察到的症状包括:

  • Pod 持续 Pending 并提示 “has taints that pod does not tolerate”
  • 所有节点都有 taint,没有 Pod 能调度
  • 一个工作负载可调度,另一个不行

诊断

先在隔离环境中复现故障,再按顺序执行以下检查,逐步缩小范围。

步骤 1

kubectl describe pod <pod> | grep -A 5 "Events"

FailedScheduling 事件会列出候选节点上的 taint 与缺失的容忍。

步骤 2

kubectl get nodes -o custom-columns=NAME:.metadata.name,TAINTS:.spec.taints

查看 taint 即可确定应添加哪个容忍。

常见诱因(按出现频率排序):

  • 目标节点带有 Pod 未容忍的 taint(如 dedicated=gpu:NoSchedule)
  • nodeSelector 或亲和限制了不存在的节点
  • 控制平面节点带 taint,而工作负载期望在其上运行

根因

taint 会排斥未声明匹配容忍的 Pod。对于 NoSchedule,调度器拒绝把不容忍的 Pod 放到带 taint 的节点;若无未打 taint 的合适节点,Pod 便一直 Pending。

修复

添加与节点 taint 匹配的容忍(效果要正确),或在不再需要时移除 taint,并让 nodeSelector 与亲和和既有节点标签一致。

注意:容忍 taint 并不保证被放到该节点;若需专用放置,还须用亲和规则选中它。

spec:
  tolerations:
    - key: dedicated
      operator: Equal
      value: gpu
      effect: NoSchedule
  affinity:
    nodeAffinity:   # also select the dedicated nodes
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
              - key: dedicated
                operator: In
                values: ["gpu"]

验证

确认 Pod 调度到节点并进入 Running;验证不再出现 FailedScheduling 事件。

修复后补充一条回归测试,复现原始症状,防止问题再次出现。

这类故障通常是环境问题而非纯逻辑错误,因此在缺陷记录中应写明完整命令、环境变量与工作目录。请用最小的脚本复现,待最小用例清楚后再扩大范围。为这类故障准备一份简短的排查清单,能显著减少下次排障时间。