Prometheus Adapter完全指南:如何让Kubernetes HPA基于应用指标自动扩缩容

【免费下载链接】prometheus-adapter An implementation of the custom.metrics.k8s.io API using Prometheus 【免费下载链接】prometheus-adapter 项目地址: https://gitcode.com/gh_mirrors/pr/prometheus-adapter

Prometheus Adapter是实现custom.metrics.k8s.io API的关键组件,它能帮助Kubernetes集群中的Horizontal Pod Autoscaler(HPA)基于Prometheus收集的应用指标实现自动扩缩容。本文将详细介绍如何部署、配置Prometheus Adapter,并实现基于自定义指标的HPA自动扩缩容。

为什么需要Prometheus Adapter?

在Kubernetes中,默认的HPA仅支持CPU和内存等基础资源指标。但现代应用通常需要基于业务指标(如每秒请求数、队列深度、错误率等)进行扩缩容。Prometheus Adapter作为自定义指标API的实现,能够将Prometheus收集的丰富指标暴露给Kubernetes API,从而让HPA实现基于任意应用指标的自动扩缩容。

快速部署Prometheus Adapter的步骤

前提条件

  • Kubernetes集群版本1.8+(推荐1.9+)
  • 已部署Prometheus(建议使用Prometheus Operator
  • 已启用Kubernetes API聚合层
  • 已部署metrics-server

克隆代码仓库

git clone https://gitcode.com/gh_mirrors/pr/prometheus-adapter
cd prometheus-adapter

部署Prometheus Adapter

项目提供了完整的部署清单,位于deploy/manifests/目录下,包含了部署所需的所有Kubernetes资源:

kubectl apply -f deploy/manifests/

注意:如果您的集群不是x86_64架构,需要修改Deployment中的镜像字段,选择对应架构的镜像。官方多架构镜像地址为registry.k8s.io/prometheus-adapter/prometheus-adapter:${VERSION}

配置Prometheus Adapter核心参数

Prometheus Adapter的配置通过ConfigMap进行管理,默认配置文件为deploy/manifests/config-map.yaml。关键配置项包括:

规则配置(rules)

规则定义了如何从Prometheus指标转换为Kubernetes自定义指标,以下是一个基础配置示例:

rules:
- seriesQuery: '{namespace!="", __name__!~"^container_.*"}'
  resources:
    template: "<<.Resource>>"
  name:
    matches: "^(.*)_total"
    as: ""
  metricsQuery: |
    sum by (<<.GroupBy>>) (
      irate(
        <<.Series>>{<<.LabelMatchers>>}[1m]
      )
    )

这个配置将所有非容器指标(__name__!~"^container_.*")中以_total结尾的指标转换为速率指标(使用irate函数计算1分钟内的速率)。

与Prometheus通信配置

确保Adapter能够正确访问Prometheus,配置项包括:

prometheus:
  url: http://prometheus-server.monitoring.svc
  port: 80
  path: ""

创建基于自定义指标的HPA

准备示例应用

首先部署一个暴露指标的示例应用,部署清单如下:

# sample-app.deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample-app
  labels:
    app: sample-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sample-app
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
      - image: luxas/autoscale-demo:v0.1.2
        name: metrics-provider
        ports:
        - name: http
          containerPort: 8080
# sample-app.service.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: sample-app
  name: sample-app
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: sample-app
  type: ClusterIP

部署应用:

kubectl apply -f sample-app.deploy.yaml
kubectl apply -f sample-app.service.yaml

创建ServiceMonitor监控应用

使用Prometheus Operator的ServiceMonitor资源来监控示例应用:

# sample-app.monitor.yaml
kind: ServiceMonitor
apiVersion: monitoring.coreos.com/v1
metadata:
  name: sample-app
  labels:
    app: sample-app
spec:
  selector:
    matchLabels:
      app: sample-app
  endpoints:
  - port: http

部署ServiceMonitor:

kubectl apply -f sample-app.monitor.yaml

创建基于自定义指标的HPA

创建HPA资源,基于http_requests指标进行扩缩容:

# sample-app.hpa.yaml
kind: HorizontalPodAutoscaler
apiVersion: autoscaling/v2
metadata:
  name: sample-app
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: sample-app
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Pods
    pods:
      metric:
        name: http_requests
      target:
        type: Value
        averageValue: 500m

部署HPA:

kubectl apply -f sample-app.hpa.yaml

这个HPA配置表示:当平均每个Pod的http_requests指标达到500m(即0.5个请求/秒)时,开始自动扩容,最多扩容到10个副本。

验证与测试HPA自动扩缩容

检查HPA状态

部署HPA后,可以通过以下命令检查其状态:

kubectl describe hpa sample-app

正常情况下,应该能看到HPA成功获取到指标,类似如下输出:

Metrics:  ( current / target )
  "http_requests" on pods:  0 / 500m
Min replicas:  1
Max replicas:  10
Deployment pods: 1 current / 1 desired

生成流量测试扩容

通过curl命令向示例应用发送请求,生成流量:

while true; do curl http://$(kubectl get service sample-app -o jsonpath='{ .spec.clusterIP }')/metrics; sleep 0.5; done

持续发送请求一段时间后,再次检查HPA状态,应该能看到Pod数量开始增加:

Metrics:  ( current / target )
  "http_requests" on pods:  1200m / 500m
Min replicas:  1
Max replicas:  10
Deployment pods: 3 current / 3 desired

停止流量测试缩容

停止发送请求后,等待几分钟,HPA会自动将Pod数量缩容到初始值:

Metrics:  ( current / target )
  "http_requests" on pods:  0 / 500m
Min replicas:  1
Max replicas:  10
Deployment pods: 1 current / 1 desired

高级配置与最佳实践

多指标扩缩容

HPA支持同时基于多个指标进行扩缩容,例如同时考虑CPU使用率和自定义指标:

metrics:
- type: Resource
  resource:
    name: cpu
    target:
      type: Utilization
      averageUtilization: 80
- type: Pods
  pods:
    metric:
      name: http_requests
    target:
      type: Value
      averageValue: 500m

外部指标配置

Prometheus Adapter还支持外部指标(External Metrics),配置方法可参考docs/externalmetrics.md。外部指标适用于需要基于集群外系统指标进行扩缩容的场景。

配置优化建议

  1. 指标查询优化:确保Prometheus查询语句高效,避免使用过于复杂的聚合操作。
  2. 合理设置指标窗口:使用irate函数时,窗口大小建议设置为Prometheus scrape interval的2-3倍。
  3. 避免抖动:通过设置stabilizationWindowSeconds参数,避免HPA频繁扩缩容。
  4. 定期检查配置:随着应用变化,定期检查Prometheus Adapter配置,确保指标转换规则仍然适用。

常见问题解决

自定义指标不显示

如果通过kubectl get --raw /apis/custom.metrics.k8s.io/v1beta2命令看不到预期的指标,可能原因:

  1. Prometheus未正确收集到指标:检查Prometheus UI,确认指标存在。
  2. Adapter配置错误:检查config-map.yaml中的规则配置,确保指标匹配正确。
  3. 标签不匹配:确保Prometheus指标中的标签(如namespacepod)与Adapter配置中的标签匹配。

HPA无法获取指标

如果HPA事件中显示无法获取指标,可能原因:

  1. API服务未注册:检查APIService资源是否正确部署,可通过kubectl get apiservice v1beta2.custom.metrics.k8s.io命令查看。
  2. Adapter未正常运行:检查Prometheus Adapter的Pod日志,查看是否有错误信息。
  3. 权限问题:确保Adapter的Service Account具有足够的权限访问Prometheus和Kubernetes API。

总结

通过Prometheus Adapter,Kubernetes HPA可以突破基础资源指标的限制,基于任意Prometheus收集的应用指标实现自动扩缩容。本文详细介绍了Prometheus Adapter的部署、配置和使用方法,包括如何创建基于自定义指标的HPA,并提供了最佳实践和常见问题解决方法。

要深入了解Prometheus Adapter的配置选项,可以参考docs/config.mddocs/config-walkthrough.md。通过合理配置和使用Prometheus Adapter,可以让Kubernetes应用更加智能、高效地应对流量变化。

【免费下载链接】prometheus-adapter An implementation of the custom.metrics.k8s.io API using Prometheus 【免费下载链接】prometheus-adapter 项目地址: https://gitcode.com/gh_mirrors/pr/prometheus-adapter

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐