Kubernetes Horizontal Pod Autoscaler(HPA)是容器编排中实现弹性伸缩的核心组件。通过监控Pod资源使用率,自动调整Deployment副本数量,实现流量高峰扩容、低谷缩容。本文详细介绍HPA的配置方法,从基础CPU/内存指标到自定义指标扩缩容,包含Metrics Server部署、HPA策略调优和常见问题排查。
HPA工作原理与扩缩容机制
HPA控制器定期(默认15秒)从Metrics Server或自定义指标API获取Pod指标数据,计算当前指标值与目标值的比值,据此调整副本数。扩容逻辑:当前指标/目标指标 x 当前副本数 = 期望副本数。缩容更保守,默认有5分钟稳定窗口,避免流量波动导致频繁缩容。
HPA支持三类指标源:Resource类型(CPU/内存利用率)、Pods类型(自定义Pod指标如QPS)、Object类型(外部指标如消息队列长度)。生产环境中常组合使用多种指标实现更精准的扩缩容决策。
部署Metrics Server获取资源指标
Metrics Server是HPA使用CPU/内存指标的前提。它通过Kubelet的Summary API聚合集群资源使用数据。
# 部署Metrics Server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 验证部署状态
kubectl get pods -n kube-system -l k8s-app=metrics-server
# 测试指标获取
kubectl top nodes
kubectl top pods -n default
# 确认API可用
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes"
如果Pod处于CrashLoopBackOff,常见原因是kubelet证书问题。在metrics-server启动参数中添加–kubelet-insecure-tls跳过证书验证(仅测试环境使用,生产环境应正确配置证书)。
基于CPU利用率的HPA基础配置
先确保Deployment定义了resources.requests.cpu,HPA计算利用率时以此为分母。
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-server
spec:
replicas: 2
selector:
matchLabels:
app: api-server
template:
metadata:
labels:
app: api-server
spec:
containers:
- name: api
image: registry.example.com/api-server:v2.1
resources:
requests:
cpu: 250m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
ports:
- containerPort: 8080
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: api-server-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: api-server
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 70
behavior:
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 50
periodSeconds: 60
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Percent
value: 100
periodSeconds: 15
- type: Pods
value: 4
periodSeconds: 15
selectPolicy: Max
扩缩容行为参数详解
behavior字段是HPA调优的核心,控制扩缩容的速度和节奏:
scaleUp.stabilizationWindowSeconds设为0表示检测到指标超限立即扩容。scaleDown.stabilizationWindowSeconds设为300表示指标连续5分钟低于目标才触发缩容。这符合弹性伸缩的实际需求——扩容要快,缩容要慢。
scaleUp配置了两种策略取最大值:Percent 100%表示15秒内最多翻倍,Pods 4表示15秒内最多新增4个副本。selectPolicy: Max确保取更激进的策略,快速应对流量突增。scaleDown的Percent 50限制每次最多缩容一半副本,避免缩容过快影响服务。
# 验证HPA状态
kubectl get hpa api-server-hpa
# 查看HPA详细事件
kubectl describe hpa api-server-hpa
# 实时监控HPA变化
kubectl get hpa -w
基于自定义指标的HPA配置
CPU/内存指标无法覆盖所有场景。比如IO密集型应用CPU利用率低但请求积压,需要基于QPS扩容。这需要部署自定义指标Pipeline:Prometheus采集 + Prometheus Adapter将指标暴露给K8s API。
# 部署Prometheus Adapter
helm install prom-adapter prometheus-community/prometheus-adapter --set prometheus.url=http://prometheus-server.monitoring.svc --set prometheus.port=8080 --set rules.default=false
# 配置自定义指标规则
cat > custom-metrics.yaml << 'EOF'
rules:
- seriesFilters:
- {notation: "^(.*)_total$"}
seriesQuery: 'http_requests_total{namespace!="",pod!=""}'
resources:
overrides:
namespace: {resource: "namespace"}
pod: {resource: "pod"}
name:
matches: "^(.*)_total"
as: "requests_per_second"
metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)'
EOF
kubectl apply -f custom-metrics.yaml
# 验证自定义指标可用
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/requests_per_second"
基于自定义指标的HPA配置:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: api-server-custom-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: api-server
minReplicas: 3
maxReplicas: 20
metrics:
- type: Pods
pods:
metric:
name: requests_per_second
target:
type: AverageValue
averageValue: "1000"
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
HPA常见故障排查
HPA显示unknown指标值是最常见问题,原因排查路径:
检查Metrics Server运行状态和kubelet端口连通性;确认Deployment中所有Pod都定义了resources.requests;检查HPA的scaleTargetRef指向的Deployment名称是否正确;权限问题导致HPA无法读取指标,检查RBAC配置。
# 排查unknown指标
kubectl describe hpa api-server-hpa | grep -A5 Conditions
# 常见错误信息分析:
# "unable to fetch metrics from resource metrics API" -> Metrics Server问题
# "the HPA controller was unable to get the target's current scale" -> Deployment名称不匹配
# "missing request for cpu" -> Pod未设置resources.requests
# 查看Metrics Server日志
kubectl logs -n kube-system -l k8s-app=metrics-server --tail=50
# 检查Pod的resource requests是否设置
kubectl get deployment api-server -o jsonpath='{.spec.template.spec.containers[0].resources}'
生产环境弹性伸缩最佳实践
minReplicas设为至少2保证高可用,避免缩容到1个Pod成为瓶颈点。maxReplicas根据集群资源上限设定,需配合Cluster Autoscaler确保扩容时有足够节点调度。扩容策略优先速度,缩容策略优先稳定,根据业务流量模式调整stabilizationWindowSeconds。
监控告警体系方面,设置HPA扩缩容事件告警,防止异常扩容耗尽集群资源;定期进行混沌工程演练,压测验证HPA扩容速度是否满足SLA;CI/CD流水线中加入HPA配置校验,防止错误配置导致扩缩容失效。合理配置的HPA能将应用响应延迟稳定在目标范围内,同时避免资源浪费,是SRE稳定性建设的重要组成部分。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/kuberneteshpa-zi-dong-kuo-suo-rong-pei-zhi-ji-yu-cpu-nei/