Prometheus Adapter完全指南:如何让Kubernetes HPA基于应用指标自动扩缩容
Prometheus Adapter完全指南:如何让Kubernetes HPA基于应用指标自动扩缩容
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。外部指标适用于需要基于集群外系统指标进行扩缩容的场景。
配置优化建议
- 指标查询优化:确保Prometheus查询语句高效,避免使用过于复杂的聚合操作。
- 合理设置指标窗口:使用
irate函数时,窗口大小建议设置为Prometheus scrape interval的2-3倍。 - 避免抖动:通过设置
stabilizationWindowSeconds参数,避免HPA频繁扩缩容。 - 定期检查配置:随着应用变化,定期检查Prometheus Adapter配置,确保指标转换规则仍然适用。
常见问题解决
自定义指标不显示
如果通过kubectl get --raw /apis/custom.metrics.k8s.io/v1beta2命令看不到预期的指标,可能原因:
- Prometheus未正确收集到指标:检查Prometheus UI,确认指标存在。
- Adapter配置错误:检查config-map.yaml中的规则配置,确保指标匹配正确。
- 标签不匹配:确保Prometheus指标中的标签(如
namespace、pod)与Adapter配置中的标签匹配。
HPA无法获取指标
如果HPA事件中显示无法获取指标,可能原因:
- API服务未注册:检查APIService资源是否正确部署,可通过
kubectl get apiservice v1beta2.custom.metrics.k8s.io命令查看。 - Adapter未正常运行:检查Prometheus Adapter的Pod日志,查看是否有错误信息。
- 权限问题:确保Adapter的Service Account具有足够的权限访问Prometheus和Kubernetes API。
总结
通过Prometheus Adapter,Kubernetes HPA可以突破基础资源指标的限制,基于任意Prometheus收集的应用指标实现自动扩缩容。本文详细介绍了Prometheus Adapter的部署、配置和使用方法,包括如何创建基于自定义指标的HPA,并提供了最佳实践和常见问题解决方法。
要深入了解Prometheus Adapter的配置选项,可以参考docs/config.md和docs/config-walkthrough.md。通过合理配置和使用Prometheus Adapter,可以让Kubernetes应用更加智能、高效地应对流量变化。
更多推荐



所有评论(0)