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设置是否合理,直接决定伸缩和容量规划是否准确。
三、整体工作流
一个完整的弹性伸缩与容量规划工作流,通常按以下顺序展开:
- 建立资源画像:通过历史监控和VPA推荐,确定各工作负载的CPU/内存Requests与Limits。
- 配置Pod层伸缩:为无状态服务配置HPA,设定目标利用率、最小/最大副本数、扩缩容行为。
- 配置节点层伸缩:为MachineSet绑定MachineAutoscaler,设定最小/最大节点数,并确保Cluster Autoscaler能识别Pending Pod。
- 设置容量边界:通过ResourceQuota限制命名空间总量,通过PriorityClass保证关键业务优先调度。
- 持续观测与校准:观察HPA副本变化、节点扩容延迟、Pending时长和分配率,定期修正Requests与最大节点数。
下面这张图展示了从工作负载指标到Pod伸缩、再到节点扩容和容量反馈的整体关系。图中同时标出了关键对象、指标流向和判断条件,便于建立全局视角。
四、从全景到落地:先建立三个基线
在真正配置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的合理上限,也决定了是否需要预留缓冲节点。
五、常见误区与判断原则
实践中,弹性伸缩与容量规划最容易出现三类偏差。第一类是只设HPA不设节点上限,导致高峰期节点无限扩张,成本失控;第二类是Requests设置过小,HPA显示使用率很高但实际资源充足,造成频繁扩容;第三类是忽略缩容稳定窗口,业务刚回落就缩容,随后又反弹,形成震荡。
判断原则可以归纳为:HPA看“使用率与目标值的偏差”,Cluster Autoscaler看“Pending Pod是否持续存在”,容量规划看“分配率、碎片率和增长趋势”。三者观察窗口不同,不能互相替代。只有把Pod层、节点层和容量层的数据放在同一时间轴上对照,才能判断一次伸缩是“正常响应”还是“容量不足的征兆”。