【问题标题】:Prometheus - Kubernetes RBAC普罗米修斯 - Kubernetes RBAC
【发布时间】:2017-09-03 10:43:16
【问题描述】:

我将我的 GKE API 服务器升级到 1.6,并且正在将节点升级到 1.6,但遇到了障碍...

我有一个 prometheus 服务器(版本 1.5.2)在 Kubernetes 部署管理的 Pod 中运行,其中有几个节点运行版本 1.5.4 Kubelet,一个新节点运行 1.6。

Prometheus 无法连接到新节点——它的指标端点返回 401 Unauthorized。

这似乎是一个 RBAC 问题,但我不确定如何处理。我找不到关于 Prometheus 服务器需要什么角色的文档,甚至找不到如何将它们授予服务器的文档。

从 coreos/prometheus-operator 存储库中,我能够拼凑出一个我可能期望工作的配置:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: prometheus
---

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

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: prometheus
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: prometheus
subjects:
- kind: ServiceAccount
  name: prometheus
  namespace: default
---

apiVersion: v1
kind: ServiceAccount
metadata:
  name: prometheus
  namespace: default
secrets:
- name: prometheus-token-xxxxx

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app: prometheus-prometheus
    component: server
    release: prometheus
  name: prometheus-server
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus-prometheus
      component: server
      release: prometheus
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: prometheus-prometheus
        component: server
        release: prometheus
    spec:
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      serviceAccount: prometheus
      serviceAccountName: prometheus
      ...

但 Prometheus 仍然得到 401。

更新:正如 Jordan 所说,这似乎是一个 Kubernetes 身份验证问题。在此处查看新的、更集中的问题; https://serverfault.com/questions/843751/kubernetes-node-metrics-endpoint-returns-401

【问题讨论】:

    标签: kubernetes google-kubernetes-engine prometheus


    【解决方案1】:

    401 表示未经身份验证,这意味着它不是 RBAC 问题。我相信 GKE 在 1.6 中不再允许匿名访问 kubelet。您使用什么凭据对 kubelet 进行身份验证?

    【讨论】:

    • 嘿乔丹!是的,这完全是问题所在,我只是不确定如何对其进行身份验证。在过去的一个小时里,我一直在努力从 Coreos/prometheus-operator 存储库中拼凑出一些东西,并且我已经用我所拥有的内容更新了这个问题。谢谢!
    • @jordan-liggitt 你有关于删除匿名访问的消息来源吗?我面临与 OP 相同的问题
    • 就我而言,这看起来像是一般的身份验证问题,正如 Jordan 所说。当我尝试手动 curl 同一 pod 中容器中的端点时(通过部署管理,配置为使用 prometheus 服务帐户):curl -vsSk -H "Authorization: Bearer $(</var/run/secrets/kubernetes.io/serviceaccount/token)" https://$NODE_IP:10250/metrics 我得到 HTTP/1.1 401 Unauthorized。
    【解决方案2】:

    根据@JorritSalverda 的票的讨论; https://github.com/prometheus/prometheus/issues/2606#issuecomment-294869099

    由于 GKE 不允许您获取允许您使用 kubelet 验证自己的客户端证书,因此 GKE 上用户的最佳解决方案似乎是使用 kubernetes API 服务器作为节点的代理请求。

    为此(引用@JorritSalverda);

    “对于在 GKE 中运行的 Prometheus 服务器,我现在可以通过以下重新标记运行它:

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

    以及以下 ClusterRole 绑定到 Prometheus 使用的服务帐号:

    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRole
    metadata:
      name: prometheus
    rules:
    - apiGroups: [""]
      resources:
      - nodes
      - nodes/proxy
      - services
      - endpoints
      - pods
      verbs: ["get", "list", "watch"]
    

    由于 GKE 集群在 RBAC 失败的情况下仍有 ABAC 回退,因此我不能 100% 确定这是否涵盖了所有必需的权限。

    【讨论】:

      【解决方案3】:

      这就是我为角色定义和绑定所做的工作。

      apiVersion: rbac.authorization.k8s.io/v1beta1
      kind: ClusterRole
      metadata:
        name: prometheus
      rules:
      - apiGroups: [""]
        resources:
        - nodes
        - services
        - endpoints
        - pods
        verbs: ["get", "list", "watch"]
      - nonResourceURLs: ["/metrics"]
        verbs: ["get"]
      ---
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: prometheus
        namespace: default
      ---
      apiVersion: rbac.authorization.k8s.io/v1beta1
      kind: ClusterRoleBinding
      metadata:
        name: prometheus
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: prometheus
      subjects:
      - kind: ServiceAccount
        name: prometheus
        namespace: default

      【讨论】:

        猜你喜欢
        • 2022-11-02
        • 1970-01-01
        • 2022-01-22
        • 1970-01-01
        • 2022-10-17
        • 2022-12-02
        • 2022-12-17
        • 1970-01-01
        • 2020-01-10
        相关资源
        最近更新 更多