HPA 自动扩缩容
约 691 字大约 2 分钟
布欧-Lewyon
2026-05-15
首页 › K8s › 调度与资源(在新窗口打开) › HPA 自动扩缩容
什么是 HPA
HPA(Horizontal Pod Autoscaler)根据 CPU、内存或自定义指标自动调整 Deployment/StatefulSet 的副本数。
前提条件
# 安装 Metrics Server(提供 CPU/内存指标)
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 验证
kubectl top nodes
kubectl top podsHPA 示例
基于 CPU 和内存
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: api-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: api-deployment
minReplicas: 2 # 最小副本数
maxReplicas: 10 # 最大副本数
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50 # 目标 CPU 利用率 50%
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80 # 目标内存利用率 80%# 创建 HPA
kubectl apply -f hpa.yaml
# 查看 HPA
kubectl get hpa
# NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
# api-hpa Deployment/api-dep 45%/50%, 60%/80% 2 10 2 5m
# 查看 HPA 详情
kubectl describe hpa api-hpa基于 Pod 的指标(Pods Metric)
根据每个 Pod 的某个指标平均值自动扩缩:
metrics:
- type: Pods
pods:
metric:
name: requests_per_second # 自定义指标
target:
type: AverageValue
averageValue: 1000 # 每个 Pod 平均处理 1000 请求基于对象指标(Object Metric)
根据集群中某个对象(如 Ingress 的请求数)扩缩:
metrics:
- type: Object
object:
metric:
name: requests_per_second
describedObject:
apiVersion: networking.k8s.io/v1
kind: Ingress
name: main-ingress
target:
type: Value
value: 10000 # Ingress 总请求数目标扩缩容行为(1.18+)
spec:
behavior:
scaleDown: # 缩容策略
stabilizationWindowSeconds: 300 # 稳定窗口 5 分钟
policies:
- type: Pods
value: 1 # 每次最多缩 1 个 Pod
periodSeconds: 60
- type: Percent
value: 10 # 或按百分比
periodSeconds: 60
scaleUp: # 扩容策略
stabilizationWindowSeconds: 0
policies:
- type: Percent
value: 100
periodSeconds: 15
selectPolicy: Max # 选择最大策略测试 HPA
# 创建带资源 requests 的 Deployment
kubectl create deployment cpu-stress --image=nginx:alpine
kubectl set resources deployment cpu-stress -c=nginx --requests=cpu=100m,memory=128Mi
# 创建 HPA
kubectl autoscale deployment cpu-stress --cpu-percent=50 --min=1 --max=5
# 模拟压力
kubectl run -it --rm load-generator --image=busybox -- /bin/sh -c "while true; do wget -q -O- http://cpu-stress; done"
# 观察扩缩
kubectl get hpa -w
kubectl get pods -w约束
- 被 HPA 管理的 Deployment 必须设置
requests(否则 HPA 无法计算利用率)。 - Metrics Server 只提供 CPU 和内存,自定义指标需要部署 Prometheus Adapter / Metrics Server 适配器。
- HPA 对 StatefulSet 也有效,但对 StatefulSet 扩缩不会自动调整 PVC。
小结
- HPA 根据指标自动调整副本数,前提是 Metrics Server 已安装。
- 支持资源指标(CPU/内存)、Pod 指标(每个 Pod 平均值)、对象指标(集群对象)三种类型。
behavior字段自定义扩缩容行为(稳定窗口、速率限制)。- 被 HPA 管理的 Pod 必须设置
resources.requests。 kubectl get hpa -w实时观察扩缩过程。
上一节:调度策略 下一节:kubectl 进阶与调试
