Kubernetes 中触发驱逐的阈值不是固定的,它是一个可配置的、多层次的概念。阈值的大小决定了系统对资源压力的敏感度。
以下是不同层级阈值的详细说明:
1. 默认驱逐阈值
Kubelet 有一套默认的驱逐阈值,这些是内置的硬编码值,通常在内存不足时首先生效。
资源类型 | 默认驱逐阈值 | 说明 |
---|---|---|
memory.available | <100Mi | 节点可用内存少于 100MiB 时触发驱逐。这是最常见、最敏感的阈值。 |
nodefs.available | <10% | 节点根分区(存放 kubelet 和容器运行时文件)的可用空间少于 10%。 |
nodefs.inodesFree | <5% | 节点根分区的可用 inode 少于 5%。 |
imagefs.available | <15% | 容器运行时存储镜像和容器可写层的分区(如果独立)可用空间少于 15%。 |
重要提示:memory.available
的值是从操作系统收集的,而不是所有容器的 memory.usage
之和。它是一个全局节点指标。
2. 可配置的驱逐阈值
系统管理员可以通过修改 Kubelet 的启动参数 --eviction-hard
来自定义这些阈值。这是最常用的调整方式。
示例:
# 在 Kubelet 的启动参数中设置
--eviction-hard=memory.available<500Mi,nodefs.available<10%,imagefs.available<15%,nodefs.inodesFree<5%
memory.available<500Mi
:可用内存少于 500MiB 时驱逐。nodefs.available<5%
:根分区可用空间少于 5% 时驱逐(比默认更严格)。
软驱逐阈值 (Eviction Soft):
除了硬性阈值,还可以设置软驱逐阈值 (--eviction-soft
),它允许资源使用量在超过阈值后持续一段时间再触发驱逐,避免了短暂的资源峰值导致不必要的Pod重启。还需要配套设置宽限期 (--eviction-soft-grace-period
)。
示例:
--eviction-soft=memory.available<300Mi
--eviction-soft-grace-period=memory.available=1m30s
# 含义:可用内存低于300Mi的状态持续了1分30秒后,才触发驱逐。
3. 逐出信号与阈值类型
Kubelet 监控一系列驱逐信号(eviction signals),并为它们设置阈值。
驱逐信号 | 描述 | 可设置的阈值类型 | 例子 |
---|---|---|---|
memory.available | 节点当前可用内存。 | eviction-hard , eviction-soft | memory.available<100Mi |
nodefs.available | 节点根文件系统可用空间。 | eviction-hard , eviction-soft | nodefs.available<10% |
nodefs.inodesFree | 节点根文件系统可用 inode 数量。 | eviction-hard , eviction-soft | nodefs.inodesFree<5% |
imagefs.available | 容器运行时镜像文件系统可用空间。 | eviction-hard , eviction-soft | imagefs.available<15% |
pid.available | 可用进程ID数。 | eviction-hard , eviction-soft | pid.available<1000 |
4. 系统保留资源
在讨论阈值时,必须提到 --system-reserved
和 --kube-reserved
参数。这些配置不是驱逐阈值,而是为系统和Kubernetes组件预留的资源。
--system-reserved
:为操作系统系统守护进程(如sshd、systemd)保留的资源。--kube-reserved
:为Kubernetes系统守护进程(如kubelet、容器运行时、node-problem-detector)保留的资源。
它们如何影响驱逐?
Kubelet 在计算节点容量时,会扣除这些预留资源。节点可分配资源 = 节点总资源 - (system-reserved + kube-reserved)
驱逐阈值是基于“节点可分配资源”来计算的吗?不是的。 驱逐阈值是基于实际从操作系统读取的可用值(如 memory.available
)。system-reserved
和 kube-reserved
的作用是通过 cgroups
限制用户Pod对这部分资源的占用,从而间接地保证系统有足够的资源,使得操作系统报告的 memory.available
不会轻易跌到驱逐阈值以下。
举例说明:
- 一个节点有 2GiB 内存。
- 你设置了
--system-reserved=memory=200Mi
,--kube-reserved=memory=300Mi
。 - 那么用户Pod可使用的内存总量大约是
2GiB - 500Mi = 1.5GiB
。 - 如果所有Pod消耗了 1.5GiB 内存,那么操作系统报告的
memory.available
就只剩下约 500Mi(假设系统进程实际用了200Mi)。 - 如果驱逐阈值是
memory.available<100Mi
,那么此时还不会触发驱逐,因为可用内存(500Mi) > 阈值(100Mi)。 - 如果没有设置预留,用户Pod可能会耗尽所有2GiB内存,导致
memory.available
直接变为0,立即触发驱逐甚至OOM。
总结:阈值是多少?
- 默认值:最常见的是
memory.available < 100Mi
。 - 实际值:它完全取决于你的Kubelet配置。要查看你集群中节点的确切配置,需要登录到节点检查Kubelet启动参数:
bash ps aux | grep kubelet | grep -o 'eviction-hard=.[^ ]*' # 或者查看系统服务文件 cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
- 动态性:对于百分比阈值(如
nodefs.available<10%
),其对应的实际资源量会随着节点总磁盘空间的变化而变化。 - 优先级:当多个阈值被突破时,kubelet 会按
内存不足 > 磁盘空间不足 > inode 不足
的优先级顺序进行驱逐。
因此,没有一个放之四海而皆准的“阈值”。你必须根据自己节点的总资源量、工作负载特性和稳定性要求,通过配置 eviction-hard
和 system-reserved
等参数来量身定制。 对于生产环境,通常建议将硬驱逐阈值设置得比默认更宽松一些(如 500Mi
),并为系统预留足够的资源,以避免过于频繁的驱逐。