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分钟。
Node状态机转换图 Node 状态机转换图 Pending Running NotReady Unknown Terminating 说明:实线为正向转换,虚线为恢复转换。Terminating 可由 NotReady 或管理员主动触发。

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秒更新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。
NodeCondition与调度决策关系图 NodeCondition 与调度决策关系图 kube-scheduler Ready=True 且无资源压力 Ready=False 或 Unknown DiskPressure 或 MemoryPressure 允许调度 禁止调度 限制调度 说明:限制调度指仅允许高优先级或容忍对应污点的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),提升集群自愈能力。