当 Kubernetes 中 Node 节点出现状态异常的情况下,节点上的 Pod 会被重新调度到其他节点上去,但是有的时候我们会发现节点 Down 掉以后,Pod 并不会立即触发重新调度,这实际上就是和 Kubelet 的状态更新机制密切相关的,Kubernetes 提供了一些参数配置来触发重新调度到嗯时间,下面我们来分析下 Kubelet 状态更新的基本流程。
- kubelet 自身会定期更新状态到 apiserver,通过参数
--node-status-update-frequency
指定上报频率,默认是 10s 上报一次。 - kube-controller-manager 会每隔
--node-monitor-period
时间去检查 kubelet 的状态,默认是 5s。 - 当 node 失联一段时间后,kubernetes 判定 node 为
notready
状态,这段时长通过--node-monitor-grace-period
参数配置,默认 40s。 - 当 node 失联一段时间后,kubernetes 判定 node 为
unhealthy
状态,这段时长通过--node-startup-grace-period
参数配置,默认 1m0s。 - 当 node 失联一段时间后,kubernetes 开始删除原 node 上的 pod,这段时长是通过
--pod-eviction-timeout
参数配置,默认 5m0s。
(1)--pod-eviction-timeout duration 默认值:5m0s
在失效的节点上删除 Pods 时为其预留的宽限期。
很多场景都需要多个控制器协同工作,比如某个节点宕机,kubelet 将会停止汇报状态到Node 对象。NodeLifecycle 控制器会发现节点状态没有按时更新,超过一段时间(可通过参数--pod-eviction-timeout 来指定)后,它将驱逐节点上的Pod。
Kubernetes 的 controller manager 将尝试每--node-monitor-period
时间周期内检查nodeStatusUpdateRetry
次。在--node-monitor-grace-period
之后,会认为节点 unhealthy,然后会在--pod-eviction-timeout
后删除 Pod。