HPA自定义指标(通过请求数量扩缩)

张开发
2026/4/7 10:53:41 15 分钟阅读

分享文章

HPA自定义指标(通过请求数量扩缩)
纯 HPA 玩法,水平 Pod 扩容加副本数1→5→20 个 Pod这套ServiceMonitor采集指标 → adapter转自定义指标 → HPA按QPM扩副本标准 HPA (Pod 横向扩缩容)1业务 Podcounter 自己埋点暴露/metrics产出原生计数器http_requests_total2ServiceMonitor 告诉 Prometheus去抓default/appcounter 的/metrics15s 抓一次3Prometheus 存下所有请求时序数据4prometheus-adapter关键中转 用 PromQLsum(rate(http_requests_total[2m]))*60算出 每分钟请求数注册成 K8s 可识别的自定义 Pod 指标6http_requests_per_minute5HPA决策 不停拉自定义指标 单 Pod 平均30QPM→ 按策略扩容最多5个/分钟最大20副本 流量低 → 缩容冷静期5分钟再减副本7闭环新增 Pod 分担流量 → 单 PodQPM 下降 →HPA停止扩容集群版本满足条件 1如果没有可以创建apiVersion:apiregistration.k8s.io/v1kind:APIServicemetadata:name:v1beta1.custom.metrics.k8s.iospec:service:name:prometheus-adapternamespace:monitoringgroup:custom.metrics.k8s.ioversion:v1beta1insecureSkipTLSVerify:truegroupPriorityMinimum:100versionPriority:100创建# kubectl apply -f xx.yaml添加一个自定义指标# 自定义业务指标规则新增rules:-seriesQuery:http_requests_total{namespace!,pod!}resources:overrides:namespace:{resource:namespace}pod:{resource:pod}name:matches:^(.*)_total$as:${1}_per_minutemetricsQuery:|sum(rate(.Series{.LabelMatchers}[1m])) by (.GroupBy) * 60直接用我做好的镜像apiVersion:apps/v1kind:Deploymentmetadata:name:counternamespace:defaultspec:replicas:1selector:matchLabels:app:countertemplate:metadata:labels:app:counterspec:containers:-name:appimage:jpccr.ccs.tencentyun.com/test02/hpa-test:v01imagePullPolicy:IfNotPresentports:-containerPort:8080resources:requests:cpu:100mmemory:128Milimits:cpu:300mmemory:256Mi---apiVersion:v1kind:Servicemetadata:name:counternamespace:defaultlabels:app:counterspec:selector:app:counterports:-port:8080targetPort:8080name:httppods 创建好之后再创建 hpaapiVersion:monitoring.coreos.com/v1kind:ServiceMonitormetadata:name:request-counternamespace:monitoringlabels:release:kube-prometheusspec:namespaceSelector:matchNames:-defaultselector:matchLabels:app:counterendpoints:-port:httppath:/metricsinterval:15sscheme:http---apiVersion:autoscaling/v2kind:HorizontalPodAutoscalermetadata:name:counter-hpanamespace:defaultspec:scaleTargetRef:apiVersion:apps/v1kind:Deploymentname:counterminReplicas:1maxReplicas:20metrics:-type:Podspods:metric:name:http_requests_per_minute----对应 自定义指标target:type:AverageValueaverageValue:30behavior:scaleUp:stabilizationWindowSeconds:60policies:-type:Podsvalue:5periodSeconds:60selectPolicy:MaxscaleDown:stabilizationWindowSeconds:300查看你的指标创建后如下开始测试发送请求while true; do curl -s http://10.96.202.116:8080/ /dev/null; sleep 0.05; done成功扩容了又时间问题没有等到20个pods才退出grafana 视图展示小技巧添加一个自定义视图 收集每个pods的请求数量sum(http_requests_total{namespacedefault})by(namespace, pod)grafana 视图ID推荐22128 22251

更多文章