16.3.9 HPA/VPA弹性伸缩基础
本节介绍 Kubernetes 中基于资源与负载的弹性伸缩机制,重点覆盖 HPA(Horizontal Pod Autoscaler)与 VPA(Vertical Pod Autoscaler)的基本概念、使用方式与典型场景,并给出安装、示例、排错与练习。
一、HPA 横向弹性伸缩基础
原理草图(HPA 指标驱动)
- 核心目标:根据负载自动调整 Pod 副本数,实现服务容量的动态扩展与收缩。
- 常见指标:CPU/内存利用率、自定义指标(如 QPS、队列长度)。
- 依赖组件:Metrics Server 或自定义指标采集(如 Prometheus Adapter)。
- 工作原理:周期性采集指标 → 计算期望副本数 → 调整目标副本。
1)安装 Metrics Server(示例)
# 安装 metrics-server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 若为自签证书或不安全环境,可添加参数(示例)
kubectl -n kube-system edit deployment metrics-server
# 在容器参数中加入:
# - --kubelet-insecure-tls
# - --kubelet-preferred-address-types=InternalIP,Hostname,ExternalIP
# 验证指标
kubectl top nodes
kubectl top pods -A
2)HPA 示例(基于 CPU)
# 创建一个示例 Deployment
kubectl create deployment web --image=nginx:1.25 --replicas=2
kubectl expose deployment web --port=80
# 设置资源请求(HPA 依赖 requests)
kubectl patch deployment web -p '{
"spec":{"template":{"spec":{"containers":[{
"name":"nginx",
"resources":{"requests":{"cpu":"100m","memory":"128Mi"}}
}]}}}}'
# 创建 HPA
kubectl autoscale deployment web --cpu-percent=50 --min=2 --max=6
# 查看 HPA 状态
kubectl get hpa
kubectl describe hpa web
3)负载模拟与预期效果
# 使用临时 Pod 进行压测
kubectl run -i --tty load --image=busybox:1.36 --rm -- /bin/sh
# 在容器内执行循环请求
while true; do wget -q -O- http://web.default.svc.cluster.local >/dev/null; done
- 预期效果:
kubectl get hpa中 CPU 利用率升高,副本数逐步增加;停止压测后逐步缩容。
4)HPA 常见问题与排错
# 1. HPA 无法获取指标
kubectl describe hpa web
# 关注 Events 中的 metrics 获取失败
# 2. Metrics Server 状态
kubectl -n kube-system get pods | grep metrics-server
kubectl -n kube-system logs deploy/metrics-server
# 3. Pod 无资源 requests 导致计算异常
kubectl get deploy web -o jsonpath='{.spec.template.spec.containers[0].resources}'
二、VPA 纵向弹性伸缩基础
原理草图(VPA 调整资源)
- 核心目标:根据历史负载自动调整 Pod 的资源请求与限制(requests/limits)。
- 运行模式:Off / Auto / Initial
- 注意事项:Auto 会触发 Pod 重建,需评估中断影响。
1)安装 VPA(示例)
# 官方 VPA 安装
kubectl apply -f https://github.com/kubernetes/autoscaler/releases/latest/download/vertical-pod-autoscaler.yaml
# 验证组件
kubectl -n kube-system get deploy | grep vpa
2)VPA 示例(推荐模式)
# 文件:vpa-web.yaml
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: vpa-web
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: web
updatePolicy:
updateMode: "Off" # 仅推荐
kubectl apply -f vpa-web.yaml
kubectl describe vpa vpa-web
# 查看推荐值(Recommendation)
3)切换为 Initial/Auto(示例)
# 文件:vpa-web-auto.yaml
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: vpa-web
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: web
updatePolicy:
updateMode: "Auto" # 自动调整并重建 Pod
kubectl apply -f vpa-web-auto.yaml
kubectl rollout status deployment/web
4)VPA 排错要点
# 1. VPA 组件是否可用
kubectl -n kube-system get pods | grep vpa
# 2. VPA 是否绑定正确目标
kubectl get vpa vpa-web -o yaml | grep -A5 targetRef
# 3. 是否被 PodDisruptionBudget 阻止
kubectl get pdb -A
三、HPA 与 VPA 的选择与组合
- HPA 适合:流量波动明显、可横向扩展的无状态应用。
- VPA 适合:资源需求稳定但难以预估的应用。
- 组合原则:通常 HPA 负责副本数,VPA 负责资源推荐;避免同时对同一资源维度生效。
- 生产建议:优先落地 HPA,VPA 以推荐/初始模式逐步验证。
四、实践要点与常见问题
- 资源 requests 设置过低会导致 HPA 扩容不及时。
- 指标采集不稳定会引发频繁伸缩,需设置合理的阈值与冷却时间。
- 扩缩容频繁时注意下游依赖与连接数限制。
- 配合 Pod 探针与滚动更新机制,避免扩缩容引起的服务抖动。
伸缩行为参数示例(HPA v2)
# 文件:hpa-web-v2.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web
minReplicas: 2
maxReplicas: 6
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
behavior:
scaleUp:
stabilizationWindowSeconds: 60
policies:
- type: Percent
value: 100
periodSeconds: 60
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 50
periodSeconds: 60
kubectl apply -f hpa-web-v2.yaml
kubectl describe hpa web
五、练习
1)安装 Metrics Server 并验证 kubectl top pods 输出。
2)创建 nginx Deployment,设置 CPU requests 为 100m,创建 HPA(50%),压测触发扩容。
3)安装 VPA,创建推荐模式,观察推荐值并记录。
4)将 HPA 改为 v2 版本并设置 scaleDown 的稳定窗口为 300 秒,观察缩容频率变化。