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 类 决定:
- BestEffort(无资源限制)—— 最先被驱逐。
- Burstable(部分资源限制)—— 其次被驱逐。
- Guaranteed(资源限制等于请求)—— 最后被驱逐。
生产建议:为关键业务 Pod 设置 Guaranteed QoS(即 limits == requests),并配置
priorityClassName 为高优先级,以最大程度降低被驱逐的风险。
3.4 节点资源管理全景图
下图展示了从节点容量到 Pod 调度的完整资源流动链路,以及驱逐机制在其中的位置:
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,而非盲目扩大预留值。