HPA 是 Kubernetes 的控制器功能,非 Go 语言实现;Go 程序可通过暴露 Prometheus 指标或实现 Custom Metrics API Server 与 HPA 协作,需注意配置 minReplicas/maxReplicas、behavior 和 scaleTargetRef 等关键字段。

HPA 是 Kubernetes 的能力,不是 Go 语言直接实现的
Go 语言本身不提供 HPA 功能,Kubernetes 的 Horizontal Pod Autoscaler 是一个独立的 controller,运行在 kube-controller-manager 中。你用 Go 写的程序(比如 Operator 或自定义指标适配器)可以和 HPA 协作,但不能“实现 HPA”本身。
真正需要做的,是让 Go 程序满足 HPA 的输入要求,或扩展它的行为。常见路径有两条:
- 让 Go 服务暴露
/metrics(Prometheus 格式),再通过prometheus-adapter把指标转成 HPA 可读的格式 - 写一个自定义指标 API server(用 Go 实现
custom-metrics-apiserver接口),让kubectl top pods和 HPA 能查到你的业务指标
用 Go 暴露 Prometheus 指标并接入 HPA
这是最轻量、最常用的路径。HPA 默认只认 CPU 和 memory,要基于 QPS、延迟、队列长度等扩缩容,必须走自定义指标。Prometheus + prometheus-adapter 是事实标准。
实操要点:
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
立即学习“go语言免费学习笔记(深入)”;
- 在 Go 服务中引入
prometheus客户端库,注册如http_requests_total、http_request_duration_seconds这类指标 - 确保
http.ListenAndServe(":8080", nil)路由里挂了promhttp.Handler(),路径为/metrics - 部署
prometheus-adapter并配置规则,例如把http_requests_total按 pod 维度聚合为pod_http_requests_total - HPA 的
metrics字段写成:metrics: - type: Pods pods: metric: name: pod_http_requests_total target: type: AverageValue averageValue: 100 - 注意:
prometheus-adapter查询的是 Prometheus 的 raw 数据,不是实时值;采样间隔和 scrape 间隔会影响扩缩容响应速度
Go 实现 Custom Metrics API Server 的关键接口
如果你不想依赖 Prometheus 生态,或者需要低延迟、高精度的指标(比如每秒精确到毫秒级的处理队列长度),就得自己实现 Custom Metrics API Server。它必须响应两个核心 endpoint:
-
GET /apis/custom.metrics.k8s.io/v1beta2—— 返回 API 发现信息 -
GET /apis/custom.metrics.k8s.io/v1beta2/namespaces/{namespace}/pods/{pod-name}/{metric-name}—— 返回单个 Pod 的指标值,返回结构必须符合 KubernetesMetricValue规范 - 必须用 TLS 提供 HTTPS,并通过
APIService注册到 kube-apiserver,证书需被 kube-apiserver 信任 - Go 中常用
k8s.io/apiserver和k8s.io/kube-aggregator构建,但注意:v1beta2 已废弃,新集群建议瞄准custom.metrics.k8s.io/v1beta1或迁移到external.metrics.k8s.io - 不要在 handler 里做重计算——HPA 每 15–30 秒轮询一次,超时默认 30 秒,慢响应会导致 HPA “No metrics found” 错误
HPA 配置里最容易被忽略的三个字段
很多人写了指标、起了 adapter,HPA 却不干活,问题常出在配置细节上:
-
minReplicas和maxReplicas必须显式设置,否则 HPA 不会启动;设为1和10是常见起点,但别忘了检查 Deployment 的replicas是否落在这个区间内 -
behavior控制扩缩节奏,默认激进(1 分钟内可能翻倍),生产环境务必限制:behavior: scaleDown: policies: - type: Percent value: 10 periodSeconds: 60 -
scaleTargetRef的kind必须是Deployment、ReplicaSet或StatefulSet,不能是Pod;名字大小写、命名空间必须和实际资源 100% 一致,错一个字符就报Unable to get metric
指标通了,HPA 对象也创建成功,不代表立刻生效——它要等至少两个采集周期(默认 30 秒 × 2)才开始决策。第一次看 kubectl describe hpa 出现 unknown 是正常的,等一分钟后刷新就行。

















