k8s-prometheus-adapter 配置实战:基于 Pod 的 HTTP 请求监控

k8s-prometheus-adapter 配置实战:基于 Pod 的 HTTP 请求监控

前言

k8s-prometheus-adapter 是一个强大的工具,它能够将 Prometheus 监控指标转换为 Kubernetes 自定义指标 API,从而实现基于自定义指标的自动扩缩容(HPA)。本文将深入讲解如何配置该适配器来监控每个 Pod 的 HTTP 请求率。

应用场景分析

假设我们有一个前端 Web 服务器集群,需要根据接收到的 HTTP 请求率(requests per second)来自动扩缩容。为了达到这个目的,我们需要:

  1. 在应用中暴露 http_requests_total 计数器指标
  2. 配置 Prometheus 收集这些指标
  3. 配置 k8s-prometheus-adapter 将这些指标转换为 Kubernetes 可识别的格式

指标收集基础

我们的应用已经暴露了带有 method 标签的 http_requests_total 计数器指标。Prometheus 收集时会自动添加 Kubernetes 相关的标签:

http_requests_total{method="GET",kubernetes_namespace="production",kubernetes_pod_name="frontend-server-abcd-0123"}

适配器配置原理

k8s-prometheus-adapter 处理指标分为四个关键步骤:

  1. 指标发现(Discovery):识别可用的 Prometheus 指标
  2. 资源关联(Association):将指标与 Kubernetes 资源关联
  3. 命名转换(Naming):定义如何将指标暴露给 Kubernetes API
  4. 查询构建(Querying):确定如何从 Prometheus 获取实际数值

详细配置步骤

1. 创建基础规则

首先,我们在配置中添加一个空规则:

rules:
- {}

2. 指标发现配置

我们需要告诉适配器如何发现我们的指标。在 Prometheus 中,我们会这样查询:

http_requests_total{kubernetes_namespace!="",kubernetes_pod_name!=""}

对应的配置:

rules:
- seriesQuery: 'http_requests_total{kubernetes_namespace!="",kubernetes_pod_name!=""}'

3. 资源关联配置

我们需要将 Prometheus 标签映射到 Kubernetes 资源:

resources:
  overrides:
    kubernetes_namespace: {resource: "namespace"}
    kubernetes_pod_name: {resource: "pod"}

完整配置:

rules:
- seriesQuery: 'http_requests_total{kubernetes_namespace!="",kubernetes_pod_name!=""}'
  resources:
    overrides:
      kubernetes_namespace: {resource: "namespace"}
      kubernetes_pod_name: {resource: "pod"}

4. 指标命名转换

计数器指标(_total)不适合直接用于自动扩缩容,我们需要将其转换为速率指标:

name:
  matches: "^(.*)_total"
  as: "${1}_per_second"

5. 查询构建配置

最后,我们需要定义如何从 Prometheus 获取实际数值:

metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)'

完整配置示例

rules:
- seriesQuery: 'http_requests_total{kubernetes_namespace!="",kubernetes_pod_name!=""}'
  resources:
    overrides:
      kubernetes_namespace: {resource: "namespace"}
      kubernetes_pod_name: {resource: "pod"}
  name:
    matches: "^(.*)_total"
    as: "${1}_per_second"
  metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)'

配置验证

配置完成后,适配器会暴露以下 API 端点:

  • /apis/custom.metrics.k8s.io/v1beta1/namespaces/<namespace>/pods/*/http_requests_per_second
  • /apis/custom.metrics.k8s.io/v1beta1/namespaces/http_requests_per_second

查询结果示例:

{
  "kind": "MetricValueList",
  "apiVersion": "custom.metrics.k8s.io/v1beta1",
  "items": [
    {
      "describedObject": {
        "kind": "Pod",
        "name": "frontend-server-abcd-0123"
      },
      "metricName": "http_requests_per_second",
      "value": "16m"  // 表示 0.016 请求/秒
    }
  ]
}

实际应用建议

  1. 监控间隔[2m] 是推荐的监控窗口,可根据实际需求调整
  2. 单位处理:Kubernetes 使用 milli-units(千分之一单位)表示小数
  3. 多维度聚合:如果需要按 HTTP 方法区分,可以调整 metricsQuery
  4. 性能考量:复杂的查询可能影响适配器性能,建议保持查询简洁

总结

通过本文的配置,我们成功地将 Prometheus 中的 HTTP 请求计数器转换为 Kubernetes 可识别的请求率指标。这种配置方式可以扩展到其他类型的指标,为基于自定义指标的自动扩缩容提供了坚实的基础。

在实际生产环境中,建议根据具体需求调整监控窗口、聚合方式和指标名称,以获得最佳的自动扩缩容效果。

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

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

抵扣说明:

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

余额充值