3. 容量规划基础:K8s集群容量规划的核心指标

在Kubernetes集群升级场景中,临时资源预留的本质是在有限的时间窗口内,为升级操作腾出安全余量。要精准计算这个余量,必须先掌握容量规划的四个核心指标:CPU、内存、Pod密度、节点余量。这四个指标构成了从微观资源到宏观集群的完整度量体系。

3.1 核心指标全景图

下图展示了四个核心指标在集群容量规划中的层级关系与数据流向:

K8s集群容量规划核心指标全景图 K8s集群容量规划核心指标全景图 集群总容量 节点池 / Node Group 单节点可分配容量 节点余量 Pod 资源请求 Pod 资源限制 Pod 密度 CPU 使用率 内存使用率 Pod 密度 说明:升级临时资源预留 = 节点余量 × 升级并发数 + Pod 密度 × 迁移缓冲系数

3.2 CPU 与内存:资源请求与限制

CPU 和内存是容量规划最基础的可量化资源。在 K8s 中,每个 Pod 都通过 resources.requests 和 resources.limits 声明资源需求。升级临时预留的核心关注点是 requests,因为调度器基于 requests 做决策。

指标 单位 升级场景关注点 计算公式
CPU Request m(毫核) 调度决策依据,决定 Pod 能否分配到节点 节点可分配 CPU - 已调度 Pod CPU Request 总和
CPU Limit m(毫核) CPU 争用上限,影响节点实际负载 Limit 可大于 Request,但超卖需谨慎
Memory Request Mi / Gi 调度决策依据,不可超卖 节点可分配内存 - 已调度 Pod Memory Request 总和
Memory Limit Mi / Gi OOM Killer 触发阈值 Limit 超过节点容量时触发 OOM
升级成本优化要点: 在升级前,通过 kubectl describe node 或 Prometheus 查询 Allocatable - Requests 的差值,即可得到当前节点的可调度余量。这个余量决定了在不驱逐 Pod 的情况下,节点能承受多少临时负载。

3.3 Pod 密度:集群的“人口密度”

Pod 密度指单个节点上可调度的最大 Pod 数量。它受限于两个因素:节点 IP 地址数量(CNI 插件决定)和 Kubelet 的 --max-pods 参数。在升级场景中,Pod 密度直接影响迁移流量和调度压力。

  • 高密度集群(>50 Pods/节点):升级时需逐节点迁移大量 Pod,控制面 API Server 和 etcd 压力剧增。
  • 低密度集群(<20 Pods/节点):迁移成本低,但节点数量多,升级总时长增加。
  • 最佳实践:建议将 Pod 密度控制在 30~50 Pods/节点,平衡迁移效率与控制面负载。
容量规划公式: 升级临时预留的 Pod 密度缓冲 = (节点 Pod 密度上限 - 当前 Pod 数量) × 单 Pod 平均资源请求。这个缓冲值决定了升级期间能否原地调度新 Pod。

3.4 节点余量:安全垫与成本平衡

节点余量(Node Headroom)是容量规划中最容易被忽视但成本影响最大的指标。它指节点上未被任何 Pod 请求占用的可分配资源。在升级场景中,节点余量决定了是否需要额外预留节点。

节点余量比例 升级风险 成本影响 推荐策略
< 10% 极高:升级时 Pod 无法原地调度,必须驱逐 低(资源利用率高) 必须预留额外节点,升级成本高
10% ~ 25% 中等:部分 Pod 可原地调度,部分需迁移 中等 按升级批次预留 1~2 个缓冲节点
25% ~ 40% 低:大部分 Pod 可原地调度 较高(资源利用率偏低) 无需额外预留,直接滚动升级
> 40% 极低:但资源浪费严重 高(大量资源闲置) 建议缩容或混部,降低基础成本

3.5 四指标联动:升级临时预留计算模型

在升级临时资源预留成本优化中,四个指标不是孤立的,而是通过以下模型联动:

升级临时预留计算模型 升级临时预留计算模型 CPU Request 总和 Memory Request 总和 Pod 密度 节点余量 升级预留计算引擎 max(CPU余量, Mem余量) × Pod密度系数 × 升级并发数 临时预留资源量 CPU: X 核 内存: Y Gi 核心公式:临时预留 = max(CPU余量, 内存余量) × (1 + Pod密度系数) × 升级并发批次

3.6 实战:如何获取这些指标

在升级前,通过以下命令和工具快速获取四个核心指标:

# 1. 查看节点可分配资源与已分配资源
kubectl describe node <node-name> | grep -A 5 "Capacity"
kubectl describe node <node-name> | grep -A 5 "Allocatable"

# 2. 查看节点当前 Pod 数量
kubectl get pods --all-namespaces --field-selector spec.nodeName=<node-name> --no-headers | wc -l

# 3. 计算节点余量(示例脚本)
NODE="<node-name>"
ALLOC_CPU=$(kubectl describe node $NODE | grep "cpu" | head -1 | awk '{print $2}')
ALLOC_MEM=$(kubectl describe node $NODE | grep "memory" | head -1 | awk '{print $2}')
REQ_CPU=$(kubectl describe node $NODE | grep "cpu" | tail -1 | awk '{print $2}')
REQ_MEM=$(kubectl describe node $NODE | grep "memory" | tail -1 | awk '{print $2}')
echo "节点余量 CPU: $((ALLOC_CPU - REQ_CPU))m, 内存: $((ALLOC_MEM - REQ_MEM))Mi"

# 4. 使用 PromQL 查询集群维度指标
# CPU 余量: sum(kube_node_status_allocatable{resource="cpu"}) - sum(kube_pod_resource_request{resource="cpu"})
# 内存余量: sum(kube_node_status_allocatable{resource="memory"}) - sum(kube_pod_resource_request{resource="memory"})
常见误区: 很多团队只关注 CPU 和内存的 Limit,而忽略了 Request。在升级场景中,调度器只看 Request,不看 Limit。如果节点 CPU Request 已满(即使 Limit 还有空间),新 Pod 也无法调度上去。务必以 Request 作为容量规划基准。

3.7 指标驱动的升级成本优化策略

基于四个核心指标,可以制定以下升级成本优化策略:

  1. 低节点余量集群(<10%):升级前先扩容 1~2 个节点,升级完成后缩容。虽然增加了临时成本,但避免了 Pod 驱逐导致的 SLA 损失。
  2. 高 Pod 密度集群(>50 Pods/节点):采用分批升级 + 控制面限流策略,每批次升级不超过集群 Pod 总数的 10%,避免 API Server 过载。
  3. CPU 与内存余量不均衡:如果 CPU 余量充足但内存余量不足,考虑临时调整 Pod 的 Request(需业务方配合),或优先升级内存密集型节点。
  4. 利用 Cluster Autoscaler:在升级期间启用 Cluster Autoscaler,让集群自动扩缩容来吸收临时资源波动,避免人工预留过多资源。
成本优化核心原则: 升级临时预留不是“越多越好”,而是刚好覆盖升级期间的最大资源缺口。通过精确计算四个核心指标,可以将临时预留成本降低 30%~50%,同时保证升级安全。