k8s-prometheus-adapter 配置实战:基于 Pod 的 HTTP 请求监控
前言
k8s-prometheus-adapter 是一个强大的工具,它能够将 Prometheus 监控指标转换为 Kubernetes 自定义指标 API,从而实现基于自定义指标的自动扩缩容(HPA)。本文将深入讲解如何配置该适配器来监控每个 Pod 的 HTTP 请求率。
应用场景分析
假设我们有一个前端 Web 服务器集群,需要根据接收到的 HTTP 请求率(requests per second)来自动扩缩容。为了达到这个目的,我们需要:
- 在应用中暴露
http_requests_total计数器指标 - 配置 Prometheus 收集这些指标
- 配置 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 处理指标分为四个关键步骤:
- 指标发现(Discovery):识别可用的 Prometheus 指标
- 资源关联(Association):将指标与 Kubernetes 资源关联
- 命名转换(Naming):定义如何将指标暴露给 Kubernetes API
- 查询构建(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 请求/秒
}
]
}
实际应用建议
- 监控间隔:
[2m]是推荐的监控窗口,可根据实际需求调整 - 单位处理:Kubernetes 使用 milli-units(千分之一单位)表示小数
- 多维度聚合:如果需要按 HTTP 方法区分,可以调整
metricsQuery - 性能考量:复杂的查询可能影响适配器性能,建议保持查询简洁
总结
通过本文的配置,我们成功地将 Prometheus 中的 HTTP 请求计数器转换为 Kubernetes 可识别的请求率指标。这种配置方式可以扩展到其他类型的指标,为基于自定义指标的自动扩缩容提供了坚实的基础。
在实际生产环境中,建议根据具体需求调整监控窗口、聚合方式和指标名称,以获得最佳的自动扩缩容效果。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



