Kubernetes原生HPA的局限
Kubernetes Horizontal Pod Autoscaler默认只支持CPU和内存两种资源指标做扩缩容决策。对于消息队列深度、HTTP请求延迟、自定义业务指标等场景,原生HPA无法直接响应。Prometheus Adapter和KEDA分别从两个方向解决了这一问题:前者将Prometheus指标暴露给Kubernetes Metrics API,后者作为独立扩缩容控制器直接对接事件源。
Prometheus Adapter部署与指标映射
Prometheus Adapter的核心功能是将Prometheus查询结果转换为Kubernetes Metrics API格式,让HPA能消费任意Prometheus指标。部署流程:
# Helm安装
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install prometheus-adapter prometheus-community/prometheus-adapter \
--set prometheus.url=http://prometheus.monitoring:9090 \
--set rules.default=false
关键配置在ConfigMap中定义指标发现规则,将Prometheus指标名映射为Metrics API的指标名:
rules:
- seriesQuery: 'http_requests_total{namespace!="",pod!=""}'
resources:
overrides:
namespace: {resource: "namespace"}
pod: {resource: "pod"}
name:
matches: "^(.*)_total"
as: "${1}_per_second"
metricsQuery: "sum(rate(<<.>>, 30s)) by (<<.>>)"
验证指标是否暴露成功:
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1" | jq .
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/http-requests-per-second" | jq .
基于自定义指标的HPA配置
指标映射完成后,HPA配置与标准写法一致,只是指标类型改为Custom:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: api-server-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: api-server
minReplicas: 2
maxReplicas: 20
metrics:
- type: Pods
pods:
metric:
name: http_requests_per_second
target:
type: AverageValue
averageValue: 1000
当每个Pod平均QPS超过1000时触发扩容。Prometheus Adapter的延迟取决于Prometheus查询速度和Metrics API的缓存刷新间隔(默认30秒),对于秒级突增流量的场景响应偏慢。
KEDA事件驱动的扩缩容
KEDA(Kubernetes Event-driven Autoscaling)直接对接消息队列、数据库、HTTP等事件源,无需经过Prometheus中转。部署KEDA Operator:
helm repo add kedacore https://kedacore.github.io/charts
helm install keda kedacore/keda --namespace keda --create-namespace
以Kafka消费者组Lag为扩缩容触发器的配置示例:
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: order-processor-scaler
spec:
scaleTargetRef:
name: order-processor
minReplicaCount: 1
maxReplicaCount: 30
pollingInterval: 10
cooldownPeriod: 60
triggers:
- type: kafka
metadata:
bootstrapServers: kafka.default:9092
consumerGroup: order-processor-group
topic: orders
lagThreshold: "500"
KEDA每10秒检查一次Kafka Lag,当Lag超过500时增加Pod数量,每个Pod分摊500条消息的Lag。cooldownPeriod设60秒防止流量尖峰后的频繁缩容。
两种方案的选型建议
Prometheus Adapter适合已有Prometheus监控体系且扩缩容指标与业务指标一致的团队,额外运维成本低,只需维护指标映射规则。KEDA适合需要响应事件流(消息队列、Cron定时、外部HTTP调用)的场景,扩缩容延迟更低,且支持缩容到零。
两者并非互斥。生产环境中,CPU/内存用原生HPA,自定义业务指标用Prometheus Adapter,消息队列驱动用KEDA,三层策略协同工作。
扩缩容抖动与稳定性调优
自动扩缩容上线后最常见的运营问题是抖动:流量小幅波动导致Pod数频繁增减。解决方式包括:调整HPA的toleration窗口(默认10%),设置stabilizationWindowSeconds延迟缩容决策,以及KEDA的cooldownPeriod和pollingInterval配合。生产环境建议缩容窗口不低于300秒,扩容窗口不超过60秒,确保快速响应流量增长同时避免缩容抖动。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/kuberneteshpa-zi-ding-yi-zhi-biao-zi-dong-kuo-suo-rong-cong/