4. HPA 配置实战:创建 HPA 资源对象
Horizontal Pod Autoscaler(HPA)是 Kubernetes 实现工作负载弹性伸缩的核心机制。本节将围绕 HPA 的完整配置流程展开,涵盖资源对象定义、关键参数设置、指标目标配置以及命令行快速创建方法。
4.1 HPA 资源对象结构
HPA 通过 autoscaling/v2 API 版本定义,支持多指标、自定义指标和外部指标。以下是一个完整的 HPA YAML 示例,针对名为 web-server 的 Deployment 进行自动扩缩容:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-server-hpa
namespace: production
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web-server
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
behavior:
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 10
periodSeconds: 60
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Percent
value: 100
periodSeconds: 60
4.2 核心参数详解
| 参数 | 说明 | 推荐值 / 约束 |
|---|---|---|
minReplicas |
最小副本数,保证基础容量 | ≥ 1,建议 2 以上保障高可用 |
maxReplicas |
最大副本数,防止资源耗尽 | ≤ 集群节点可调度 Pod 上限 |
averageUtilization |
目标平均利用率百分比 | CPU 通常 50-80%,内存 60-85% |
stabilizationWindowSeconds |
缩容稳定窗口,防止抖动 | 缩容 300s,扩容 0s(快速响应) |
policies |
扩缩容速率策略 | 扩容 100%/60s,缩容 10%/60s |
关键原则:minReplicas 应满足业务低谷期的流量需求;maxReplicas 应结合集群剩余容量和 Pod 资源请求量计算,避免扩容后节点资源不足导致 Pod 调度失败。
4.3 配置 CPU / 内存利用率目标
HPA 支持同时配置 CPU 和内存指标,两者采用“取最大值”策略决定目标副本数。当任一指标超过目标值时,HPA 会触发扩容。
- CPU 目标:基于 Pod 的
requests.cpu计算利用率。例如 Pod 请求 500m CPU,目标利用率 70%,则目标使用量为 350m。 - 内存目标:基于 Pod 的
requests.memory计算利用率。内存指标存在滞后性,建议配合behavior.scaleDown.stabilizationWindowSeconds防止频繁缩容。 - 多指标协同:HPA 会分别计算每个指标所需的副本数,最终取最大值作为目标副本数。
计算公式:
desiredReplicas = ceil[currentReplicas × (currentMetricValue / targetMetricValue)]
当多个指标存在时:desiredReplicas = max(desiredReplicas_CPU, desiredReplicas_Memory)
desiredReplicas = ceil[currentReplicas × (currentMetricValue / targetMetricValue)]
当多个指标存在时:desiredReplicas = max(desiredReplicas_CPU, desiredReplicas_Memory)
4.4 使用 kubectl autoscale 命令快速创建
对于快速验证场景,kubectl autoscale 命令可以一行创建 HPA,无需编写 YAML 文件:
# 创建 HPA,CPU 目标利用率 70%,副本范围 2-10
kubectl autoscale deployment web-server \
--cpu-percent=70 \
--min=2 \
--max=10 \
--namespace=production
# 查看 HPA 状态
kubectl get hpa web-server-hpa -n production
# 查看 HPA 详细事件
kubectl describe hpa web-server-hpa -n production
注意:kubectl autoscale 仅支持 CPU 指标,无法直接配置内存指标或自定义指标。生产环境建议使用 YAML 文件管理 HPA 配置,便于版本控制和 CI/CD 集成。
4.5 HPA 扩缩容决策流程
下图展示了 HPA 从指标采集到最终执行扩缩容的完整决策链路:
4.6 多指标 HPA 配置示例
以下示例展示了同时配置 CPU 和内存指标,并设置差异化扩缩容行为策略的完整配置:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: multi-metric-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: api-gateway
minReplicas: 3
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 65
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 75
behavior:
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Pods
value: 1
periodSeconds: 60
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Pods
value: 4
periodSeconds: 60
- type: Percent
value: 100
periodSeconds: 60
selectPolicy: Max
最佳实践:扩容策略使用
selectPolicy: Max 同时启用 Pods 和 Percent 策略,取两者中较大的值,确保流量突增时快速扩容;缩容策略使用 selectPolicy: Min(默认),保守缩容避免抖动。
4.7 验证 HPA 配置
创建 HPA 后,建议通过以下步骤验证配置是否生效:
- 检查 HPA 状态:
kubectl get hpa -w观察 TARGETS 列是否显示当前指标值。 - 模拟负载:使用
kubectl run load-generator --image=busybox -- /bin/sh -c "while true; do wget -q -O- http://web-server-service; done"产生 CPU 压力。 - 观察扩缩容:
kubectl describe hpa查看 Events 字段,确认扩容/缩容事件是否按预期触发。 - 验证边界:测试 minReplicas 和 maxReplicas 边界,确保 HPA 不会超出设定范围。
常见问题:如果 HPA 一直显示
<unknown> 或无法获取指标,请检查 Metrics Server 是否正常运行:kubectl get pods -n kube-system | grep metrics-server。确保 Pod 的 requests 字段已正确设置,否则 HPA 无法计算利用率。