不存在“在 Kubernetes 里部署 Go 应用并配置自定义指标自动扩容”的一体化操作流程——Go 应用仅需通过 prometheus/client_golang 暴露标准 /metrics 端点(如 http_requests_total),HPA 不直接抓取该端点,而是依赖 metrics-server 或 prometheus-adapter 将指标转换为 Kubernetes Metrics API 格式,再经 external.metrics 配置精准映射后实现基于 QPS 等业务指标的自动扩缩容。

不存在“在 Kubernetes 里部署 Go 应用并配置自定义指标自动扩容”的一体化操作流程——Go 应用本身不参与扩缩容逻辑,真正起作用的是 HorizontalPodAutoscaler(HPA)资源对象,它依赖外部指标系统(如 Prometheus + metrics-server + prometheus-adapter)把你的 Go 指标“翻译”成 K8s 能识别的格式。
Go 服务必须暴露 /metrics 且指标名要符合规范
HPA 不会主动抓取你的 Go 程序,它只信任集群 metrics API。你要做的,是让 Go 服务通过 prometheus/client_golang 暴露标准格式的指标,并确保指标名可被 prometheus-adapter 映射到 HPA 支持的 target:
- 用
promhttp.Handler()挂载/metrics端点,不要自己拼字符串或用非标准格式 - 关键指标如 QPS,推荐命名为
http_requests_total(带_total后缀),类型为 Counter;HPA 基于 rate() 计算,适配器才能正确转换 - 避免使用动态 label(如
path="/user/:id"),大量高基数 label 会导致 prometheus-adapter 查询超时或 HPA 拒绝更新 - 确保
http_requests_total是全局计数器(不是 per-Pod 实例),否则 HPA 无法跨副本聚合
HPA 配置 external.metrics 必须填全字段
当你用 type: External 指向 Prometheus 指标时,Kubernetes 1.23+ 版本会严格校验字段完整性。漏掉任意一项,kubectl apply 或 client-go 创建都会失败,报错类似 Invalid value: "null":
-
external.metricName必须和 Prometheus 中暴露的指标名完全一致(如http_requests_total) -
external.target.averageValue必须设置(如100),不能写value(已废弃) -
external.selector.matchLabels可选,但若用了就必须匹配 Prometheus 中该指标的 label(如{job="go-app"}) - 整个
metrics数组至少含一项,且scaleTargetRef必须指向同 namespace 下已存在的 Deployment
prometheus-adapter 配置决定指标能否进 HPA
即使 Go 服务正常返回 /metrics,HPA 也看不到它——中间层 prometheus-adapter 的 rules 决定哪些指标能被 HPA 查询到:
- rules 文件中必须有明确的
seriesQuery匹配你的指标(如http_requests_total{job="go-app"}) -
resources字段要指定name和overrides,例如把namespacelabel 映射为 K8s namespace - 若用
metricRelabelings过滤 label,请确认没误删job或instance等 adapter 依赖的维度 - 验证方式:直接调用
curl http://prometheus-adapter:8080/apis/custom.metrics.k8s.io/v1beta1,看是否列出你的指标名
client-go 创建 HPA 时 struct 初始化容易空指针
用 client-go 编程化创建 HPA 时,常见错误不是逻辑错,而是 Go struct 字段未显式初始化导致 nil 引用:
-
metrics字段是[]autoscalingv2.MetricSpec,必须用make([]..., 1)分配内存,不能留空切片 -
external子结构体每个字段都要赋值,例如&autoscalingv2.ExternalMetricSource{Metric: ...}不能只传Metric忘了Target -
scaleTargetRef的apiVersion必须写"apps/v1",写成"apps/v1beta1"(已弃用)会导致创建失败 - 调试建议:先用
kubectl create -f hpa.yaml --dry-run=client -o yaml输出 struct 对应 YAML,再对照 client-go 构造逻辑
最常被跳过的环节是 prometheus-adapter 的 rules 配置和 HPA 的 external.target.averageValue 字段补全——这两个地方一漏,整个自定义指标扩缩就静默失效,连 Event 都不抛,只会卡在 Waiting for metrics to be available 状态。











