3. Deployment 副本管理:replicas 字段详解、手动扩缩容、自动扩缩容 (HPA) 基础

副本管理是 Deployment 控制器的核心能力,它直接决定了集群中运行的应用实例数量。本章将深入解析 replicas 字段的语义与行为,并分别介绍手动与自动两种扩缩容模式,帮助你在生产环境中精准控制资源规模。

3.1 replicas 字段详解

replicas 是 Deployment 规范中的必选字段,定义在 spec.replicas 下,类型为整型,默认值为 1。它声明了期望运行的 Pod 副本数量,Deployment 控制器通过 ReplicaSet 确保实际运行数始终与期望值一致。

字段属性 说明
位置 spec.replicas
类型 int32
默认值 1
更新方式 支持滚动更新、原地更新
与 HPA 关系 HPA 可动态修改此值,但受 minReplicas/maxReplicas 约束
与 ReplicaSet 关系 每个 Deployment 版本对应一个 ReplicaSet,其 replicas 由 Deployment 控制
关键行为:修改 spec.replicas 会立即触发 ReplicaSet 的扩缩容操作。如果同时存在多个版本的 ReplicaSet(滚动更新中),Deployment 会按比例分配副本,确保更新平滑。

3.2 手动扩缩容

手动扩缩容是最直接的控制方式,适用于计划性容量调整或临时故障恢复。支持两种操作路径:

3.2.1 使用 kubectl scale 命令

# 将 my-app 的副本数调整为 5
kubectl scale deployment my-app --replicas=5

# 基于当前副本数增加 3 个副本(相对扩缩容)
kubectl scale deployment my-app --current-replicas=3 --replicas=6

3.2.2 编辑 YAML 文件并应用

# 修改 deployment.yaml 中的 spec.replicas 字段
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 5   # 从 3 改为 5
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: app
        image: nginx:1.25

# 应用变更
kubectl apply -f deployment.yaml
注意:手动扩缩容与 HPA 同时启用时,HPA 会覆盖手动设置的 replicas 值。如果希望保留手动调整,需先删除或暂停 HPA 资源。

3.3 自动扩缩容 (HPA) 基础

HorizontalPodAutoscaler (HPA) 是 Kubernetes 内置的自动扩缩容机制,基于 CPU、内存或自定义指标动态调整 Deployment 的 replicas 值。HPA 以控制循环方式工作,默认每 15 秒评估一次指标。

3.3.1 HPA 工作原理

  1. 指标采集:HPA 通过 Metrics Server 或自定义 API 获取 Pod 的当前资源使用率。
  2. 期望副本计算:使用公式 desiredReplicas = ceil[currentReplicas × (currentMetricValue / desiredMetricValue)]。
  3. 阈值判定:当计算出的期望副本数超出 minReplicas 和 maxReplicas 范围时,自动截断。
  4. 执行扩缩容:调用 Deployment 的 Scale 子资源更新 spec.replicas。
核心公式解读:如果当前 CPU 使用率为 80%,目标值为 50%,则期望副本数 = 当前副本数 × (80% / 50%) = 1.6 倍。若当前为 3 个副本,则期望为 5 个(向上取整)。

3.3.2 创建 HPA 资源

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80

3.3.3 HPA 关键参数对比

参数 类型 说明 默认值
minReplicas int32 最小副本数,防止缩容过度 1
maxReplicas int32 最大副本数,防止资源耗尽 无(必填)
averageUtilization int32 目标平均利用率百分比 无(必填)
behavior.scaleUp 对象 扩容策略(稳定窗口、策略、选择策略) 默认快速扩容
behavior.scaleDown 对象 缩容策略(稳定窗口、策略、选择策略) 默认 5 分钟稳定窗口

3.4 扩缩容流程与状态转换

下图展示了从用户操作到 Pod 实际变化的完整扩缩容链路,涵盖手动与自动两种触发方式。

Deployment 副本扩缩容流程 用户 kubectl scale HPA 控制器 kubectl apply Kubernetes API Server (Scale 子资源) Deployment Controller 更新 spec.replicas ReplicaSet 调整 Pod 数量 Pod 实例 1 Pod 实例 2 Pod 实例 N Pod 实例 N+1 说明 手动/自动触发均通过 API Server 的 Scale 子 资源更新 replicas

3.5 手动 vs 自动扩缩容对比

维度 手动扩缩容 自动扩缩容 (HPA)
触发方式 用户命令或 API 调用 基于指标阈值自动触发
响应速度 即时生效 依赖指标采集周期(默认 15s)
适用场景 计划性扩容、故障恢复、维护窗口 流量波动、负载不可预测
资源开销 无额外组件 需部署 Metrics Server
精细控制 完全由人决策 可配置扩容/缩容策略、稳定窗口
风险 人工误操作、响应延迟 指标抖动导致频繁扩缩容

3.6 生产实践建议

  • 设置合理的 minReplicas:至少 2 个副本以保证滚动更新和故障容错。
  • 配置 HPA 行为策略:使用 behavior 字段控制扩容/缩容速率,避免指标抖动引发震荡。
  • 监控 HPA 状态:通过 kubectl describe hpa 查看当前指标值和期望副本数,及时发现异常。
  • 避免手动与自动冲突:如果启用了 HPA,不要手动修改 spec.replicas,除非先暂停 HPA。
  • 结合 PodDisruptionBudget:在缩容时配合 PDB 确保关键 Pod 不被同时终止。
快速验证命令:
kubectl run -i --tty load-generator --image=busybox -- /bin/sh -c "while true; do wget -q -O- http://my-app-service; done"
该命令可模拟负载,触发 HPA 自动扩容。