2. Node生命周期与状态:Node状态机、节点健康检查机制、NodeCondition详解
在Kubernetes集群中,Node(工作节点)是承载Pod运行的基础单元。理解Node的生命周期与状态转换,是诊断Pod调度异常、配置污点容忍策略的前提。本章深入剖析Node状态机、健康检查机制以及NodeCondition的详细含义。
2.1 Node状态机:从注册到不可用
Node的生命周期并非静态,而是经历一系列状态转换。Kubernetes通过Node Controller管理这一过程,核心状态机包含以下阶段:
- Pending(待定):节点刚被注册到集群,但尚未就绪。kubelet尚未完成首次心跳上报。
- Running(运行中):节点通过健康检查,状态为
Ready=True,可正常调度Pod。 - NotReady(未就绪):节点健康检查失败(如kubelet停止心跳、网络分区),状态为
Ready=False。 - Unknown(未知):Node Controller超过一定时间(默认40秒)未收到节点心跳,状态为
Ready=Unknown。 - DiskPressure/MemoryPressure/PIDPressure:节点资源紧张,触发对应Condition为
True,影响Pod驱逐与调度。 - Terminating(终止中):节点被删除或隔离,正在驱逐其上所有Pod。
关键时间参数(由kube-controller-manager控制):
--node-monitor-period:节点监控周期,默认5秒。--node-monitor-grace-period:节点失联宽限期,默认40秒。--pod-eviction-timeout:Pod驱逐超时,默认5分钟。
2.2 节点健康检查机制:心跳与监控
Kubernetes通过Node Controller和kubelet协同工作,实现节点健康检查。核心机制如下:
| 组件 | 职责 | 关键参数 |
|---|---|---|
| kubelet | 定期向API Server上报节点状态(心跳),更新.status.conditions。 |
--node-status-update-frequency(默认10秒) |
| Node Controller | 监控节点心跳,检测失联节点,触发Pod驱逐。 | --node-monitor-grace-period(默认40秒)--pod-eviction-timeout(默认5分钟) |
| kube-controller-manager | 运行Node Controller,管理节点状态机。 | 全局配置参数 |
健康检查流程:
1. kubelet每10秒更新
2. Node Controller每5秒检查所有节点的心跳时间戳。
3. 若超过40秒未收到心跳,将
4. 若超过5分钟仍为
1. kubelet每10秒更新
NodeStatus,包含所有Condition。2. Node Controller每5秒检查所有节点的心跳时间戳。
3. 若超过40秒未收到心跳,将
Ready Condition设为Unknown。4. 若超过5分钟仍为
Unknown,Node Controller开始驱逐该节点上的Pod。
2.3 NodeCondition详解:状态信号与调度影响
NodeCondition是节点健康状态的详细信号,存储在Node.Status.Conditions数组中。每个Condition包含Type、Status(True/False/Unknown)、LastHeartbeatTime、LastTransitionTime、Reason和Message字段。
2.3.1 核心Condition类型
| Condition Type | 含义 | True的影响 | 常见原因 |
|---|---|---|---|
| Ready | 节点是否就绪,能否接受Pod调度。 | 正常调度 | kubelet运行正常 |
| DiskPressure | 节点磁盘空间不足。 | 驱逐低优先级Pod,禁止新Pod调度 | 日志堆积、镜像过多 |
| MemoryPressure | 节点内存紧张。 | 驱逐BestEffort Pod,降低QoS | 内存泄漏、负载过高 |
| PIDPressure | 节点PID资源耗尽。 | 禁止新进程创建,影响Pod启动 | 进程数超限、僵尸进程 |
| NetworkUnavailable | 节点网络配置异常。 | Pod网络不通,无法正常通信 | CNI插件故障、网卡异常 |
2.3.2 Condition状态转换与Pod调度关系
调度器(kube-scheduler)在预选阶段会检查节点的Ready Condition。若Ready=False或Ready=Unknown,调度器默认不会将Pod调度到该节点。但通过污点(Taint)和容忍(Toleration)机制,可以覆盖这一默认行为。
注意:即使
Ready=True,如果节点存在DiskPressure=True或MemoryPressure=True,调度器也会根据资源压力调整调度策略。例如,MemoryPressure=True时,调度器会拒绝调度新的BestEffort Pod。
2.4 实战:查看节点状态与Condition
使用kubectl命令可以快速查看节点状态和详细Condition:
# 查看所有节点状态
kubectl get nodes
# 查看节点详细状态,包括所有Condition
kubectl describe node <node-name>
# 使用JSONPath提取特定Condition
kubectl get node <node-name> -o jsonpath='{.status.conditions[?(@.type=="Ready")].status}'
输出示例(kubectl describe node):
Conditions:
Type Status LastHeartbeatTime LastTransitionTime Reason Message
---- ------ ----------------- ------------------ ------ -------
NetworkUnavailable False Mon, 01 Jan 2024 10:00:00 +0000 Mon, 01 Jan 2024 10:00:00 +0000 CalicoIsUp Calico is running on this node
MemoryPressure False Mon, 01 Jan 2024 10:00:00 +0000 Mon, 01 Jan 2024 09:55:00 +0000 KubeletHasSufficientMemory kubelet has sufficient memory available
DiskPressure False Mon, 01 Jan 2024 10:00:00 +0000 Mon, 01 Jan 2024 09:55:00 +0000 KubeletHasNoDiskPressure kubelet has no disk pressure
PIDPressure False Mon, 01 Jan 2024 10:00:00 +0000 Mon, 01 Jan 2024 09:55:00 +0000 KubeletHasSufficientPID kubelet has sufficient PID available
Ready True Mon, 01 Jan 2024 10:00:00 +0000 Mon, 01 Jan 2024 09:55:00 +0000 KubeletReady kubelet is posting ready status
2.5 节点状态异常处理策略
当节点状态异常时,需要根据Condition类型采取针对性措施:
- Ready=False/Unknown:检查kubelet服务状态、网络连通性、API Server负载。尝试重启kubelet或修复网络。
- DiskPressure=True:清理磁盘空间(删除未使用的镜像、日志、临时文件)。调整
--eviction-hard阈值。 - MemoryPressure=True:排查内存泄漏,调整Pod资源限制,增加节点内存。
- PIDPressure=True:检查进程数,调整
kernel.pid_max,排查僵尸进程。 - NetworkUnavailable=True:检查CNI插件(Calico/Flannel)状态,重启网络组件。
最佳实践:配置PodDisruptionBudget(PDB)和污点容忍策略,在节点维护或故障时,确保关键业务Pod不被意外驱逐。同时,设置节点自动修复机制(如Cluster Autoscaler、Node Problem Detector),提升集群自愈能力。