bigywater.tech
Kubernetes · 82

节点 NotReady 之后:污点与驱逐的时间线

节点失联之后,Pod 什么时候被驱逐?默认容忍 300 秒是从哪里开始算的?Deployment 的替换 Pod 什么时候出现?旧 Pod 去哪了?这篇在真集群里停掉一个节点的 kubelet,把整个时间线按秒记下来。

+52 秒
停掉 kubelet 后节点变成 Unknown 并打上污点(多次实测 44~52 秒)
+30 秒
从污点出现到容忍 30 秒的 Pod 被标记删除
Terminating
旧 Pod 在节点上没有 kubelet 时一直停在这个状态

时间线

实测 · 本机执行输出
  +   52 秒  Ready=Unknown
  +   52 秒  taint unreachable:NoSchedule
  +   52 秒  taint unreachable:NoExecute
  +   82 秒  dep-85855 被标记删除
  +   82 秒  p-30s 被标记删除
  +   83 秒  dep 的替换 Pod 在 worker 上 Running
  kubectl get pods(+110 秒):
    NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
    dep-85855c77cf-86brs 1/1 Running 0 29s 10.244.1.214 kx-main-worker <none> <none>
    dep-85855c77cf-h8hdw 1/1 Terminating 0 114s 10.244.2.238 kx-main-worker2 <none> <none>
    p-30s 1/1 Terminating 0 114s 10.244.2.236 kx-main-worker2 <none> <none>
    p-default 1/1 Running 0 114s 10.244.2.235 kx-main-worker2 <none> <none>
    p-forever 1/1 Running 0 114s 10.244.2.237 kx-main-worker2 <none> <none>

worker2 上放了四类 Pod:p-default(没写容忍,准入自动加了 not-ready 和 unreachable 各 300 秒)、p-30s(tolerationSeconds=30)、p-forever(无限容忍)和 Deployment dep 的 Pod(容忍 30 秒)。停掉 kubelet:+52 秒节点 Ready=Unknown,同时出现 unreachable 的 NoSchedule 和 NoExecute 污点;+82 秒(正好 30 秒后)p-30s 和 dep 的 Pod 被标记删除;+83 秒 Deployment 的替换 Pod 已经在 worker 上 Running。+110 秒时被驱逐的两个 Pod 显示 Terminating——节点上没有 kubelet 去真正终止它们;p-default 和 p-forever 仍是 Running。

kubelet 回来之后

实测 · 本机执行输出
  重新启动 kubelet 32 秒后:污点 已清除;Pod 状态 {'dep-85855': 'Running', 'p-default': 'Running', 'p-forever': 'Running'}
  p-default 还在吗:True;p-forever 还在吗:True(它们没到驱逐时间,kubelet 回来后重新报告状态)

重新启动 kubelet,32 秒后:污点已清除,p-30s 被清理,dep 只剩 1 个 Running 的 Pod,p-default 和 p-forever 一直没被动过——它们没到驱逐时间(默认 300 秒、无限容忍)。所以默认配置下节点短暂失联(五分钟内)不会驱逐 Pod;要更快迁移,就给 Pod 写更短的 tolerationSeconds。有状态应用要小心:Pod 被标记删除但旧节点上的容器可能还在跑。

分步演示

失联与驱逐
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / kind(Docker 里的单节点或多节点真实集群,节点是 Docker Desktop 虚拟机里的容器)/ kubectl;用空的 kubeconfig 之外的独立 kubeconfig,不碰用户自己的集群;计时用 date +%s%N / kubectl 事件时间戳,数字每次运行会有小幅抖动。三节点 kind 集群 kx-main(Kubernetes v1.37.0),在 worker2 上 systemctl stop kubelet 模拟失联(节点上的容器仍在运行,只是没有 kubelet);时间线每秒轮询节点与 Pod 状态,单次测量,失联到 Unknown 的时间在多次运行里是 44~52 秒;每种情形各一次
    • 没有验证:真正的节点宕机(网络分区时旧节点上的容器仍在写数据,这里的容器还在运行);Pod 优雅期较长时的终止顺序;StatefulSet 的行为(不会自动替换,需要强制删除);--pod-eviction-timeout 等控制器参数;Taint-based eviction 的速率限制(zone 不健康时降速);NodeOutOfServiceVolumeDetach 之类的非优雅关机处理
    京ICP备2026067502号-1京公网安备11010502063487号