【问题标题】:kubernetes api servers showing down in prometheus (kube-state-metrics) --"forbidden: User \"system:anonymous\" cannot get path \"/metrics\"",kubernetes api 服务器显示在 prometheus (kube-state-metrics) --"forbidden: User \"system:anonymous\" cannot get path \"/metrics\"",
【发布时间】:2019-10-29 15:42:10
【问题描述】:

我是 k8s 的新手,普罗米修斯。我正在尝试使用 prometheus 收集每个 pod 的指标,但由于错误而无法这样做: API ERROR.

{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {

  },
  "status": "Failure",
  "message": "forbidden: User \"system:anonymous\" cannot get path \"/metrics\"",
  "reason": "Forbidden",
  "details": {

  },
  "code": 403
}

【问题讨论】:

    标签: kubernetes prometheus kubectl


    【解决方案1】:

    system:anonymous 表示未经身份验证的用户试图从您的集群中获取资源,这是被禁止的。您将需要创建一个服务帐户,然后通过 RBAC 授予该服务帐户一些权限,然后创建该服务帐户以获取指标。所有这些都记录在案。

    作为一种解决方法,您可以这样做:

    kubectl create clusterrolebinding prometheus-admin --clusterrole cluster-admin --user system:anonymous
    

    现在,请注意这是一个可怕的想法,除非您正在使用 kubernetes。使用此权限,您将授予任何未经身份验证的用户对您的集群的总权限。

    【讨论】:

    • 这里提到的特定权限是/metrics 的非资源URL,动词Get
    • 对于 kube-state-metrics 的示例清单,似乎甚至没有将此权限列为必需的。这就是让我绊倒并把我带到这里的原因。我添加了一个包含更多信息的答案
    • 谢谢。我现在能够提取指标并能够在 grafana 中导入仪表板
    【解决方案2】:

    创建以下清单:

    ServiceAccount.yaml:

        apiVersion: v1
        kind: ServiceAccount
        metadata:
            labels:
                app.kubernetes.io/name: kube-state-metrics
            name: kube-state-metrics
            namespace: grafana
    

    ClusterRole.yaml

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
        labels:
            app.kubernetes.io/name: kube-state-metrics
        name: kube-state-metrics
    rules:
        - apiGroups:
            - ""
          resources:
              - configmaps
              - secrets
              - nodes
              - pods
              - services
              - resourcequotas
              - replicationcontrollers
              - limitranges
              - persistentvolumeclaims
              - persistentvolumes
              - namespaces
              - endpoints
          verbs:
              - list
              - watch
        - apiGroups:
            - extensions
          resources:
              - daemonsets
              - deployments
              - replicasets
              - ingresses
          verbs:
              - list
              - watch
        - apiGroups:
            - apps
          resources:
              - statefulsets
              - daemonsets
              - deployments
              - replicasets
          verbs:
              - list
              - watch
        - apiGroups:
            - batch
          resources:
              - cronjobs
              - jobs
          verbs:
              - list
              - watch
        - apiGroups:
            - autoscaling
          resources:
              - horizontalpodautoscalers
          verbs:
              - list
              - watch
        - apiGroups:
            - authentication.k8s.io
          resources:
              - tokenreviews
          verbs:
            - create
        - apiGroups:
            - authorization.k8s.io
          resources:
              - subjectaccessreviews
          verbs:
              - create
        - apiGroups:
            - policy
          resources:
              - poddisruptionbudgets
          verbs:
              - list
              - watch
        - apiGroups:
            - certificates.k8s.io
          resources:
              - certificatesigningrequests
          verbs:
              - list
              - watch
        - apiGroups:
            - storage.k8s.io
          resources:
              - storageclasses
          verbs:
              - list
              - watch
        - nonResourceURLs:
              - "/metrics"
          verbs:
              - get
    

    ClusterRoleBinding.yaml:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
        labels:
            app.kubernetes.io/name: kube-state-metrics
        name: kube-state-metrics
    roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: kube-state-metrics
    subjects:
        - kind: ServiceAccount
          name: kube-state-metrics
          namespace: grafana
    

    并通知您的 Kube-State-Metrics 部署使用新的 ServiceAccount,并在模板规范中添加以下内容:serviceAccountName: kube-state-metrics

    【讨论】:

    • namespace: "{{ namespace }}" 值是否采用所需的命名空间进行抓取?
    • 抱歉,这是我个人代码中遗留下来的 jinja 模板。我使用 Ansible 部署所有这些并使用 Jinja 注入变量。我已更新我的回复并将namespace 声明切换为 Grafana,这是为我的命名空间设置的变量。这里的核心思想是将 ServiceAccount 部署到要在其中使用它的命名空间。然后,您配置一个与命名空间无关的 ClusterRole,您可以在其中委派您将与 ServiceAccount 关联的权限。然后创建一个 ClusterRoleBinding 来将 CR 绑定到 SA。其中你指定 NS。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 2022-12-27
    • 1970-01-01
    相关资源
    最近更新 更多