k8s 中触发驱逐的阈值详细说明

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-softmemory.available<100Mi
nodefs.available节点根文件系统可用空间。eviction-hard, eviction-softnodefs.available<10%
nodefs.inodesFree节点根文件系统可用 inode 数量。eviction-hard, eviction-softnodefs.inodesFree<5%
imagefs.available容器运行时镜像文件系统可用空间。eviction-hard, eviction-softimagefs.available<15%
pid.available可用进程ID数。eviction-hard, eviction-softpid.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-reservedkube-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。

总结:阈值是多少?

  1. 默认值:最常见的是 memory.available < 100Mi
  2. 实际值它完全取决于你的Kubelet配置。要查看你集群中节点的确切配置,需要登录到节点检查Kubelet启动参数:
    bash ps aux | grep kubelet | grep -o 'eviction-hard=.[^ ]*' # 或者查看系统服务文件 cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
  3. 动态性:对于百分比阈值(如 nodefs.available<10%),其对应的实际资源量会随着节点总磁盘空间的变化而变化。
  4. 优先级:当多个阈值被突破时,kubelet 会按 内存不足 > 磁盘空间不足 > inode 不足 的优先级顺序进行驱逐。

因此,没有一个放之四海而皆准的“阈值”。你必须根据自己节点的总资源量、工作负载特性和稳定性要求,通过配置 eviction-hardsystem-reserved 等参数来量身定制。 对于生产环境,通常建议将硬驱逐阈值设置得比默认更宽松一些(如 500Mi),并为系统预留足够的资源,以避免过于频繁的驱逐。

发布日期:
分类:k8s 标签: