Kubernetes Prometheus Adapter 实战指南:实现自定义指标自动扩缩容
前言
在现代云原生应用中,基于自定义指标进行自动扩缩容是提升应用弹性和资源利用率的重要手段。本文将详细介绍如何使用 Kubernetes Prometheus Adapter 实现基于 Prometheus 监控数据的自动扩缩容方案。
核心概念解析
Prometheus Adapter 是什么
Prometheus Adapter 是一个 Kubernetes API 扩展组件,它能够将 Prometheus 收集的监控指标转换为 Kubernetes 自定义指标 API 格式。这使得 Horizontal Pod Autoscaler (HPA) 能够基于 Prometheus 中的任意指标进行自动扩缩容决策。
工作原理
- 指标收集:Prometheus 定期从应用 Pod 中抓取指标数据
- 指标转换:Prometheus Adapter 查询 Prometheus 并将结果转换为 Kubernetes 自定义指标 API 格式
- 自动扩缩容:HPA 通过查询自定义指标 API 获取指标数据,根据配置的策略进行扩缩容决策
环境准备
集群要求
- Kubernetes 1.8+ 版本(推荐 1.9+)
- 已启用 API 聚合层
- 控制器管理器配置为使用指标 API
- metrics-server 已正确部署(Kubernetes 1.9+ 默认包含)
必要组件
- Prometheus 监控系统(推荐使用 Prometheus Operator 部署)
- Prometheus Adapter 组件
- 待监控的示例应用
实战步骤
第一步:部署示例应用
我们首先部署一个简单的 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 指标,并且该指标包含 namespace 和 pod 标签。
第三步:部署 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]
)
)
这个配置会:
- 查询所有包含 namespace 标签且不以
container_开头的指标 - 将
_total后缀的计数器指标转换为速率指标 - 使用
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
常见问题排查
-
指标未显示:
- 检查 Prometheus 是否成功抓取了指标
- 验证 ServiceMonitor 的标签选择器是否正确
- 确保指标包含必要的标签(如 namespace 和 pod)
-
HPA 无法获取指标:
- 检查 APIService 是否注册成功
- 查看 Prometheus Adapter 的日志
- 验证 HPA 中指定的指标名称是否正确
-
指标值不稳定:
- 确保 Prometheus Adapter 的指标重新列出间隔不小于 Prometheus 的抓取间隔
- 检查 Prometheus 的抓取配置是否稳定
高级配置建议
- 多指标自动扩缩容:HPA 支持基于多个指标进行决策
- 自定义指标转换规则:根据应用特点调整 Prometheus Adapter 的配置
- 基于工作负载的自动扩缩容:结合 Kubernetes 工作负载特性优化扩缩容策略
总结
通过本文的实践,我们完成了从应用部署、监控配置到自动扩缩容的完整流程。Kubernetes Prometheus Adapter 为基于自定义指标的自动扩缩容提供了强大而灵活的解决方案,能够满足各种复杂场景下的弹性需求。
在实际生产环境中,建议根据具体业务特点进一步优化监控指标和扩缩容策略,以达到最佳的资源利用率和应用性能。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



