Kubernetes 节点存储阈值与 Pod 驱逐机制笔记
一、节点根目录使用阈值
1.1 阈值引发的驱逐情况
在 Kubernetes 集群中,节点根目录的使用情况会根据不同配置和实际场景有所变化。当根目录使用量超过设定的阈值时,节点可能会启动 Pod 驱逐流程。
1.2 默认阈值情况
不同 Kubernetes 版本的默认根目录使用阈值存在差异:
- 在 Kubernetes 1.15 及之前的版本中,默认根目录使用阈值为 90%。
- 在 Kubernetes 1.16 及之后的版本中,默认根目录使用阈值调整为 80%。
若 kubelet 配置文件中未明确设置根目录使用阈值,Kubernetes 将采用对应版本的默认阈值。
1.3 阈值修改方法
可以通过修改 kubelet 的配置来调整根目录使用阈值。kubelet 的配置文件通常位于 /etc/kubernetes/kubelet.conf
。修改时,可在 kubelet 的启动参数中添加 --eviction - hard
相关设置,示例如下:
--eviction - hard=memory.available<500Mi,nodefs.available<10%,nodefs.inodesFree<5%
其中:
nodefs.available
:用于设置节点根目录可用空间的百分比阈值,当根目录使用超过该阈值时,节点将启动驱逐流程。memory.available
:设置内存可用的百分比或绝对值。nodefs.inodesFree
:设置节点根目录可用的 inode 百分比。
注意事项:修改 kubelet 配置文件前,请务必备份原始配置文件,以防需要还原。同时,驱逐过程可能导致节点上的 Pod 被删除,调整阈值时需谨慎。建议在根目录使用接近阈值时,及时进行清理或扩容操作,避免触发驱逐。
1.4 相关图示
二、/var/lib/docker/ 和 /var/lib/kubelet/ 目录满导致的 Pod 驱逐
2.1 驱逐顺序
当 /var/lib/docker/
和 /var/lib/kubelet/
目录满时,kubelet 会按照以下顺序执行 Pod 驱逐操作:
- 驱逐非必需的本地存储卷绑定的 Pod:若 Pod 使用了本地存储卷且无其他节点备份,磁盘空间不足时,kubelet 会优先驱逐这类 Pod。
- 驱逐最早未使用的 Pod(LRU):若第一步无法释放足够空间,kubelet 会选择最近最久未使用的 Pod 进行驱逐,这类 Pod 通常优先级较低、重要性不高。
- 驱逐运行着的、优先级低的 Pod:若前两步仍无法满足空间需求,kubelet 可能会驱逐优先级较低的运行中 Pod。Pod 优先级可通过设置
PodSpec
的priorityClass
或者依据 Pod 的 QoS 类型来定义。
2.2 Pod 的 QoS 等级
Kubernetes 根据 Pod 的资源需求和容忍度,将 Pod 划分为三个品质服务(Quality of Service, QoS)等级,这些等级与 Pod 的调度、驱逐和资源分配相关:
- Guaranteed(保证):此类 Pod 有明确的 CPU 和内存资源需求,在集群中默认不会被驱逐,可保证获得所需资源。
- Burstable(可伸缩):Pod 有一定资源限制,但可根据工作负载瞬时需求使用更多资源,可能与其他 Pod 竞争资源,在资源紧张时可能被驱逐。
- BestEffort(尽力而为):Pod 无明确资源需求,优先级最低,会尽量使用剩余空闲资源,资源紧张时会首先被驱逐。
虽然目录满时的驱逐顺序与 QoS 等级无直接关联,但 QoS 等级会影响 Pod 在集群中的调度、资源分配和优先级。
2.3 日志查看与参考链接
- 可使用
grep -i 85% /var/log/messages
命令查看相关日志。
- 查看 kubelet 日志可使用
journalctl -xu kubelet > kubelet.log
命令。
- 相关参考链接:
2.4 优先级规划建议
在实际部署中,可根据业务需求为不同类型的 Pod 设置不同优先级,确保重要应用或服务稳定运行。设置 Pod 优先级可通过 priorityClass
字段或 annotation 实现,可在 Pod 创建时使用 kubectl
或编排工具(如 Helm)进行配置。进行优先级规划时,需综合考虑应用需求、资源分配和业务优先级等因素。
2.5 官方文档参考
[Node - pressure Eviction](https://kubernetes.io/docs/concepts/scheduling - eviction/node - pressure - eviction/)