3、弹性伸缩基础概念:水平扩缩(HPA)与垂直扩缩(VPA)的区别、控制面伸缩的特殊性
3.1 弹性伸缩的核心目标
在云原生架构中,弹性伸缩(Auto Scaling)是保障服务稳定性与资源利用率的关键手段。其核心目标是根据实时负载动态调整计算资源,避免过度配置导致的浪费或资源不足引发的性能下降。Kubernetes 提供了两种主要的伸缩策略:水平扩缩(HPA) 和 垂直扩缩(VPA)。
关键认知:HPA 与 VPA 并非互斥关系,在生产环境中常组合使用。理解两者的适用场景与局限性,是设计控制面弹性伸缩架构的前提。
3.2 HPA 与 VPA 的核心区别
下表从多个维度对比了两种伸缩策略的机制与适用场景:
| 对比维度 | 水平扩缩(HPA) | 垂直扩缩(VPA) |
|---|---|---|
| 伸缩对象 | Pod 副本数量 | Pod 的 CPU/内存资源请求(Requests & Limits) |
| 伸缩粒度 | 实例级(增加/减少 Pod) | 容器级(调整单个 Pod 的资源配额) |
| 响应速度 | 较快(创建/销毁 Pod) | 较慢(需要重建 Pod 以应用新资源规格) |
| 适用负载 | 无状态、可水平扩展的服务 | 有状态、单体应用或资源需求波动大的服务 |
| 对集群影响 | 改变 Pod 总数,影响节点资源水位 | 改变单个 Pod 资源占用,可能引发节点碎片化 |
| 典型指标 | CPU 利用率、QPS、请求延迟 | CPU 使用量、内存使用量、OOM 事件 |
| Kubernetes 资源 | HorizontalPodAutoscaler | VerticalPodAutoscaler |
3.3 伸缩流程对比示意图
下图展示了 HPA 与 VPA 在 Kubernetes 中的典型工作流程差异:
3.4 控制面弹性伸缩的特殊性
Kubernetes 控制面组件(如 kube-apiserver、etcd、kube-controller-manager、kube-scheduler)的弹性伸缩与普通工作负载存在本质区别,主要体现在以下几个方面:
- 有状态与一致性要求:etcd 作为分布式键值存储,对写入顺序和一致性有强要求,不能简单通过增加副本来线性提升写入性能。水平扩缩需要处理成员变更、领导者选举等复杂操作。
- 组件间依赖与耦合:kube-apiserver 是无状态的,可以水平扩展;但 kube-controller-manager 和 kube-scheduler 通过领导者选举机制实现高可用,同一时刻只有一个实例处于活跃状态,垂直扩缩比水平扩缩更有效。
- 资源敏感度:控制面组件对 CPU 和内存的消耗模式与业务应用不同。例如,kube-apiserver 在大量 LIST 请求时内存飙升,而 kube-scheduler 在调度高峰期 CPU 密集。VPA 需要针对这些组件定制资源推荐模型。
- 伸缩风险:控制面扩缩操作本身可能引发集群不稳定。例如,etcd 成员变更期间如果发生网络分区,可能导致集群不可用。因此,控制面伸缩通常需要更保守的策略和更严格的监控告警。
实践警告:不要对控制面组件直接使用默认的 HPA/VPA 配置。必须结合 Prometheus 监控数据,设计针对性的告警规则和伸缩阈值,并经过充分的灰度验证。
3.5 控制面组件伸缩策略对比
下表总结了 Kubernetes 核心控制面组件适用的伸缩策略:
| 组件 | 推荐伸缩方式 | 原因说明 | 关键监控指标 |
|---|---|---|---|
| kube-apiserver | 水平扩缩(HPA) | 无状态设计,可通过负载均衡器分发请求 | apiserver_request_duration_seconds、apiserver_current_inflight_requests |
| etcd | 垂直扩缩(VPA)+ 手动成员管理 | 强一致性要求,水平扩缩复杂度高,通常通过提升节点规格应对压力 | etcd_disk_wal_fsync_duration_seconds、etcd_server_leader_changes_seen_total |
| kube-controller-manager | 垂直扩缩(VPA) | 领导者选举模式,同一时刻仅一个活跃实例 | workqueue_depth、rest_client_request_duration_seconds |
| kube-scheduler | 垂直扩缩(VPA) | 领导者选举模式,调度决策集中在活跃实例 | scheduler_pending_pods、scheduler_e2e_scheduling_duration_seconds |
3.6 控制面伸缩的架构适配要点
在设计控制面弹性伸缩方案时,需要关注以下架构适配要点:
- 指标精细化:不能仅依赖 CPU/内存利用率,必须引入组件特定的业务指标(如 API 请求排队深度、etcd 写入延迟、调度队列长度)。
- 伸缩安全边界:为控制面组件设置最小/最大副本数或资源规格,防止过度伸缩导致集群控制面过载或资源碎片化。
- 优雅伸缩:对于需要重建的组件(如 VPA 场景),必须实现优雅关闭和 readiness 探测,确保新实例就绪后再停止旧实例。
- 告警联动:Prometheus 告警规则应覆盖伸缩过程中的异常状态,例如:HPA 无法获取指标、VPA 推荐值超出安全范围、etcd 成员变更超时等。