普罗米修斯 - 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
我将我的 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