解决 Prometheus 无法获取 Kubernetes 节点指标的问题

105次阅读
没有评论

问题描述

在一个独立的 Kubernetes 集群(非 minikube)上安装了 Prometheus,使用了一些自定义的 ServiceAccount、Role 和 ClusterRoleBinding。虽然能够获取一些指标(来自 Prometheus 和一些 Istio 的抓取配置),但无法获取 Kubernetes 节点的指标(如 CPU 等)。尝试了添加 job_name'kubelet' 的配置,但遇到了证书验证和授权的问题。

解决方案

请注意以下操作可能因版本不同而有所差异,务必在进行操作前备份相关配置。

使用 Bearer Token 鉴权

kubelet 的配置中,除了设置证书验证外,还需要发送 Bearer Token 来进行鉴权。按照以下步骤配置 job_name: 'kubelet' 的抓取配置:

  1. 编辑 Prometheus 配置文件(通常是 prometheus.yml)。
  2. scrape_configs 部分中,为 kubelet 抓取作业添加以下配置:

yaml
- job_name: 'kubelet'
kubernetes_sd_configs:
- role: node
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
insecure_skip_verify: true
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token

上述配置中,bearer_token_file 指定了 ServiceAccount Token 文件的路径。

  1. 保存配置文件并重启 Prometheus 服务。

解决证书验证问题

在配置中,您可能遇到证书验证问题,导致无法正确连接到 Kubernetes 节点的指标。如果证书无法验证或者缺少 IP SANs,您可以考虑以下操作:

  1. 使用 IP SANs
    添加正确的 IP SANs(Subject Alternative Names)到 Kubernetes API 证书,以使 Prometheus 可以正确验证证书。这可以通过修改 kubeadm-config 配置来实现。将 <my tailscale ip address> 替换为正确的 IP 地址。

  2. 跳过证书验证
    如果您确信 Kubernetes 节点的证书可以被信任,您可以在 Prometheus 配置中添加 insecure_skip_verify: true 以跳过证书验证。但这样可能会降低安全性,因此在生产环境中谨慎使用。

验证授权问题

如果您仍然遇到授权问题,可能是与角色绑定、权限或网络策略有关。确保 prometheus ServiceAccount、Role 和 ClusterRoleBinding 配置正确,且具有足够的权限来访问节点指标。

总结

通过在 Prometheus 配置中添加 job_name: 'kubelet' 的抓取配置,同时发送正确的 Bearer Token 进行鉴权,您应该能够解决无法获取 Kubernetes 节点指标的问题。同时,确保证书验证设置正确,以及 ServiceAccount 和角色绑定的权限配置正确,将有助于排除其他潜在的问题。

注意: 本文提供的解决方案仅为参考,请根据实际情况进行适当的调整和测试,以确保安全性和正确性。

正文完