3、节点资源管理:节点容量、可分配资源、节点压力驱逐、资源预留策略

节点是 Kubernetes 集群中承载 Pod 的物理或虚拟计算单元。理解节点的资源模型是调度优化的基础。本章深入剖析节点资源管理的四个核心维度:节点容量、可分配资源、节点压力驱逐与资源预留策略,帮助你在集群运维中精准控制资源边界,避免因资源争抢导致的节点不稳定。

3.1 节点容量与可分配资源模型

每个节点在注册到集群时,kubelet 会探测其硬件资源总量,即 Node Capacity。然而,操作系统、kubelet 本身、容器运行时(如 containerd)以及系统守护进程(如 sshd、systemd)需要占用一部分资源。因此,Kubernetes 定义了 Allocatable 资源,即真正可供 Pod 使用的资源上限。

核心计算公式如下:

Allocatable = Node Capacity - Reserved - Eviction Thresholds

其中:

  • Node Capacity:节点硬件总量(CPU、内存、磁盘、PID 等)。
  • Reserved:为系统守护进程和 kubelet 预留的资源。
  • Eviction Thresholds:驱逐阈值对应的资源量(通常为内存或磁盘的或百分比值)。
关键认知:调度器只关心 status.allocatable,而非 status.capacity。如果节点上系统组件消耗过高,Allocatable 会显著低于 Capacity,导致 Pod 调度失败或资源利用率虚低。

3.2 资源预留策略:System Reserved 与 Kube Reserved

Kubernetes 通过 kubelet 参数提供两层资源预留机制,确保系统组件和 Kubernetes 组件不会与用户 Pod 争抢资源。

预留类型 配置参数 预留对象 典型值建议
System Reserved --system-reserved 操作系统守护进程(sshd、systemd、监控代理等) CPU: 200m ~ 500m
Memory: 256Mi ~ 1Gi
Kube Reserved --kube-reserved kubelet、容器运行时、kube-proxy 等 CPU: 100m ~ 300m
Memory: 128Mi ~ 512Mi
Eviction Threshold --eviction-hard 节点压力驱逐的硬性触发线 Memory: 100Mi ~ 500Mi
Disk: 5% ~ 10%

配置示例(kubelet 启动参数):

--system-reserved=cpu=500m,memory=1Gi,ephemeral-storage=10Gi
--kube-reserved=cpu=200m,memory=512Mi,ephemeral-storage=5Gi
--eviction-hard=memory.available<500Mi,nodefs.available<10%
避坑指南:不要将 --system-reserved 和 --kube-reserved 设置得过高,否则 Allocatable 会严重缩水,导致集群资源利用率低下。建议结合节点监控数据(如 Prometheus + Node Exporter)动态调整。

3.3 节点压力驱逐机制

当节点资源(内存、磁盘、PID)低于配置的驱逐阈值时,kubelet 会主动驱逐 Pod 以恢复节点稳定性。驱逐分为 硬驱逐 和 软驱逐 两种模式。

驱逐类型 触发条件 行为 宽限期
硬驱逐 资源低于 --eviction-hard 立即驱逐 Pod,无宽限期 无
软驱逐 资源低于 --eviction-soft 触发宽限期,到期后驱逐 --eviction-soft-grace-period 可配置
软驱逐 + 优雅终止 软驱逐宽限期到期 发送 SIGTERM,等待 Pod 优雅退出 Pod 的 terminationGracePeriodSeconds

驱逐优先级由 Pod 的 QoS 类 决定:

  1. BestEffort(无资源限制)—— 最先被驱逐。
  2. Burstable(部分资源限制)—— 其次被驱逐。
  3. Guaranteed(资源限制等于请求)—— 最后被驱逐。
生产建议:为关键业务 Pod 设置 Guaranteed QoS(即 limits == requests),并配置 priorityClassName 为高优先级,以最大程度降低被驱逐的风险。

3.4 节点资源管理全景图

下图展示了从节点容量到 Pod 调度的完整资源流动链路,以及驱逐机制在其中的位置:

节点资源管理全景图 Node Capacity CPU / Memory / Disk / PID System Reserved OS 守护进程 Kube Reserved kubelet / 运行时 Eviction Thresholds 硬驱逐 / 软驱逐 Allocatable = Capacity - Reserved - EvictionThresholds 调度器实际使用的资源量 Pod 调度(基于 Allocatable) BestEffort / Burstable / Guaranteed 节点压力驱逐(资源低于阈值时触发) 驱逐优先级 1. BestEffort 2. Burstable 3. Guaranteed

3.5 资源预留策略的实践配置

在大型生产集群中,建议通过 kubelet 配置文件(KubeletConfiguration)统一管理预留策略,而非使用命令行参数。以下是一个完整的 YAML 配置示例:

apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
evictionHard:
  memory.available: "500Mi"
  nodefs.available: "10%"
  nodefs.inodesFree: "5%"
evictionSoft:
  memory.available: "1Gi"
  nodefs.available: "15%"
evictionSoftGracePeriod:
  memory.available: "1m30s"
  nodefs.available: "2m"
kubeReserved:
  cpu: "200m"
  memory: "512Mi"
  ephemeral-storage: "5Gi"
systemReserved:
  cpu: "500m"
  memory: "1Gi"
  ephemeral-storage: "10Gi"
evictionPressureTransitionPeriod: "30s"
最佳实践:在集群部署前,使用 kubectl describe node <node-name> 查看节点的 Capacity 和 Allocatable 字段,验证预留策略是否生效。例如:
Allocatable: cpu: 3500m, memory: 7.5Gi, ephemeral-storage: 80Gi 表示预留已正确扣除。

3.6 节点压力驱逐的监控与调优

驱逐事件是节点不健康的直接信号。建议通过以下指标监控驱逐风险:

指标 来源 预警阈值
node_memory_MemAvailable_bytes Node Exporter 低于 EvictionHard 的 1.5 倍
node_filesystem_avail_bytes Node Exporter 低于 15%
kubelet_eviction_stats_evictions kubelet 指标端点 大于 0 即告警
kube_pod_status_phase kube-state-metrics Evicted 状态的 Pod 数量
调优注意:如果节点频繁触发软驱逐但未达到硬驱逐,说明预留策略偏紧或 Pod 资源请求设置不合理。此时应优先调整 Pod 的 resource requests,而非盲目扩大预留值。

3.7 本章小结