2. Kubernetes弹性伸缩基础:HPA原理与局限、Pod生命周期与资源请求/限制、Cluster Autoscaler简介

2.1 弹性伸缩的核心维度

Kubernetes 的弹性伸缩并非单一机制,而是由三个独立但可协同的维度构成。理解这三个维度是掌握 KEDA 与 Knative 协同工作的前提。

维度组件作用范围伸缩对象典型响应时间
Pod 水平Horizontal Pod Autoscaler (HPA)单个 Workload (Deployment/StatefulSet)Pod 副本数15s – 5min
Pod 垂直Vertical Pod Autoscaler (VPA)单个 WorkloadPod 的 CPU/内存请求值分钟级(需重建 Pod)
集群节点Cluster Autoscaler (CA)整个集群Node 数量1 – 10min(取决于云商)
课程聚焦: 本章重点讲解 HPA(水平伸缩)和 Cluster Autoscaler(节点伸缩),因为 KEDA 本质上是 HPA 的增强替代方案,而 Knative 的 Serverless 弹性最终依赖节点级资源的供给。

2.2 HPA 原理与工作流程

HPA 是 Kubernetes 内置的 Pod 水平自动扩缩容控制器。它周期性地(默认 15s)根据 CPU、内存或自定义指标调整目标 Workload 的副本数。

HPA 工作流程 Metrics Server HPA Controller Kubernetes API Deployment ReplicaSet Pod-1 Pod-2 Pod-N 计算公式 期望副本数 = ceil[当前副本数 × (当前指标 / 目标指标)]
  1. 指标采集: Metrics Server 从 Kubelet 的 cAdvisor 接口聚合 Pod 的 CPU/内存使用率。
  2. 计算期望副本: HPA Controller 根据公式 期望副本数 = ceil[当前副本数 × (当前指标值 / 目标指标值)] 计算。
  3. 更新 Workload: 通过 API 修改 Deployment/StatefulSet 的 spec.replicas 字段。
  4. ReplicaSet 调整: Deployment 控制器驱动 ReplicaSet 创建或销毁 Pod。

2.3 HPA 的局限性与痛点

HPA 在设计上存在若干限制,这些限制正是 KEDA 和 Knative 要解决的核心问题。

局限性具体表现对流水线场景的影响
指标源单一原生仅支持 CPU/Memory 和 Prometheus/Custom Metrics API 的简单集成无法直接根据消息队列积压、HTTP 请求排队长度等业务指标伸缩
无“缩容到零”能力HPA 最小副本数只能设为 1,无法缩容到 0流水线空闲时仍需保留至少一个 Pod,造成资源浪费
冷却/稳定窗口僵化--horizontal-pod-autoscaler-downscale-stabilization 全局生效,无法按 Workload 差异化配置短时突发流水线任务可能被冷却窗口延迟扩容
无事件驱动触发HPA 是轮询模型,无法感知 Kafka 消息、CRD 事件等异步事件流水线触发延迟取决于 HPA 的轮询间隔(默认 15s)
不支持外部指标队列深度需要额外部署 Prometheus Adapter 或 Custom Metrics Adapter,配置复杂增加运维复杂度,且 Adapter 本身可能成为性能瓶颈
关键认知: HPA 适合“持续型负载”的弹性伸缩,但对于“事件驱动型”和“突发型”的 CI/CD 流水线场景,其响应速度和灵活性均不足。KEDA 正是作为 HPA 的“事件驱动增强器”而诞生。

2.4 Pod 生命周期与资源请求/限制

弹性伸缩的最终执行单元是 Pod。理解 Pod 的生命周期阶段和资源模型,是配置合理伸缩策略的基础。

2.4.1 Pod 生命周期阶段

Pod 生命周期状态机 Pending Running Succeeded Failed Unknown 流水线场景关键:Pod 在任务完成后应快速进入 Succeeded 状态,避免长期占用 Running 资源
  • Pending: Pod 已被 API 接受,但尚未调度到节点或镜像拉取中。调度器在此阶段检查资源请求。
  • Running: Pod 已绑定到节点,至少一个容器正在运行。HPA 在此阶段采集指标。
  • Succeeded: 所有容器正常退出(退出码 0)。流水线任务完成后的理想状态。
  • Failed: 至少一个容器以非零退出码终止。需要重试或告警。
  • Unknown: 节点失联或 kubelet 无响应。通常需要人工介入。

2.4.2 资源请求与限制

资源请求(requests)和限制(limits)是 HPA 和调度器决策的基础。

参数含义调度器作用HPA 作用CPU 特性内存特性
requestsPod 保证能获得的最小资源量节点必须满足所有 Pod 的 requests 总和 ≤ 节点容量HPA 默认基于 requests 计算利用率可超卖(Burstable)不可超卖,超限即 OOMKill
limitsPod 允许使用的资源上限不影响调度决策不直接影响 HPA,但影响 Pod 运行质量受 CPU CFS 配额限制硬限制,超过即触发 OOM
流水线避坑: 如果流水线 Pod 的 requests 设置过高,会导致节点资源碎片化,Cluster Autoscaler 可能过度扩容;如果 limits 设置过低,编译或测试任务可能因 OOM 被 Kill。建议对流水线 Pod 使用 requests == limits(Guaranteed QoS),避免因资源争抢导致任务不稳定。

2.5 Cluster Autoscaler 简介

Cluster Autoscaler(CA)负责在节点资源不足时自动扩容集群,在节点利用率过低时缩容节点。它与 HPA 形成“Pod 级 + 节点级”的双层弹性。

Cluster Autoscaler 决策流程 Node Group A 当前节点数: 3 可分配 CPU: 6 核 已分配 CPU: 5.8 核 Pending Pods Pod-A: 需要 1 核 Pod-B: 需要 2 核 总计需要: 3 核 CA 决策 扩容 1 个节点 (Node Group A) CA 触发条件 扩容:存在 Pending Pod(因资源不足无法调度)且节点组有扩容配额 缩容:节点利用率低于阈值(默认 50%)且 Pod 可被重新调度到其他节点
  • 扩容触发: 当 HPA 扩容 Pod 后,新 Pod 因节点资源不足进入 Pending 状态,CA 检测到 Pending Pod 后向云商 API 请求新节点。
  • 缩容触发: 当 HPA 缩容 Pod 后,节点利用率持续低于阈值(默认 50%),CA 将节点上的 Pod 驱逐到其他节点,然后释放节点。
  • 与 HPA 的协同: HPA 负责“水平扩缩 Pod”,CA 负责“水平扩缩节点”。两者配合可实现从 Pod 到基础设施的完整弹性闭环。
  • 流水线场景价值: 当大量流水线任务并发触发时,HPA 快速扩容 Pod,CA 随后补充节点资源;任务完成后,HPA 缩容 Pod,CA 回收空闲节点,实现成本优化。
最佳实践: 在配置 CA 时,建议为流水线任务使用独立的节点组(Node Group),并设置 cluster-autoscaler.kubernetes.io/safe-to-evict: "false" 注解保护关键 Pod。同时,CA 的缩容间隔(默认 10min)应与 HPA 的冷却窗口协调,避免频繁的节点震荡。