Kubernetes 节点磁盘压力过大怎么配置驱逐阈值

文章导读
遇到节点磁盘压力过大,最稳妥的方式是通过 Kubelet 配置文件调整驱逐阈值,而不是依赖临时清理文件,这适合集群磁盘规划与实际业务用量不匹配的场景。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

遇到节点磁盘压力过大,最稳妥的方式是通过 Kubelet 配置文件调整驱逐阈值,而不是依赖临时清理文件,这适合集群磁盘规划与实际业务用量不匹配的场景。

先说结论:调整驱逐阈值属于集群底层配置,建议在确认磁盘压力非异常泄漏导致后,通过 KubeletConfiguration 统一修改,避免直接修改启动参数导致配置丢失。

  • 适合:业务正常增长导致磁盘水位长期偏高,且无法立即扩容存储的场景
  • 先准备:备份当前 Kubelet 配置,确认节点可维护窗口,准备回滚方案
  • 验收:修改后观察节点状态是否恢复,确认没有频繁驱逐关键业务 Pod

命令速用版

先确认节点当前的磁盘压力状态和驱逐配置位置,不同安装方式路径不同。

# 查看节点状态,确认是否有 DiskPressure 条件
kubectl describe node <node-name> | grep -A 5 Conditions

# 查看 Kubelet 启动参数或配置文件路径(常见于 /var/lib/kubelet/config.yaml)
ps -ef | grep kubelet

# 重启 Kubelet 使配置生效(修改配置后执行)
systemctl daemon-reload && systemctl restart kubelet

为什么会这样

Kubelet 会持续监控节点的资源使用情况,当磁盘可用空间低于设定的阈值时,为了保障节点不彻底宕机,它会主动驱逐部分 Pod 来释放空间。默认阈值是通用的,但如果你的节点磁盘较小或业务日志量大,默认值可能过于敏感,导致正常业务被误杀。调整阈值本质是在“节点稳定性”和“业务连续性”之间寻找平衡,调得太高可能导致节点磁盘写满后无法操作,调得太低则业务容易波动。

分步处理

1. 确认当前配置方式:现代集群通常使用 KubeletConfiguration 配置文件,旧版本可能使用启动旗帜。优先查找 /var/lib/kubelet/config.yaml,如果没有则检查 /etc/kubernetes/kubelet.conf 或 systemd 启动参数。

2. 备份配置:在修改前务必备份原文件,例如 cp config.yaml config.yaml.bak,以便出错时快速恢复。

Kubernetes 节点磁盘压力过大怎么配置驱逐阈值

3. 修改驱逐阈值:在配置文件中找到 evictionHardevictionSoft 字段。常见信号包括 nodefs.available(节点文件系统可用空间)和 imagefs.available(镜像文件系统可用空间)。根据实际磁盘容量调整百分比或绝对值,例如将可用空间阈值从默认值适当放宽。

4. 应用配置:如果是 kubeadm 管理的集群,可能需要通过 kubeadm init phase upload-config 或修改 ConfigMap 来持久化,直接改文件可能在升级后被覆盖。修改完成后重启 Kubelet 服务。

5. 回滚提醒:如果修改后节点出现异常,立即还原备份文件并重启 Kubelet。

怎么验证是否生效

修改完成后,不要只看服务状态,要确认 Kubelet 是否加载了新配置。

Kubernetes 节点磁盘压力过大怎么配置驱逐阈值
# 查看 Kubelet 日志,搜索 eviction 相关关键词,确认没有报错
journalctl -u kubelet -f | grep -i eviction

# 再次查看节点条件,DiskPressure 应变为 False
kubectl describe node <node-name> | grep DiskPressure

# 观察一段时间,确认没有发生非预期的 Pod 驱逐
kubectl get events `--field-selector` reason=Evicted `--sort-by`='.lastTimestamp'

如果节点状态恢复且日志中没有频繁的驱逐记录,说明配置已生效且阈值合理。

常见坑

1. 区分 NodeFS 和 ImageFS:有些集群将镜像和数据分开存储,只调整 nodefs 而忽略 imagefs 可能导致镜像清理触发驱逐。

2. kubeadm 管理覆盖:使用 kubeadm 部署的集群,直接修改 /var/lib/kubelet/config.yaml 可能在集群升级或被管控平台同步时还原,建议通过修改 KubeletConfiguration 对象来管理。

3. 阈值过高风险:不要为了不让 Pod 被驱逐而将阈值设得过高,如果磁盘真的写满,Kubelet 自身可能无法写入日志或状态,导致节点失联。

4. 忽略 Inode 耗尽:磁盘空间够用但 Inode 耗尽也会触发磁盘压力,检查配置时同时关注 nodefs.inodesFree

参考来源

  • Kubernetes Official Documentation, "Node Pressure Eviction", https://kubernetes.io/docs/concepts/scheduling-eviction/node-pressure-eviction/
  • Kubernetes Official Documentation, "Reserve Compute Resources", https://kubernetes.io/docs/tasks/administer-cluster/reserve-compute-resources/