结论:metrics-server是kubernetes官方推荐的集群级资源指标聚合器,专为kubectl top和hpa提供cpu/memory数据;它仅采集kubelet暴露的cadvisor指标,不处理go服务的/metrics端点,后者须由prometheus单独抓取,二者完全独立。

直接说结论:Kube-metrics 不是标准组件,你大概率想找的是 metrics-server(Kubernetes 官方推荐的集群级资源指标聚合器),它为 kubectl top、HPA(Horizontal Pod Autoscaler)等提供 CPU/memory 使用率数据;Go 项目本身不“部署”它,而是确保它运行正常,且你的 Go 服务暴露的 /metrics(Prometheus 格式)由 Prometheus Server 单独抓取——这两者完全独立,别混用。
metrics-server 和 Prometheus 是两套东西
常见误解是把 metrics-server 当成 “采集所有指标”的入口。它只采集 kubelet 暴露的节点和 Pod 级资源使用量(cAdvisor 数据),**不解析、不处理你的 Go 应用 /metrics 端点**。后者必须由 Prometheus 实例主动抓取。
-
metrics-server:监听 kubelet 的/metrics/cadvisor,聚合后存于内存,通过 Kubernetes API 的metrics.k8s.io组暴露(如kubectl top pods) - Prometheus:配置
scrape_configs主动轮询你的 Go 服务/metrics(需 Service + Endpoints 可达,且路径、端口、Accept 头正确) - Go 服务自身只需用
prometheus/client_golang注册指标并挂载promhttp.Handler(),不依赖 metrics-server
Go 服务暴露 /metrics 的硬性要求
即使 metrics-server 运行正常,你的 Go 服务若不符合以下条件,Prometheus 仍会抓不到指标:
- 必须用
v1.19.0+的prometheus/client_golang,旧版本在高并发下有注册器 panic 风险 -
/metrics路由必须挂载在 HTTP handler 上,且 **不能被中间件重写路径或过滤Accept: text/plain; version=0.0.4;q=1头**(Prometheus 默认发此头) - 如果用了反向代理(如 nginx、Traefik),需显式透传
Accept请求头,否则返回空或 406 - Pod 必须就绪(
readinessProbe成功),且 Service 的selector匹配 Pod label,否则 Endpoints 不生成,Prometheus 抓取目标为空
示例最小启动代码:
import (
"net/http"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
func main() {
http.Handle("/metrics", promhttp.Handler()) // 不要用 http.HandlerFunc 包裹后二次处理
http.ListenAndServe(":8080", nil)
}
metrics-server 部署失败的典型现象
执行 kubectl top nodes 报错是最快判断依据:
-
Error from server (ServiceUnavailable): the server is currently unable to handle the request→ metrics-server Pod 未 Running 或 API service 未注册 -
Error from server (NotFound): the server could not find the requested resource (get nodes.metrics.k8s.io)→ metrics-server 未安装,或 CRD/API service 未创建 -
error: Metrics not available for node XXX→ metrics-server 启动了,但无法连接 kubelet(常见于 TLS 证书校验失败、kubelet 未开--read-only-port或防火墙拦截 10255)
检查命令:
kubectl get pods -n kube-system | grep metrics kubectl get apiservice v1beta1.metrics.k8s.io kubectl logs -n kube-system deploy/metrics-server
Go 服务指标被 Prometheus 抓取不到的排查链路
别一上来就改 Go 代码,按顺序验证:
- 进 Pod 执行
curl localhost:8080/metrics→ 确认端点本身返回 200 + 文本指标 - 查 Service 是否关联到 Pod:
kubectl get endpoints go-app-service→ 输出应含 IP:port - 查 Prometheus targets 页面(
http://prometheus-url/targets)→ 状态是否为UP,错误信息是否提示 connection refused 或 timeout - 确认 Prometheus 的 scrape config 中
target地址是 Service DNS 名(如go-app-service.default.svc.cluster.local:8080),不是 ClusterIP 或 Pod IP - 若用 Ingress 暴露
/metrics,必须加nginx.ingress.kubernetes.io/whitelist-source-range白名单,否则默认拒绝非内网请求
最容易被忽略的是:Go 服务监听 localhost:8080(而非 :8080),导致容器内其他进程(包括 metrics-server 的 health check)无法访问 —— 必须绑定 0.0.0.0:8080。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











