Kubernetes集群Prometheus配置证书后部分目标仍报403 Forbidden
看起来你已经做了基础的证书配置,但还是遇到了403错误,不过好在curl能正常访问,这说明证书本身是有效的,问题大概率出在Prometheus的配置细节或者权限传递上。下面是几个你可以逐一排查的方向:
1. 检查Bearer Token与证书的冲突
你的Prometheus配置里同时指定了bearer_token_file和证书认证(cert_file/key_file),而Kubernetes API Server在同时收到两种认证方式时,可能会优先使用Bearer Token。如果这个Token对应的ServiceAccount没有权限访问/metrics端点,就会返回403。
建议先尝试注释掉bearer_token_file这一行,只保留证书相关配置,重启Prometheus后观察目标状态是否恢复正常。
2. 验证证书路径与挂载正确性
首先注意到你配置里的bearer_token_file路径写的是/etc/k8spem//token,虽然Linux会忽略重复的斜杠,但最好修正为/etc/k8spem/token避免潜在的解析问题。
另外,需要确认Prometheus Pod是否正确挂载了证书目录:
- 进入Pod内部执行命令:
确认kubectl exec -it <prometheus-pod-name> -- ls -l /etc/k8spem/ca.pem、admin.pem、admin.key和token文件都存在,且文件权限为600(避免其他用户可读导致的权限问题)。
3. 确认证书对应用户的权限
虽然你用admin证书通过curl能成功访问,但要确保Prometheus使用的这个证书对应的用户确实拥有访问API Server metrics的权限:
- 先查看证书的Subject信息,确认对应的用户名:
openssl x509 -in /work/deploy/kubernetes/security/admin.pem -text | grep -A 2 Subject - 用这个用户名验证权限:
(把上面的kubectl auth can-i get --raw /metrics --as=CN=admin,O=system:mastersCN=admin,O=system:masters替换成你实际查到的Subject内容)
如果返回no,需要给该用户绑定具备访问/metrics权限的ClusterRole,比如绑定cluster-admin:kubectl create clusterrolebinding admin-metrics-access --clusterrole=cluster-admin --user=CN=admin,O=system:masters
4. 检查Relabel规则是否正确筛选目标
在Prometheus的UI中进入Targets页面,查看kubernetes-apiservers job下的目标标签是否匹配你的relabel规则:default;kubernetes;https。如果标签不匹配,可能会错误地选中其他没有权限的端点,导致403错误。
可以通过查看目标的__meta_kubernetes_namespace、__meta_kubernetes_service_name、__meta_kubernetes_endpoint_port_name这三个标签,确认它们是否符合规则中的正则表达式。
内容的提问来源于stack exchange,提问作者Esc

