压力节点驱逐
概述
k8s node 上有一组参数,控制 k8s 中的内存,磁盘等资源占用占全部资源的最大比例,超过这个比例,pod 可能会被驱逐(evicted)
关于驱逐有以下几个概念
有三个概念:
驱逐信号
驱逐条件
- 软驱逐条件
- 硬驱逐条件
节点条件
这些概念之间的关系是:
- 节点条件 = f(驱逐条件),当满足不同的驱逐条件,节点条件会被设置成不同的值
- 驱逐条件 = 驱逐信号 关系运算符(<,=,>) 条件值
驱逐信号

注意其中的 nodefs 和 imagefs 区别:
nodefs:- 节点的主要文件系统,用于本地磁盘卷、emptyDir、日志存储等。 例如,
nodefs包含/var/lib/kubelet/。 - 默认就是/var/lib/kubelet 所在的分区,可以通过 kubelet 参数--root-dir 指定
- 节点的主要文件系统,用于本地磁盘卷、emptyDir、日志存储等。 例如,
imagefs:- 可选文件系统,供容器运行时存储容器镜像和容器可写层。
- 就是 docker 所在的分区
驱逐条件
驱逐条件公式: 驱逐信号 关系运算符(<,=,>) 条件值
分为软驱逐条件和硬驱逐条件。
区别是一个有宽限期一个没有宽限期
软驱逐条件相关配置(kubelet 配置中指定):
eviction-soft:一组驱逐条件,如memory.available<1.5Gi, 如果驱逐条件持续时长超过指定的宽限期,可以触发 Pod 驱逐。eviction-soft-grace-period:一组驱逐宽限期, 如memory.available=1m30s,定义软驱逐条件在触发 Pod 驱逐之前必须保持多长时间。eviction-max-pod-grace-period:在满足软驱逐条件而终止 Pod 时使用的最大允许宽限期(以秒为单位)
eviction-soft 默认值为 nil,即不设置软驱逐条件,具体见文档
硬驱逐条件相关配置(kubelet 配置中指定)
- eviction-hard
默认值: memory.available: "100Mi" nodefs.available: "10%" nodefs.inodesFree: "5%" imagefs.available: "15%"
两组配置默认值详见参考文档 2
节点条件
当某 pod 满足了驱逐条件,会反映在 node 的节点条件上
可以根据这个信息去判断驱逐的原因

某机器某 pod 驱逐事件分析
分析过程
首先发现某服务执行会长时间卡住不动,去 k8s 平台查看 pod 状态

发现处于驱逐状态
驱逐的原因可能为磁盘,pid,内存不够,要具体确认的话需要看下节点事件中的条件状态

发现是 DiskPressure,查阅官网文档得知,可能是 nodefs 或者 imagefs 到达了阈值
登上机器 df 看一下

根目录分区到达 85%,目前配置中 nodefs 与 imagefs 均在根目录,驱逐条件没用手动设置过,默认值分别为 5% 和 15%,即已到达驱逐条件
解决方案
根分区中删点文件
参考资料