1. OpenShift弹性伸缩与容量规划全景

在OpenShift中,弹性伸缩与容量规划并不是两个独立话题,而是同一套资源治理体系的两端:一端解决“负载变化时,工作负载能否及时获得足够资源”,另一端解决“集群长期是否有足够容量承接这些工作负载”。如果只做伸缩而不做容量规划,Pod可能因节点资源不足长期Pending;如果只做容量规划而不做伸缩,则业务高峰时资源利用率与响应能力难以兼顾。理解这两者的定位、核心对象、关键指标与整体工作流,是后续所有配置与调优的基础。

一、弹性伸缩与容量规划在OpenShift中的定位

OpenShift的弹性伸缩能力建立在Kubernetes原生机制之上,并由Machine API、Cluster Autoscaler、Vertical Pod Autoscaler等组件扩展。它主要回答三个问题:什么时候扩、扩什么、扩到哪里。容量规划则回答:集群当前和未来能承载多少、资源缺口在哪里、如何提前补齐。两者共同构成“需求感知—资源调度—容量补充—成本约束”的闭环。

从层次上看,OpenShift的伸缩分为三个平面:

  • Pod层:Horizontal Pod Autoscaler(HPA)根据CPU、内存或自定义指标调整副本数;Vertical Pod Autoscaler(VPA)调整单Pod的requests/limits。
  • 节点层:Cluster Autoscaler根据Pending Pod的资源需求,触发MachineSet扩缩节点;Machine Health Check负责异常节点替换。
  • 集群层:通过多MachineSet、多可用区拓扑和资源配额,决定容量池的边界与分布。

容量规划则贯穿这三个平面:它既关注单Pod的资源画像,也关注节点可分配资源、集群碎片率、预留水位和增长趋势。没有容量规划的伸缩,容易在高峰期触发“扩不出来”;没有弹性伸缩的容量规划,则容易长期过度预留、成本偏高。

二、核心对象与关键指标

要建立全景认知,需要先明确几类核心对象及其关系。工作负载侧包括Deployment、StatefulSet、Pod、ResourceQuota、LimitRange;伸缩侧包括HPA、VPA、Cluster Autoscaler、MachineSet、MachineAutoscaler;容量侧包括Node、Allocatable、Requests、Limits、Taints/Tolerations、PriorityClass。它们之间的数据流可以概括为:工作负载产生资源请求,调度器根据节点可分配资源进行绑定,HPA/VPA根据指标调整请求量,Cluster Autoscaler根据Pending状态调整节点数量。

关键指标分为四组:

  • 需求指标:CPU/内存使用率、QPS、延迟、队列长度、自定义业务指标。
  • 供给指标:节点Allocatable、已分配Requests、实际使用量、可调度Pod数。
  • 弹性指标:HPA当前副本数、期望副本数、扩容冷却时间、缩容稳定窗口。
  • 容量指标:集群CPU/内存分配率、碎片率、Pending Pod数、节点扩容耗时、预留水位。

其中,Requests是连接伸缩与容量规划的关键参数。HPA按使用率计算副本数时,分母是Requests;调度器判断节点是否有空间,依据也是Requests;容量规划计算可承载Pod数,同样以Requests为基准。因此,Requests设置是否合理,直接决定伸缩和容量规划是否准确。

三、整体工作流

一个完整的弹性伸缩与容量规划工作流,通常按以下顺序展开:

  1. 建立资源画像:通过历史监控和VPA推荐,确定各工作负载的CPU/内存Requests与Limits。
  2. 配置Pod层伸缩:为无状态服务配置HPA,设定目标利用率、最小/最大副本数、扩缩容行为。
  3. 配置节点层伸缩:为MachineSet绑定MachineAutoscaler,设定最小/最大节点数,并确保Cluster Autoscaler能识别Pending Pod。
  4. 设置容量边界:通过ResourceQuota限制命名空间总量,通过PriorityClass保证关键业务优先调度。
  5. 持续观测与校准:观察HPA副本变化、节点扩容延迟、Pending时长和分配率,定期修正Requests与最大节点数。

下面这张图展示了从工作负载指标到Pod伸缩、再到节点扩容和容量反馈的整体关系。图中同时标出了关键对象、指标流向和判断条件,便于建立全局视角。

OpenShift 弹性伸缩与容量规划全景 指标驱动 Pod 伸缩 → 节点扩容 → 容量反馈闭环 指标源 CPU / 内存使用率 QPS / 延迟 / 队列长度 自定义业务指标 HPA(Pod 层) 目标利用率 / 副本数 minReplicas / maxReplicas 扩容冷却 / 缩容稳定窗口 调度器 Requests 匹配 Allocatable Taints / Tolerations PriorityClass 抢占 Cluster Autoscaler 检测 Pending Pod 触发 MachineSet 扩缩 节点数 min / max 约束 节点池 / MachineSet Worker 节点 Allocatable 多可用区分布 Machine Health Check 容量规划反馈 分配率 / 碎片率 Pending 时长 / 扩容耗时 预留水位 / 增长趋势 指标 副本数 Pending Pod 扩缩节点 资源供给数据 校准 Requests 关键判断依据: ① HPA 期望副本数持续等于 maxReplicas → 检查节点容量是否触顶;② Pending Pod 超过扩容阈值 → 检查 Cluster Autoscaler 是否达到 maxNodes; ③ 分配率长期高于 80% 且碎片率上升 → 提前扩容或调整 Requests;④ 缩容后节点利用率过低 → 校准缩容稳定窗口与最小节点数。

四、从全景到落地:先建立三个基线

在真正配置HPA和Cluster Autoscaler之前,建议先建立三个基线,否则后续调优会失去参照。

第一,资源基线。统计每个工作负载过去7~14天的CPU/内存P95使用量,将Requests设为略高于P95的值,Limits设为Requests的1.5~2倍。例如某API服务P95 CPU为320m、内存为480Mi,可设Requests为400m/512Mi,Limits为800m/1Gi。这样HPA按CPU使用率计算时,分母稳定,副本数变化才可预期。

第二,容量基线。计算集群当前可分配CPU和内存总量,减去系统组件预留和DaemonSet占用,得到业务可用容量。假设3个Worker节点,每节点Allocatable为8核/32Gi,系统与DaemonSet占用约1核/4Gi,则业务可用容量约为21核/84Gi。若当前Requests总和为14核/56Gi,则分配率约为67%,仍有扩容空间。

第三,弹性基线。记录一次典型高峰的扩容过程:HPA从4副本扩到12副本用了多久,是否出现Pending,Cluster Autoscaler从触发到节点Ready耗时多少。这个数据决定了maxReplicas和maxNodes的合理上限,也决定了是否需要预留缓冲节点。

容量规划不是一次性计算,而是“观测—假设—验证—修正”的循环。每次大促、版本发布或架构调整后,都应重新校准Requests、HPA阈值和节点池上限。

五、常见误区与判断原则

实践中,弹性伸缩与容量规划最容易出现三类偏差。第一类是只设HPA不设节点上限,导致高峰期节点无限扩张,成本失控;第二类是Requests设置过小,HPA显示使用率很高但实际资源充足,造成频繁扩容;第三类是忽略缩容稳定窗口,业务刚回落就缩容,随后又反弹,形成震荡。

判断原则可以归纳为:HPA看“使用率与目标值的偏差”,Cluster Autoscaler看“Pending Pod是否持续存在”,容量规划看“分配率、碎片率和增长趋势”。三者观察窗口不同,不能互相替代。只有把Pod层、节点层和容量层的数据放在同一时间轴上对照,才能判断一次伸缩是“正常响应”还是“容量不足的征兆”。