普罗米修斯 - Kubernetes RBAC

Prometheus - Kubernetes RBAC

我将我的 GKE API 服务器升级到 1.6,并且正在将节点升级到 1.6,但是 运行 遇到了麻烦...

我有一个普罗米修斯服务器(版本 1.5.2)运行 在一个由 Kubernetes 部署管理的 pod 中,有几个节点 运行 版本 1.5.4 Kubelet,只有一个新节点 运行 1.6.

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

这似乎是一个 RBAC 问题,但我不确定如何进行。我找不到关于普罗米修斯服务器需要什么角色的文档,甚至找不到如何将它们 g运行t 到服务器的文档。

从 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。

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

401表示unauthenticated,也就是说不是RBAC的问题。我相信 GKE 在 1.6 中不再允许匿名访问 kubelet。您使用什么凭据对 kubelet 进行身份验证?

根据对@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//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 集群仍然有一个 ABAC 回退以防 RBAC 失败,我不能 100% 确定这涵盖了所有必需的权限。

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

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