K8s节点资源不足调度故障排查
一、问题现象
在Kubernetes集群中,Pod可能长时间处于Pending状态,或调度失败并提示节点资源不足(如Insufficient cpu、Insufficient memory)。部分节点即使拥有空闲资源,调度器仍无法将Pod分配到目标节点,影响业务部署效率。
二、常见原因
- 节点真实资源已满:节点上运行Pod的总资源请求(Requests)超过节点容量。
- 资源预留被占用:系统组件(kubelet、操作系统守护进程)预留资源未正确配置或超量分配。
- 节点污点与容忍度不匹配:节点设置了污点(Taints),但Pod未设置对应容忍度(Tolerations)。
- 调度策略限制:节点亲和性、Pod反亲和性或拓扑约束导致调度器跳过该节点。
- 节点状态异常:节点处于NotReady、OutOfDisk等不可调度状态。
三、排查步骤
1. 检查节点状态与条件
使用命令kubectl get nodes查看节点是否Ready,再用kubectl describe node 查看Conditions部分,重点检查MemoryPressure、DiskPressure、PIDPressure、Ready状态是否正常。
2. 查看Pod事件与调度日志
执行kubectl describe pod ,在Events中寻找调度失败原因。常见提示包括“0/1 nodes are available: 1 Insufficient cpu”、“0/1 nodes have match node selector”等。
3. 分析节点资源分配情况
使用kubectl top node查看当前资源使用量,或通过kubectl describe node查看Allocated resources(Requests + Limits)与Capacity的对比。注意区分Requests和Limits:Pod的Requests保证资源下限,Limits是上限。
4. 检查节点污点与Pod容忍度
运行kubectl describe node | grep -A10 Taints查看节点污点,再确认目标Pod是否包含对应容忍度。若无容忍度,调度器将忽略该节点。
5. 验证调度策略配置
检查Pod的亲和性、反亲和性以及拓扑分散约束是否过于严格。可临时创建一个无特定调度策略的测试Pod,观察能否调度到目标节点以隔离问题。
四、常见解决方案
- 扩容节点或清理冗余Pod:删除不必要的工作负载,或增加节点资源以降低资源压力。
- 调整资源请求与限制:优化Pod的Requests值,避免过度预留;开启集群自动伸缩(Cluster Autoscaler)按需扩缩节点。
- 管理污点与容忍度:为专用节点添加污点,并为关键Pod添加对应容忍度,确保调度优先级。
- 修复节点状态:若节点因磁盘满、内存压力等原因异常,需清理宿主机资源或重启kubelet。
- 检查调度器配置:确认调度器插件是否启用(如NodeResourcesFit、TaintToleration),并检查策略配置文件(如schedulerPolicy)是否正确。
通过系统性地排查上述方面,通常可以准确定位K8s节点资源不足引起的调度故障,并采取针对性措施恢复集群调度正常。