Conditions 是什么
节点状态里最醒目的是 Ready,但真正描述节点资源健康的是五个 Conditions:Ready、MemoryPressure、DiskPressure、PIDPressure、NetworkUnavailable。压力类条件为 True 时,节点已经进入资源紧张状态,kubelet 会开始驱逐 Pod 并停止接受新 Pod;网络条件为 True 通常意味着 CNI 没就绪。只看 Ready 会错过整条资源链的告警前兆。
节点 Condition 解读
| Condition | 含义 | 常见诱因 |
|---|---|---|
| Ready | 节点健康、可接受 Pod | kubelet 失联、容器运行时异常、节点磁盘只读 |
| MemoryPressure | 节点可用内存低于阈值 | Pod 超卖导致的内存争抢、内存泄漏、页缓存占用 |
| DiskPressure | nodefs 或 imagefs 可用空间或 inode 不足 | 日志与镜像堆积、emptyDir 写满、容器写入层膨胀 |
| PIDPressure | 可分配 PID 接近上限 | 进程泄漏、fork 风暴、容器内大量短进程 |
| NetworkUnavailable | 节点网络未就绪 | CNI 组件未运行、网卡或路由异常 |
典型使用场景
- 日常巡检:把五类条件一起做成看板,压力条件往往先于业务故障出现
- 告警定位:Pod 被驱逐时先确认节点是哪个条件为 True,再决定清理哪类资源
- 发布前检查:新节点加入后确认 NetworkUnavailable 已转 False,否则新副本落地即失败
- 容量评估:MemoryPressure 反复出现说明节点长期超卖,需要调整 requests 或扩充资源
- 故障复盘:事件保留期内导出节点状态变化,还原压力出现与 Pod 驱逐的时间关系
查看方式
查看方式
kubectl describe node node1 | sed -n '/Conditions:/,/Addresses:/p' # 五类条件与原因
kubectl get nodes -o custom-columns='NAME:.metadata.name,READY:.status.conditions[?(@.type=="Ready")].status'
kubectl get events -A --field-selector reason=NodeNotReady --sort-by=.lastTimestamp | tail -5
journalctl -u kubelet --no-pager | grep -i -E 'pressure|evict' | tail -20 # 节点侧原始记录字段读法
| 字段 | 含义 | 异常形态 |
|---|---|---|
| Type | 条件名称 | 五类条件缺一说明版本或组件上报不全 |
| Status | True/False/Unknown | Unkown 表示状态上报中断,需看 kubelet |
| Reason | 状态原因的短标识 | 常见 KubeletHasInsufficientMemory 等 |
| Message | 原因的可读说明 | 通常包含具体阈值与当前值 |
| LastTransitionTime | 最后一次变化时间 | 频繁翻转说明资源在阈值附近抖动 |
DiskPressure 需要区分是哪类文件系统触发:nodefs 是节点主文件系统,imagefs 是镜像与容器可写层所在文件系统。两者阈值与清理对象不同,先确认触发对象再清理,否则清掉日志但镜像盘依旧满。
压力类条件会在 Ready 变为 NotReady 之前先出现。把 MemoryPressure 之类的条件纳入告警,比等节点直接 NotReady 再处理更能保住业务;同时注意 Status 为 Unknown 与 False 的含义不同,前者代表无法判断。