节点失联之后,Pod 什么时候被驱逐?默认容忍 300 秒是从哪里开始算的?Deployment 的替换 Pod 什么时候出现?旧 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 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 被标记删除但旧节点上的容器可能还在跑。