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 工作原理
- 指标采集:HPA 通过 Metrics Server 或自定义 API 获取 Pod 的当前资源使用率。
- 期望副本计算:使用公式
desiredReplicas = ceil[currentReplicas × (currentMetricValue / desiredMetricValue)]。 - 阈值判定:当计算出的期望副本数超出
minReplicas和maxReplicas范围时,自动截断。 - 执行扩缩容:调用 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 实际变化的完整扩缩容链路,涵盖手动与自动两种触发方式。
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 不被同时终止。
快速验证命令:
该命令可模拟负载,触发 HPA 自动扩容。
kubectl run -i --tty load-generator --image=busybox -- /bin/sh -c "while true; do wget -q -O- http://my-app-service; done"该命令可模拟负载,触发 HPA 自动扩容。