go服务被k8s hpa自动扩缩容的关键是让prometheus-adapter正确采集并暴露指标为custom.metrics.k8s.io api,需在go中注册指标、挂载/metrics handler、声明端口;adapter配置须匹配指标名与标签;hpa yaml中type、target等字段必须准确;需验证v1beta1.custom.metrics.k8s.io api可用及kube-controller-manager启用rest-clients。

Go服务要被K8s HPA自动扩缩容,关键不是写个Go适配器,而是让指标能被prometheus-adapter正确采集并暴露为custom.metrics.k8s.io API —— 否则HPA根本看不到你的http_requests_total。
Go服务怎么暴露HPA可用的指标
HPA不直接拉你的Go进程,它只查API;而prometheus-adapter才是那个从/metrics端点抓数据、再转成API响应的中间件。所以你的Go服务只需做三件事:
- 用
prometheus/client_golang注册指标(比如http_requests_total计数器或go_app_queue_length仪表盘) - 在HTTP服务器上挂载
promhttp.Handler()到/metrics路径 - 确保该端口在Pod的
container.ports里声明,并且Service能路由到它(别用localhost、别加Basic Auth、别设非标路径)
示例中漏掉的关键点:如果用http.ListenAndServe(":8080", nil)但没显式注册/metrics handler,或者用了gorilla/mux却忘了r.Handle("/metrics", promhttp.Handler()),指标就压根不会暴露。
prometheus-adapter配置必须匹配指标名和标签
Adapter不是“自动识别所有Prometheus指标”,它靠config.yaml里的rules逐条匹配。你写的http_requests_total{job="fiber-app",pod=~".*"},必须在Adapter规则里明确写出seriesQuery和resources,否则HPA查/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/http_requests_total会返回404或空数组。
- 检查
adapter-configConfigMap是否真被挂载进Adapter Pod,kubectl get cm -n monitoring adapter-config -o yaml - 确认
rules里有对应项,例如:name: {__name__=~"http_requests_total"}+seriesQuery: 'http_requests_total{namespace!="",pod!=""}' - 注意标签过滤:如果你的Go指标打了
app="fiber",但Adapter规则没放开这个label,它就匹配不到
HPA YAML里type和target不能填错
HPA v2对自定义指标的字段非常敏感,填错一个就会静默失败(不报错,但kubectl describe hpa显示unknown metrics):
- 想按单个Pod的QPS扩缩,必须用
type: Pods,不能用type: Object或type: External -
averageValue: 100m表示“每秒0.1次请求”,单位是m(milli),不是整数;写成100会被当100次/秒,极易误触发扩容 - 若指标名含下划线(如
http_server_requests_total),HPA里metric.name必须完全一致,大小写、拼写、下划线一个都不能错
验证方式不是kubectl top pods(它只走metrics.k8s.io),而是:kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/http_requests_total" —— 这个命令返回JSON才说明指标链路通了。
v1beta1.custom.metrics.k8s.io API必须可用
这是整个链路的入口,HPA控制器通过它查指标。如果它不可用,HPA就卡在Waiting for metrics to be available:
- 运行
kubectl get apiservice v1beta1.custom.metrics.k8s.io -o wide,看AVAILABLE列是不是True - 如果不是,查
prometheus-adapterPod日志:kubectl logs -n monitoring deploy/prometheus-adapter - 常见原因:Adapter连不上Prometheus(
--prometheus-url写成localhost或127.0.0.1)、TLS证书校验失败、RBAC缺失system:auth-delegator权限、Service DNS解析超时
最易被忽略的是:Adapter默认只处理custom.metrics.k8s.io,但HPA控制器本身需要--horizontal-pod-autoscaler-use-rest-clients=true才能启用自定义指标支持 —— 老集群常漏掉这个kube-controller-manager启动参数。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











