kube-apiserver的/metrics端点默认仅允许经认证且授权的请求访问,匿名用户被拒绝,故curl https://localhost:6443/metrics返回403;必须通过https+serviceaccount token+clusterrolebinding显式授权才能合法拉取指标。

直接说结论:kube-apiserver 的 metrics 默认不对外暴露,必须显式配置监听地址、认证方式和 RBAC 权限,Prometheus 才能拉取到真实指标。
为什么 curl https://localhost:6443/metrics 返回 403?
这是最常遇到的卡点。kube-apiserver 的 /metrics 端点默认只允许经过身份认证且有明确授权的请求访问,匿名用户(system:anonymous)直接被拒绝。
- 它不走
--insecure-port(如 8080),那个端口已弃用且不安全,新版 k8s 默认禁用 - 它也不走
--bind-address=127.0.0.1这类本地绑定——Prometheus 通常运行在 Pod 里,无法直连 localhost - 必须使用 HTTPS + ServiceAccount Token + ClusterRoleBinding 才能合法访问
/metrics
如何让 Prometheus 正确抓取 kube-apiserver 的 metrics?
核心是三点:服务发现路径、TLS 配置、权限授予。不要试图用 http:// 直连或绕过证书校验。
针对 Kubernetes 仪表板和 Web UI 的浏览器自动化。适用于与 Kubernetes Dashboard、Grafana、ArgoCD UI 或其他 Web 界面交互。需要设置 MCP_BROWSER_ENABLED=true。
- ServiceMonitor 必须指向
https协议、6443端口,并指定tlsConfig中的caFile和serverName -
serverName必须是kubernetes(即集群内 Service 名),不能写成 IP 或域名别名 - ServiceAccount(如
prometheus-k8s)需绑定具备get权限的 ClusterRole,对nonResourceURLs: ["/metrics"]显式授权 - 确保该 ServiceAccount 的 token 被挂载进 Prometheus Pod,且
bearerTokenFile路径与实际一致(通常是/var/run/secrets/kubernetes.io/serviceaccount/token)
常见错误:ServiceMonitor 不生效的几个硬伤
即使 YAML 写对了,也常因以下原因导致 target 始终为 down:
-
selector.matchLabels没匹配上 apiserver 的实际 label —— 查看kubectl get endpoints kubernetes -n default -o yaml,确认 label 是component: apiserver还是provider: kubernetes - ServiceMonitor 所在 namespace 与 Prometheus 实例 namespace 不一致,且未在 Prometheus CRD 中通过
serviceMonitorNamespaceSelector显式放开 - apiserver 的证书未包含
kubernetes.default.svcDNS name(注意结尾不能多一个点),导致 TLS 握手失败,Prometheus 日志报x509: certificate is valid for ... not kubernetes.default.svc - 误将
endpoints.port写成https字符串,而实际应为数值型6443;或漏掉scheme: https
验证是否真正通了?别只看 Prometheus UI
光看 target 页面显示 UP 不够,要确认指标内容真实、可查:
- 进 Prometheus Pod 手动 curl:
curl -k --header "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" https://kubernetes.default.svc:6443/metrics | head -20 - 检查返回是否含
apiserver_request_total、apiserver_current_inflight_requests等原生指标,而非一堆空行或重定向 - 在 Prometheus 表达式浏览器中输入
count by (job) (apiserver_request_total),看是否有非零结果 - 若仍为空,重点检查 apiserver 启动参数是否含
--enable-admission-plugins=...MetricsServer(虽然 metrics 本身不依赖 admission plugin,但某些插件冲突会导致 metrics endpoint 失效)
最难调通的其实是证书信任链和 RBAC 组合权限——这两个地方一旦出错,错误现象高度相似(全是 403 或连接拒绝),但根因完全不同。建议把 curl -v 输出和 Prometheus target debug 日志一起比对,而不是只盯着 YAML 格式是否正确。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










