Prometheus 监控外部 Kubernetes 集群
前面我们的文章中都是将 Prometheus 安装在 Kubernetes 集群中来采集数据,但是在实际环境中很多企业是将 Prometheus 单独部署在集群外部的,甚至直接监控多个 Kubernetes 集群,虽然不推荐这样去做,因为 Prometheus 采集的数据量太大,或大量消耗资源,比较推荐的做法是用不同的 Prometheus 实例监控不同的集群,然后用联邦的方式进行汇总。但是使用 Prometheus 监控外部的 Kubernetes 集群这个需求还是非常有必要的。
比如现在我们要去采集 Kubernetes 集群 cAdvisor 的监控数据,我们就可以利用 APIServer
通过 kubelet 去获取到对应的数据。如果我们对集群内部的 Prometheus 自动发现 Kubernetes 的数据比较熟悉的话,那么监控外部集群的原理也是一样的,只是访问 APIServer 的形式有 inCluster 模式变成了 KubeConfig 的模式
,inCluster 模式下在 Pod 中就已经自动注入了访问集群的 token 和 ca.crt
文件,所以非常方便,那么在集群外的话就需要我们手动提供这两个文件,才能够做到自动发现了。
接下来就首先构造 Prometheus 连接 APIServer 的信息,在通过 kubernetes_sd_configs
做服务发现的时候只需要填入 Kubernetes 集群的 api_server、ca_file、bearer_token_file
信息即可,要想获得这几个文件信息也比较简单。
创建用于 Prometheus 访问 Kubernetes 资源对象的RBAC
对象:
# prom.rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: prometheus
namespace: kube-ops
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: prometheus
rules:
- apiGroups:
- ""
resources:
- nodes
- services
- endpoints
- pods
- nodes/proxy
verbs:
- get
- list
- watch
- apiGroups:
- "extensions"
resources:
- ingresses
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- configmaps
- nodes/metrics
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: kube-ops
在 Kubernetes 集群中创建上面的资源对象:
$ kubectl apply -f prom.rbac.yaml
然后获取上面的 Prometheus 对应的 Secret
的信息:
[root@k8s-master1 prometheus]# kubectl get sa prometheus -n kube-ops -o yaml
......
apiVersion: v1
kind: ServiceAccount
metadata:
annotations:
kubectl.kubernetes.io/last-applied-conf