2. Kubernetes 核心概念回顾:Pod、Deployment、Service、Namespace、ResourceQuota

在深入 HPA 弹性伸缩调优之前,必须牢固掌握 Kubernetes 的五个基础抽象。HPA 的每一次决策——从指标采集、目标副本计算到最终扩缩容——都直接与这些原语的交互方式相关。本节以“HPA 视角”重新梳理每个概念,而非泛泛介绍。

2.1 Pod:不可调度的最小单元与 HPA 的扩缩容对象

Pod 是 Kubernetes 中可创建和管理的最小部署单元。一个 Pod 包含一个或多个容器(通常为一个主容器加若干 sidecar),共享网络栈、存储卷和生命周期。

  • HPA 直接操作的对象是 ReplicaSet / StatefulSet,而非 Pod 本身。HPA 通过调整 ReplicaSet 的 replicas 字段,间接控制 Pod 的创建与销毁。
  • Pod 的 资源请求(requests)与限制(limits) 是 HPA 计算目标副本数的核心输入。如果 Pod 未设置 resources.requests.cpu 或 resources.requests.memory,基于指标的 HPA 将无法准确计算利用率。
  • Pod 的 就绪探针(readinessProbe) 影响 HPA 的稳定性:新创建的 Pod 未通过就绪检查时,不会被计入“可用副本”,HPA 会持续扩容直到可用副本数达标。
HPA 关键约束: 被 HPA 管理的 Pod 必须定义 resources.requests,且指标类型(如 CPU 利用率)基于 requests 计算百分比。未设置 requests 的 Pod 会导致 HPA 无法计算目标副本数,行为退化。

2.2 Deployment:声明式更新与 HPA 的协作模式

Deployment 是管理 ReplicaSet 和 Pod 的声明式控制器,提供滚动更新、回滚、副本管理能力。HPA 与 Deployment 的协作遵循以下规则:

特性 Deployment 行为 HPA 影响
滚动更新 逐步替换旧 Pod,保持可用副本数 HPA 在更新期间仍可触发扩缩容,但新 Pod 的 metrics 可能延迟上报
回滚 恢复到历史 ReplicaSet 版本 HPA 的 currentReplicas 会跟随回滚后的副本数重置
副本数管理 Deployment 的 replicas 字段与 HPA 的 spec.minReplicas/maxReplicas 冲突时,HPA 优先 手动修改 Deployment 的 replicas 会被 HPA 立即覆盖
暂停(paused) 暂停 Deployment 的滚动更新 HPA 仍可正常工作,但暂停期间不会触发新的 Pod 模板变更
常见陷阱: 不要在 HPA 生效期间手动修改 Deployment 的 replicas 字段。HPA 控制器每 15 秒(默认)同步一次,手动修改会被覆盖,导致预期外的副本数抖动。

2.3 Service:流量入口与 HPA 的负载均衡前提

Service 为一组 Pod 提供稳定的网络端点(ClusterIP / NodePort / LoadBalancer),通过标签选择器(selector)动态关联 Pod。HPA 的扩缩容效果必须通过 Service 才能被客户端感知:

  • Service 的 selector 必须与 Deployment 的 spec.selector.matchLabels 一致,否则新创建的 Pod 不会被纳入 Service 后端。
  • HPA 扩容后,新 Pod 的 IP 自动加入 Service 的 EndpointSlice;缩容时,旧 Pod 的 IP 在 terminationGracePeriodSeconds 结束后被移除。
  • 对于无状态服务,建议使用 ClusterIP + 轮询(iptables/IPVS) 模式,避免 Session Affinity 导致流量倾斜。
HPA 与 Service / Deployment / Pod 的协作关系 外部客户端 Service (ClusterIP) Pod A (v1) Pod B (v1) Pod C (v2, 扩容中) Deployment HPA 流量路径 客户端 → Service → Pod (轮询) HPA 调整 Deployment → 新增/删除 Pod

2.4 Namespace:多租户隔离与 HPA 的资源边界

Namespace 提供逻辑上的资源隔离,HPA 的生效范围严格限定在单个 Namespace 内。关键影响点:

  • HPA 只能监控同一 Namespace 内的 Pod 指标。跨 Namespace 的指标聚合需要额外配置(如 Prometheus + custom metrics adapter)。
  • ResourceQuota 作用于 Namespace 级别,当 HPA 扩容导致 Namespace 总资源请求超过 Quota 时,新 Pod 会因资源不足而 Pending,HPA 的扩容效果被阻断。
  • 建议为每个业务环境(dev/staging/prod)使用独立 Namespace,并分别配置 HPA 的 minReplicas / maxReplicas。

2.5 ResourceQuota:硬边界与 HPA 的扩容天花板

ResourceQuota 限制 Namespace 内所有 Pod 的资源请求总和(CPU / 内存 / 存储 / 对象数量)。HPA 扩容时必须考虑 Quota 余量:

ResourceQuota 字段 对 HPA 的影响 典型配置示例
requests.cpu 限制所有 Pod 的 CPU 请求总和,HPA 扩容超过此值将导致 Pod Pending requests.cpu: "8"
requests.memory 限制所有 Pod 的内存请求总和,内存密集型服务需重点监控 requests.memory: "16Gi"
limits.cpu 限制所有 Pod 的 CPU 上限总和,防止突发流量打满节点 limits.cpu: "16"
count/pods 限制 Namespace 内 Pod 总数,直接约束 HPA 的 maxReplicas count/pods: "50"
最佳实践: 在部署 HPA 之前,先通过 kubectl describe quota -n <namespace> 查看当前 Quota 使用量。确保 maxReplicas * Pod.requests.cpu < Quota.requests.cpu,避免扩容被 Quota 硬阻断。

2.6 核心概念关系总结

Kubernetes 核心概念关系图(HPA 视角) Namespace ResourceQuota Deployment Service HPA Pod (ReplicaSet) 限制 选择器 调整副本 管理
HPA 调优前置检查清单:
✅ 所有 Pod 已设置 resources.requests.cpu 和 resources.requests.memory
✅ Namespace 的 ResourceQuota 余量 ≥ maxReplicas × Pod.requests
✅ Service 的 selector 与 Deployment 的 matchLabels 完全一致
✅ 未手动修改 Deployment 的 replicas 字段(由 HPA 全权管理)