Kubernetes节点压力驱逐机制深度解析
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
什么是节点压力驱逐
节点压力驱逐(Node-pressure Eviction)是Kubernetes中kubelet组件的一个重要功能,它通过监控节点上的关键资源(如内存、磁盘空间和文件系统inode等),在资源达到预设阈值时主动终止一个或多个Pod以回收资源,防止节点资源耗尽导致系统不稳定。
核心工作机制
驱逐信号与阈值
kubelet通过以下关键指标来监控节点资源状态:
内存相关信号:
memory.available
:节点可用内存,计算方式为总内存减去工作集内存
文件系统相关信号:
nodefs.available
:节点主文件系统可用空间nodefs.inodesFree
:节点主文件系统可用inode数量imagefs.available
:容器镜像文件系统可用空间(如有)containerfs.available
:容器文件系统可用空间(如有)
进程相关信号(仅Linux):
pid.available
:可用进程ID数量
驱逐阈值类型
kubelet支持两种驱逐阈值配置:
-
软驱逐阈值:
- 需要同时设置阈值和宽限期
- 资源压力持续超过宽限期后才会触发驱逐
- 允许配置最大Pod终止宽限期
-
硬驱逐阈值:
- 没有宽限期
- 一旦达到阈值立即终止Pod
- 默认配置包括内存、磁盘空间等基础阈值
资源回收策略
在真正驱逐Pod前,kubelet会尝试以下资源回收措施:
内存压力时:
- 检查cgroup内存使用情况(Linux)
- 查询系统全局内存提交级别(Windows)
磁盘压力时(根据文件系统配置不同):
-
仅有nodefs时:
- 清理死亡的Pod和容器
- 删除未使用的镜像
-
配置imagefs时:
- nodefs压力:清理死亡的Pod和容器
- imagefs压力:删除未使用的镜像
-
配置containerfs和imagefs时:
- containerfs压力:清理死亡的Pod和容器
- imagefs压力:删除未使用的镜像
Pod驱逐选择逻辑
当资源回收无法缓解压力时,kubelet会按照以下优先级选择要驱逐的Pod:
-
超出资源请求的Pod:
- 先驱逐BestEffort类型的Pod
- 然后是Burstable类型且实际使用超过请求的Pod
- 按优先级排序,超出请求比例高的优先驱逐
-
未超出资源请求的Pod:
- 最后驱逐Guaranteed类型Pod
- 以及Burstable类型但实际使用低于请求的Pod
- 按优先级排序
特殊场景处理
静态Pod的处理
静态Pod被驱逐后,kubelet会尝试重新创建它们。但要注意:
- 低优先级的静态Pod可能无法在资源压力下获得足够资源
- kubelet会持续尝试运行所有静态Pod
节点状态与污点
kubelet会根据资源压力情况设置以下节点状态:
MemoryPressure
:内存不足DiskPressure
:磁盘空间或inode不足PIDPressure
:进程ID不足(仅Linux)
控制平面会自动将这些状态转换为对应的节点污点,影响Pod调度。
最佳实践建议
-
合理设置资源请求和限制:
- 为Pod配置准确的资源请求,帮助kubelet做出更好的驱逐决策
-
监控与告警:
- 监控关键驱逐信号,提前预警资源压力
-
优先级配置:
- 为关键Pod设置更高的优先级,降低被驱逐风险
-
文件系统规划:
- 考虑使用独立的imagefs提高容器镜像管理效率
-
阈值调优:
- 根据实际负载特点调整软/硬驱逐阈值和宽限期
总结
节点压力驱逐机制是Kubernetes保障节点稳定性的重要手段。通过理解其工作原理和配置方法,运维人员可以更好地平衡系统资源利用率和应用可用性,构建更健壮的Kubernetes集群。
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考