Kubernetes HPA工作原理与扩缩容机制解析
Horizontal Pod Autoscaler(HPA)是Kubernetes内置的自动水平扩缩容控制器,根据Pod资源使用率或自定义指标动态调整Deployment/StatefulSet的副本数。HPA控制器以默认15秒的周期从Metrics Server或自定义指标API获取指标数据,计算目标指标与当前指标的比值,决定扩缩副本数。
扩容决策公式:desiredReplicas = ceil[currentReplicas * (currentMetricValue / desiredMetricValue)]。当指标超过目标值时按比例扩容,低于目标值时按比例缩容。扩容立即执行,缩容默认有5分钟冷却期(--horizontal-pod-autoscaler-downscale-stabilization),防止指标波动导致频繁缩容。
HPA的扩缩行为可通过behavior字段精细控制,支持设置扩容/缩容步长、策略(Pods/Percent)和稳定窗口时间。
Metrics Server部署与CPU/内存基础指标扩缩
Metrics Server是Kubernetes集群指标的核心数据源,为HPA提供CPU和内存使用率指标。部署Metrics Server:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 如果使用自签证书,需添加kubelet-insecure-tls参数
kubectl patch deployment metrics-server -n kube-system --type=json -p='[
{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--kubelet-insecure-tls"}
]'
基础CPU指标HPA配置示例:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-api-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web-api
minReplicas: 3
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
behavior:
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Percent
value: 100
periodSeconds: 60
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Pods
value: 1
periodSeconds: 120
上述配置表示:CPU使用率超过70%触发扩容,每次最多扩容当前副本数的100%,扩容立即执行;缩容冷却5分钟,每2分钟最多缩1个Pod。
Prometheus Adapter与自定义指标扩缩配置
CPU/内存指标仅反映资源水位,无法捕捉业务层面的负载变化。QPS、消息队列深度、请求延迟等业务指标更能真实反映扩缩容需求。Prometheus Adapter将Prometheus采集的自定义指标注册到Kubernetes Metrics API,使HPA可直接使用这些指标做扩缩决策。
Prometheus Adapter部署与配置:
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-adapter-config
data:
config.yaml: |
rules:
- seriesQuery: 'http_requests_total{namespace!="",pod!=""}'
resources:
overrides:
namespace: {resource: "namespace"}
pod: {resource: "pod"}
name:
matches: "http_requests_total"
as: "http_requests_per_second"
metricsQuery: 'sum(rate(<<.Series>>{<<.LabelSelectors>>}[2m])) by (<<.GroupBy>>)'
- seriesQuery: 'rabbitmq_queue_messages{queue="order-queue"}'
resources:
overrides:
namespace: {resource: "namespace"}
name:
matches: "rabbitmq_queue_messages"
as: "order_queue_depth"
基于QPS自定义指标的HPA:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-api-qps-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web-api
minReplicas: 3
maxReplicas: 50
metrics:
- type: Pods
pods:
metric:
name: http_requests_per_second
target:
type: AverageValue
averageValue: 1000
当每个Pod平均QPS超过1000时触发扩容,目标副本数按比例计算。
多指标组合扩缩与生产环境注意事项
HPA支持同时配置多个指标,取各指标计算出的最大副本数作为最终目标。多指标组合策略可以同时保障资源水位和业务质量:
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Pods
pods:
metric:
name: http_requests_per_second
target:
type: AverageValue
averageValue: 1000
- type: Pods
pods:
metric:
name: order_queue_depth
target:
type: AverageValue
averageValue: 500
生产环境需注意以下问题:Pod必须设置resources.requests,否则HPA无法计算CPU使用率;避免HPA与VPA同时管理同一Deployment;缩容稳定窗口不宜过短,防止业务脉冲流量场景下Pod被误缩;大规模集群需关注Metrics Server和Prometheus Adapter的性能瓶颈,合理设置指标采集间隔。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/kuberneteshpa-zi-dong-kuo-suo-rong-pei-zhi-yu-zi-ding-yi/