Kubernetes Prometheus Adapter 实战指南:实现自定义指标自动扩缩容

Kubernetes Prometheus Adapter 实战指南:实现自定义指标自动扩缩容

前言

在现代云原生应用中,基于自定义指标进行自动扩缩容是提升应用弹性和资源利用率的重要手段。本文将详细介绍如何使用 Kubernetes Prometheus Adapter 实现基于 Prometheus 监控数据的自动扩缩容方案。

核心概念解析

Prometheus Adapter 是什么

Prometheus Adapter 是一个 Kubernetes API 扩展组件,它能够将 Prometheus 收集的监控指标转换为 Kubernetes 自定义指标 API 格式。这使得 Horizontal Pod Autoscaler (HPA) 能够基于 Prometheus 中的任意指标进行自动扩缩容决策。

工作原理

  1. 指标收集:Prometheus 定期从应用 Pod 中抓取指标数据
  2. 指标转换:Prometheus Adapter 查询 Prometheus 并将结果转换为 Kubernetes 自定义指标 API 格式
  3. 自动扩缩容:HPA 通过查询自定义指标 API 获取指标数据,根据配置的策略进行扩缩容决策

环境准备

集群要求

  1. Kubernetes 1.8+ 版本(推荐 1.9+)
  2. 已启用 API 聚合层
  3. 控制器管理器配置为使用指标 API
  4. metrics-server 已正确部署(Kubernetes 1.9+ 默认包含)

必要组件

  1. Prometheus 监控系统(推荐使用 Prometheus Operator 部署)
  2. Prometheus Adapter 组件
  3. 待监控的示例应用

实战步骤

第一步:部署示例应用

我们首先部署一个简单的 Web 应用,该应用会暴露一个 HTTP 请求计数器指标 http_requests_total

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

同时创建对应的 Service:

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 get pods
curl http://$(kubectl get service sample-app -o jsonpath='{ .spec.clusterIP }')/metrics

第二步:配置 Prometheus 监控

创建 ServiceMonitor 资源,告诉 Prometheus 监控我们的示例应用:

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

部署后,确保 Prometheus 中能够看到 http_requests_total 指标,并且该指标包含 namespacepod 标签。

第三步:部署 Prometheus Adapter

Prometheus Adapter 需要以下关键配置:

apiVersion: v1
kind: ConfigMap
metadata:
  name: adapter-config
  namespace: monitoring
data:
  config.yaml: |-
    "rules":
    - "seriesQuery": |
         {namespace!="",__name__!~"^container_.*"}
      "resources":
        "template": "<<.Resource>>"
      "name":
        "matches": "^(.*)_total"
        "as": ""
      "metricsQuery": |
        sum by (<<.GroupBy>>) (
          irate (
            <<.Series>>{<<.LabelMatchers>>}[1m]
          )
        )

这个配置会:

  1. 查询所有包含 namespace 标签且不以 container_ 开头的指标
  2. _total 后缀的计数器指标转换为速率指标
  3. 使用 irate 函数计算 1 分钟内的请求速率

第四步:注册自定义指标 API

创建 APIService 资源,将自定义指标 API 注册到 Kubernetes API 聚合层:

apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  name: v1beta2.custom.metrics.k8s.io
spec:
  group: custom.metrics.k8s.io
  groupPriorityMinimum: 100
  insecureSkipTLSVerify: true
  service:
    name: prometheus-adapter
    namespace: monitoring
  version: v1beta2
  versionPriority: 100

第五步:验证指标可用性

检查自定义指标 API 是否已注册:

kubectl get --raw /apis/custom.metrics.k8s.io/v1beta2

查询具体的指标值:

kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta2/namespaces/default/pods/*/http_requests?selector=app%3Dsample-app"

第六步:配置 Horizontal Pod Autoscaler

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

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

这个配置表示:

  • 当每个 Pod 的平均请求速率超过 0.5 个请求/秒时,自动扩容
  • 副本数范围在 1 到 10 之间

第七步:测试自动扩缩容

生成一些流量来触发自动扩容:

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

观察 HPA 状态变化:

kubectl get hpa sample-app -w

常见问题排查

  1. 指标未显示

    • 检查 Prometheus 是否成功抓取了指标
    • 验证 ServiceMonitor 的标签选择器是否正确
    • 确保指标包含必要的标签(如 namespace 和 pod)
  2. HPA 无法获取指标

    • 检查 APIService 是否注册成功
    • 查看 Prometheus Adapter 的日志
    • 验证 HPA 中指定的指标名称是否正确
  3. 指标值不稳定

    • 确保 Prometheus Adapter 的指标重新列出间隔不小于 Prometheus 的抓取间隔
    • 检查 Prometheus 的抓取配置是否稳定

高级配置建议

  1. 多指标自动扩缩容:HPA 支持基于多个指标进行决策
  2. 自定义指标转换规则:根据应用特点调整 Prometheus Adapter 的配置
  3. 基于工作负载的自动扩缩容:结合 Kubernetes 工作负载特性优化扩缩容策略

总结

通过本文的实践,我们完成了从应用部署、监控配置到自动扩缩容的完整流程。Kubernetes Prometheus Adapter 为基于自定义指标的自动扩缩容提供了强大而灵活的解决方案,能够满足各种复杂场景下的弹性需求。

在实际生产环境中,建议根据具体业务特点进一步优化监控指标和扩缩容策略,以达到最佳的资源利用率和应用性能。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值