3. kubelet预留配置详解

在 Kubernetes 节点容量规划中,kubelet 的预留配置是决定节点实际可用资源(Allocatable)的核心机制。如果预留不足,系统组件或 kubelet 本身可能因资源竞争导致节点不稳定;预留过多,则造成 Pod 调度资源浪费。本章深入解析三个关键参数:--system-reserved、--kube-reserved 和 --eviction-hard,并说明它们如何协同工作以保障节点健康。

3.1 节点资源预留模型

Kubernetes 节点资源分配遵循分层模型:

  • Node Capacity:节点物理资源总量(CPU、内存、磁盘等)。
  • System Reserved:为操作系统守护进程(sshd、systemd、内核等)预留的资源。
  • Kube Reserved:为 Kubernetes 组件(kubelet、容器运行时、node-problem-detector 等)预留的资源。
  • Eviction Threshold:触发 Pod 驱逐的硬性资源阈值。
  • Allocatable:最终可供调度 Pod 使用的资源量。

计算公式如下:

Allocatable = Node Capacity - System Reserved - Kube Reserved - Eviction Threshold
节点资源预留分层模型 Node Capacity(节点总资源) --system-reserved 操作系统守护进程:sshd、systemd、内核、日志服务等 --kube-reserved Kubernetes 组件:kubelet、容器运行时、监控代理等 --eviction-hard(驱逐硬阈值) 内存/磁盘/Inode 硬性下限,触发即驱逐 Pod Allocatable(可调度资源) Capacity - system - kube - eviction

3.2 --system-reserved:操作系统资源预留

该参数为节点上的非 Kubernetes 系统进程预留资源。典型占用包括:

组件类别 典型进程 资源消耗特征
系统初始化 systemd、init 固定少量内存,CPU 低
远程管理 sshd、监控 Agent 连接数相关,内存波动
日志与审计 rsyslog、auditd 磁盘 I/O 与内存缓冲
内核与网络 kworker、netd CPU 突发,内存稳定

配置建议:对于通用 Linux 节点,推荐预留 5%~10% 的 CPU 和 10%~15% 的内存。生产环境应通过 systemd-cgtop 或 top 持续观察 7 天,取 P95 值作为基准。

3.3 --kube-reserved:Kubernetes 组件资源预留

该参数为 kubelet、容器运行时(containerd/docker)、以及 DaemonSet 形式的系统组件(如 kube-proxy、node-problem-detector)预留资源。

组件 CPU 典型值 内存典型值 说明
kubelet 100m ~ 200m 200Mi ~ 500Mi 随 Pod 数量线性增长
containerd 100m ~ 300m 300Mi ~ 800Mi 镜像拉取时 CPU 突发
kube-proxy 50m ~ 100m 50Mi ~ 150Mi 随 Service 数量增长
监控/日志 Agent 100m ~ 200m 200Mi ~ 500Mi 视采集量而定

最佳实践:将 --kube-reserved 与 --system-reserved 分开配置,便于审计和调整。如果节点同时运行多个 DaemonSet,需在 kube-reserved 中一并计入。

3.4 --eviction-hard:驱逐硬阈值

当节点资源低于该阈值时,kubelet 立即开始驱逐 Pod,不等待软阈值优雅期。常用驱逐信号:

信号 默认值 单位 触发行为
memory.available 100Mi 值 驱逐 Pod 释放内存
nodefs.available 10% 百分比 驱逐 Pod 释放本地磁盘
nodefs.inodesFree 5% 百分比 防止 Inode 耗尽
imagefs.available 15% 百分比 触发镜像垃圾回收

注意:--eviction-hard 设置过低会导致节点 OOM 或磁盘写满,设置过高则浪费资源。建议内存硬阈值不低于 100Mi,磁盘硬阈值不低于 5%。对于镜像拉取密集的节点,imagefs.available 应适当提高至 20% 以上,避免拉取镜像时因磁盘不足失败。

3.5 三参数协同配置示例

以下是一个 16GB 内存、4 核 CPU、100GB 磁盘的节点配置示例:

--system-reserved=cpu=500m,memory=1Gi,ephemeral-storage=10Gi
--kube-reserved=cpu=500m,memory=1.5Gi,ephemeral-storage=10Gi
--eviction-hard=memory.available<500Mi,nodefs.available<10%,imagefs.available<15%
--eviction-soft=memory.available<800Mi,nodefs.available<15%
--eviction-soft-grace-period=memory.available=1m30s,nodefs.available=1m30s

计算 Allocatable:

  • CPU:4 - 0.5 - 0.5 = 3 核
  • 内存:16Gi - 1Gi - 1.5Gi - 0.5Gi(硬阈值)= 13Gi
  • 临时存储:100Gi - 10Gi - 10Gi - 10%(10Gi)= 70Gi

关键原则:预留总量(system + kube + eviction)不应超过节点总资源的 30%~40%,否则 Pod 调度密度过低。对于镜像拉取加速场景,建议在 --kube-reserved 中为容器运行时预留充足的磁盘 I/O 和内存,避免拉取时触发驱逐。

3.6 验证与调优方法

  1. 查看当前预留值:登录节点执行 kubectl describe node <node-name>,查看 Capacity 与 Allocatable 差值。
  2. 监控实际使用:使用 kubectl top node 或 Prometheus 采集 node_memory_MemAvailable_bytes 等指标。
  3. 压力测试:在测试环境模拟高负载,观察是否触发驱逐或 OOM。
  4. 调整策略:根据 7 天 P95 使用量,将 system-reserved 和 kube-reserved 设置为该值的 1.2 倍,保留安全余量。

镜像拉取加速关联:当 imagefs.available 硬阈值设置过低时,kubelet 可能在拉取大镜像前就因磁盘不足而驱逐 Pod。建议将 imagefs.available 硬阈值设为 20%,并配合 --image-gc-high-threshold=80 提前触发垃圾回收,保障拉取空间。