Prometheus 从 GKE 中的 kubernetes api 获得 403 禁止

Posted

技术标签:

【中文标题】Prometheus 从 GKE 中的 kubernetes api 获得 403 禁止【英文标题】:Prometheus getting 403 forbidden from kubernetes api in GKE 【发布时间】:2021-08-06 23:38:33 【问题描述】:

对于 prometheus 部署的 ClusterRole 我有

# ClusterRole for the deployment
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: prometheus
rules:
- apiGroups: [""]
  resources:
  - nodes
  - nodes/proxy
  - nodes/metrics
  - services
  - endpoints
  - pods
  verbs: ["get", "list", "watch"]
- apiGroups:
  - extensions
  resources:
  - ingresses
  verbs: ["get", "list", "watch"]
- nonResourceURLs: ["/metrics"]
  verbs: ["get"]

ServiceAccount 和 ClusterRoleBinding 也已经到位。

以下是prometheus.yml 中出现 403 错误的作业的设置

- job_name: 'kubernetes-cadvisor'

      scheme: https

      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token

      kubernetes_sd_configs:
      - role: node

      relabel_configs:
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
      - target_label: __address__
        replacement: kubernetes.default.svc:443
      - source_labels: [__meta_kubernetes_node_name]
        regex: (.+)
        target_label: __metrics_path__
        replacement: /api/v1/nodes/$1/proxy/metrics/cadvisor

- job_name: 'kubernetes-nodes'

      scheme: https

      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token

      kubernetes_sd_configs:
      - role: node

      relabel_configs:
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
      - target_label: __address__
        replacement: kubernetes.default.svc:443
      - source_labels: [__meta_kubernetes_node_name]
        regex: (.+)
        target_label: __metrics_path__
        replacement: /api/v1/nodes/$1/proxy/metrics

即使 ServiceAccountClusterRole 已绑定在一起,我也不明白为什么我不断收到 403 错误。

【问题讨论】:

【参考方案1】:

确保/var/run/secrets/kubernetes.io/serviceaccount/token 文件包含正确的令牌。为此,您可以使用以下命令进入 Prometheus pod:

kubectl exec -it -n <namespace> <Prometheus_pod_name> -- bash

并 cat 令牌文件。然后退出 pod 并执行:

echo $(kubectl get secret -n <namespace> <prometheus_serviceaccount_secret> -o jsonpath='.data.token') | base64 --decode

如果令牌匹配,您可以尝试使用 Postman 或 Insomnia 查询 Kubernetes API 服务器,以查看您在 ClusterRole 中输入的规则是否正确。我建议您同时查询/proxy/metrics/cadvisor/proxy/metrics 网址

【讨论】:

原来我有一个特定于 GKE 的问题,我想我会在另一个问题中提问,非常感谢。

以上是关于Prometheus 从 GKE 中的 kubernetes api 获得 403 禁止的主要内容,如果未能解决你的问题,请参考以下文章

Prometheus 未从 GKE 中的 cadvisor 接收指标

为啥 fluentd/kube-proxy/prometheus 的 GKE 中的 IP 地址等于节点地址

在 GKE + istio 上安装 Prometheus

GKE 和 prometheus 监控

有没有办法访问 Istio 在 GKE 中创建的 promsd 服务?

GKE 需要 prometheus-to-sd 吗?我可以删除它吗?