4. 集群容量规划基础:资源请求(Request)与限制(Limit)、QoS等级、资源利用率指标

在 Kubernetes 集群中,容量规划的核心在于精确理解工作负载的资源需求与集群实际供给能力之间的映射关系。本章将深入剖析资源请求(Request)与限制(Limit)的语义差异、Pod 服务质量(QoS)等级的划分逻辑,以及关键资源利用率指标的采集与解读方法。这些基础概念是后续实现节点自动扩缩容与成本优化的理论基石。

4.1 资源请求(Request)与限制(Limit)

Kubernetes 通过 requests 和 limits 两个字段对容器资源进行管控。它们分别对应调度保证与资源上限,理解其差异是避免资源争抢和浪费的前提。

属性 语义 调度影响 运行时行为
Request 容器启动所需的最小资源保证 kube-scheduler 依据所有容器的 Request 总和选择节点 CPU 使用受 CFS 配额保障;内存不足时优先触发 OOM
Limit 容器允许使用的资源硬上限 不影响调度决策 CPU 使用被 throttled;内存超过 Limit 时容器被 OOMKill
关键原则:Request 决定调度可行性,Limit 决定运行时安全边界。生产环境中建议将 Request 设置为基于历史 P99 使用量的 1.1~1.3 倍,Limit 设置为 Request 的 1.5~2 倍,以平衡资源利用率与稳定性。

以下是一个典型的 Pod 资源声明示例:

apiVersion: v1
kind: Pod
metadata:
  name: capacity-demo
spec:
  containers:
  - name: app
    image: nginx:latest
    resources:
      requests:
        memory: "256Mi"
        cpu: "500m"
      limits:
        memory: "512Mi"
        cpu: "1000m"

4.2 QoS 等级:资源保障的优先级模型

Kubernetes 根据 Pod 中所有容器的 Request 与 Limit 配置组合,自动将 Pod 划分为三种 QoS(Quality of Service)等级。该等级决定了节点资源紧张时 Pod 被驱逐的优先级。

QoS 等级是节点压力驱逐(Node Pressure Eviction)的核心排序依据。 当节点内存或磁盘资源不足时,kubelet 会按 BestEffort → Burstable → Guaranteed 的顺序逐级驱逐 Pod。
Pod QoS 等级分类与驱逐优先级 Guaranteed Request == Limit 所有容器均设置 驱逐优先级:最低 Burstable Request < Limit 至少一个容器设置 驱逐优先级:中等 BestEffort 未设置 Request/Limit 无资源保证 驱逐优先级:最高 容量规划中的 QoS 策略建议 • 核心业务(数据库、API Gateway)→ Guaranteed,确保资源独占与稳定性 • 弹性业务(Web Server、批处理)→ Burstable,允许突发使用空闲资源 • 非关键任务(日志收集、监控 Agent)→ BestEffort,利用碎片资源运行

4.3 核心资源利用率指标

容量规划依赖精确的指标数据。以下指标是评估集群资源水位、触发扩缩容决策的关键输入。

4.3.1 节点级指标

  • CPU 利用率:node_cpu_seconds_total(Prometheus)或 kube_node_status_capacity_cpu_cores。建议关注 5 分钟平均利用率,避免瞬时尖峰干扰。
  • 内存利用率:node_memory_MemTotal_bytes 与 node_memory_MemAvailable_bytes。注意 available 包含缓存与缓冲区,比 free 更准确。
  • 磁盘 I/O 压力:node_disk_io_time_seconds_total 与 node_disk_io_time_weighted_seconds_total。高 I/O 等待时间可能导致节点被标记为 DiskPressure。
  • 网络带宽:node_network_receive_bytes_total 与 node_network_transmit_bytes_total。用于判断是否达到节点网络上限。

4.3.2 Pod 级指标

  • CPU 使用率 vs Request:rate(container_cpu_usage_seconds_total[5m]) / container_spec_cpu_quota。当持续超过 80% 时考虑扩容。
  • 内存使用率 vs Limit:container_memory_working_set_bytes / container_spec_memory_limit_bytes。超过 90% 时存在 OOMKill 风险。
  • OOMKill 计数:container_last_seen 结合 container_oom_events_total。频繁 OOM 表明 Limit 设置过低。

4.3.3 集群级聚合指标

指标名称 计算公式 用途
集群 CPU 分配率 sum(request) / sum(capacity) 判断整体 CPU 资源是否过载
集群内存分配率 sum(request) / sum(capacity) 判断整体内存资源是否过载
节点资源碎片率 1 - (max(request_per_node) / capacity_per_node) 评估节点间资源分布均匀性
Pod 密度 count(pod) / count(node) 评估节点可调度 Pod 数量上限
常见误区:仅依赖 CPU 和内存指标进行容量规划。实际生产中,磁盘 IOPS、网络带宽、PID 限制、inode 耗尽同样可能导致节点不可用。建议将 node_nf_conntrack_entries、node_filefd_allocated 等指标纳入监控体系。

4.4 指标驱动的容量规划流程

将上述指标与 QoS 等级结合,可以构建一个闭环的容量规划流程:

  1. 数据采集:通过 Prometheus 或云厂商监控服务,持续采集节点级与 Pod 级指标。
  2. 基线建立:基于过去 7~30 天的 P50/P95/P99 使用量,为每个工作负载生成 Request 与 Limit 建议值。
  3. QoS 审计:检查所有 Pod 的 QoS 等级,确保核心业务为 Guaranteed,非关键业务为 BestEffort。
  4. 碎片分析:计算节点资源碎片率,识别因 Pod 调度不均导致的资源浪费。
  5. 扩缩容触发:当集群 CPU/内存分配率超过 80% 或节点碎片率低于 20% 时,触发节点自动扩缩容。
容量规划闭环流程 1. 数据采集 2. 基线建立 3. QoS 审计 4. 碎片分析 5. 扩缩容触发 反馈调整 Request/Limit 与 QoS 配置
实践建议:在 Prometheus 中创建以下记录规则(Recording Rule),用于实时计算集群资源分配率:
:cluster_cpu_request_ratio:avg = sum(kube_pod_container_resource_requests_cpu_cores) / sum(node_cpu_cores)
:cluster_memory_request_ratio:avg = sum(kube_pod_container_resource_requests_memory_bytes) / sum(node_memory_MemTotal_bytes)