HPA弹性扩缩容的指标选型困境
Kubernetes原生HPA(Horizontal Pod Autoscaler)默认支持CPU和内存利用率指标,但这两项资源指标在业务场景下存在明显局限性:CPU利用率与业务QPS并非线性关系,内存使用在Java等语言中呈阶梯式增长。实际生产中更需要基于业务指标(如HTTP请求延迟、消息队列深度、自定义业务计数)驱动扩缩容。Prometheus Adapter通过将Prometheus指标转换为Kubernetes自定义指标API,为HPA提供丰富的指标来源。
Prometheus Adapter安装与核心配置
Prometheus Adapter通过Prometheus的PromQL查询将指标暴露给Kubernetes API Server,核心配置文件为rules自定义映射。Helm安装方式最为便捷:
helm repo add prometheus-community https://prometheus-community.github.io/helm-chartshelm install prometheus-adapter prometheus-community/prometheus-adapter \ --set prometheus.url=http://prometheus.monitoring.svc:9090 \ --set prometheus.port=9090 \ --set rules.default=false \ --set metricsRelistInterval=1m
关键参数说明:rules.default=false关闭默认规则,仅使用自定义规则;metricsRelistInterval控制指标发现周期,生产环境建议1分钟,避免指标延迟过大。
自定义规则通过ConfigMap挂载到/etc/adapter/config.yaml:
rules: - seriesQuery: 'http_requests_total{namespace!="",pod!=""}' resources: overrides: namespace: {resource: "namespace"} pod: {resource: "pod"} name: as: "http_requests_per_second" metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)' - seriesQuery: 'rabbitmq_queue_messages{namespace!="",queue!=""}' resources: overrides: namespace: {resource: "namespace"} name: as: "rabbitmq_queue_depth" metricsQuery: 'sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)'
seriesQuery定义从Prometheus查询的原始指标序列;resources字段建立Kubernetes资源与指标标签的映射关系;name.as指定转换后的自定义指标名称;metricsQuery定义聚合逻辑,支持rate、sum等PromQL函数。
HPA基于自定义指标的扩缩容配置
自定义指标API就绪后,在HPA资源中引用指标名称即可驱动扩缩容:
apiVersion: autoscaling/v2kind: HorizontalPodAutoscalermetadata: name: web-api-hpa namespace: productionspec: 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" - type: External external: metric: name: rabbitmq_queue_depth selector: matchLabels: queue: "order-processing" target: type: AverageValue averageValue: "500"
该HPA配置了两条扩缩容规则:当单Pod HTTP请求速率超过1000/s时触发扩容;当订单队列平均深度超过500时触发扩容。两条规则取较大值作为扩容依据。type: Pods表示指标按Pod维度聚合,type: External表示指标来自集群外部(如消息队列中间件)。
扩缩容行为参数调优
HPA的behavior字段精细控制扩缩容速率,避免业务抖动:
behavior: scaleUp: stabilizationWindowSeconds: 30 policies: - type: Percent value: 50 periodSeconds: 60 - type: Pods value: 5 periodSeconds: 60 selectPolicy: Max scaleDown: stabilizationWindowSeconds: 300 policies: - type: Percent value: 10 periodSeconds: 120 selectPolicy: Min
扩容策略:30秒稳定窗口,每60秒最多扩容当前副本数的50%或5个Pod(取较大值)。缩容策略:5分钟稳定窗口防止指标波动导致频繁缩容,每120秒最多缩容10%。这套参数适用于对延迟敏感的在线服务,缩容动作远比扩容保守。
多指标联合扩缩容的决策逻辑
当HPA配置多条metrics规则时,控制器分别计算每条规则期望的副本数,取最大值作为最终目标。这意味着只要任一指标超过阈值,就会触发扩容。对于需要多指标同时超标才扩容的场景,不能直接通过HPA实现,需要在外部控制器(如KEDA)中编写自定义扩缩容逻辑。
验证自定义指标API可用性:
# 查看自定义指标列表kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1# 查看特定指标的当前值kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1/namespaces/production/pods/*/http_requests_per_second# 查看HPA状态kubectl get hpa web-api-hpa -o yaml
生产环境常见问题与排障
指标延迟:Prometheus Adapter缓存指标结果,默认同步周期1分钟。业务高峰期指标可能滞后2-3分钟才反映到HPA决策上。对于秒级突发流量,HPA无法替代限流降级,需搭配HPA+VPA+PodDisruptionBudget构建多层弹性体系。
指标零值:Pod刚启动时Prometheus尚无数据,HPA查询不到指标值,扩缩容计算可能产生异常。解决方案是在metricsQuery中使用or on()向量操作符为空值填充默认值:
metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>) or on() vector(0)'
指标基数爆炸:高基数标签(如URL路径、用户ID)会导致Prometheus指标存储膨胀和查询超时。自定义规则中务必排除高基数标签,仅保留namespace、pod、service等低基数标签。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/kuberneteshpa-zi-ding-yi-zhi-biao-yu-prometheusadapter-tan/