文档 · 2023年3月18日 0

使用Prometheus监控多个k8s集群

一. 场景描述:

随着公有云的不断普及和使用,很多时候我们遇到的可能是既有线下物理环境又有云上环境,相对于主机资源来说配置prometheus比较容易就不用多说了,然而当环境复杂,线上集群 线下捷群,生产,测试,开发,各个系统可能会创建多个集群,那么此时为了统一管理有的朋友可能会想将所有的监控数据统一使用一套prometheus进行收集。

觉得麻烦或者新版的kube-prometheus也可以参考:prometheus的Federation(联邦) – woniusnail 同样以达到目的

二. 环境准备

  1. 已经安装prometheus, 安装参考: Prometheus+Grafana+Alertmanager实现监控+告警通知 – woniusnail  或 K8s安装prometheus监控 – woniusnail   [建议本地二进制安装,所有指标汇总一起资源开销比较大]
  2. 保持安装peometheus的主机与被监控的集群apiservices网络通畅;

三.  开始安装

  1. 在目标集群创建rbac权限。登录到目标集群后台节点,创建prometheus_rbac.yaml文件。(文件中sa,role,rolebinding名字皆可以修改但是注意绑定关系)
apiVersion: v1
kind: ServiceAccount
metadata:
  name: prometheus-test
  namespace: kube-system

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: prometheus-test
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/v1
kind: ClusterRoleBinding
metadata:
  name: prometheus-test
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: prometheus-test
subjects:
- kind: ServiceAccount
  name: prometheus-test
  namespace: kube-system
       2. 执行以下命令创建rbac权限。
kubectl apply -f prometheus_rbac.yaml
       3.获取目标集群bearer_token信息。(用作prometheus访问k8s api-server的token验证)
       说明:
  • 1.21以前版本的集群中,Pod中获取Token的形式是通过挂载ServiceAccount的Secret来获取Token,这种方式获得的Token是永久的。该方式在1.21及以上的版本中不再推荐使用,并且根据社区版本迭代策略,在1.25及以上版本的集群中,ServiceAccount将不会自动创建对应的Secret。
  • 1.21及以上版本的集群中,直接使用TokenRequest API获得Token,并使用投射卷(Projected Volume)挂载到Pod中。使用这种方法获得的Token具有固定的生命周期,并且当挂载的Pod被删除时这些Token将自动失效。详情请参见Token安全性提升说明

  • 如果您在业务中需要一个永不过期的Token,您也可以选择手动管理ServiceAccount的Secret。尽管存在手动创建永久ServiceAccount Token的机制,但还是推荐使用TokenRequest的方式使用短期的Token,以提高安全性。

       4.首先获取serviceaccount信息:
kubectl describe sa prometheus-test -n kube-system
#上面创建的sa改名了 记得修改这个名字
       5.通过sa获取该sa绑定的token:
kubectl get secret -n kube-system $(kubectl get serviceaccount <service-account-name> -n kube-system -o jsonpath='{.secrets[0].name}') -o go-template='{{ .data.token | base64decode }}'

#<service-account-name> 替换成刚创建的sa名字。
如果你的集群版本为1.25以上默认不会创建和关联 secret 可以手动创建,但是请务必了解其作用,强烈建议阅读第3中步注意的内容:
      6.手动创建secret 并关联到sa:(如果版本低于1.25并且自动关联了secret 则忽略)
#新建secret文件
vim prometheus-test-secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: prometheus-test-secret
  namespace: kube-system
  annotations:
    kubernetes.io/service-account.name: "prometheus-test" #关联的sa名字
type: kubernetes.io/service-account-token

#创建secret
kubectl apply -f prometheus-test-secret.yaml

#编辑第1步创建好的sa
kubectl edit sa prometheus-test -n kube-system
apiVersion: v1
kind: ServiceAccount
metadata:
  name: prometheus-test
  namespace: default
  resourceVersion: "398"
  uid: b1fcbd7
#添加下面的内容
secrets:
- name: prometheus-test-secret  #这里填写刚刚创建的secret名字

#保存
关联成功后执行第5步获取token即可
       7.配置bearer_token 信息,登录到Prometheus所在机器,进入Prometheus的安装目录,将目标集群的token信息保存在文件中。
#为了方便在prometheus家目录下新建了个cert文件将所有集群的token分别新建文件放在里面
[root@prometheus cert]# pwd
/volumes01/prometheus/cert
[root@prometheus cert]# vim k8s-01.token
eyJhbGciO...
[root@prometheus cert]#
      8.配置Prometheus监控job,示例job监控的是容器指标。如果需要监控其他指标,可自行添加job编写抓取规则。
[root@prometheus prometheus]# vim prometheus.yml
...
#集群1
   - job_name: 'k8s-01-nodes-cadvisor'
     kubernetes_sd_configs:
     - role: node
       api_server: https://192.168.10.100:5443
       tls_config:
         insecure_skip_verify: true
       bearer_token_file: /volumes01/prometheus/cert/k8s-01.token   #这里配置集群的token
     scheme: https
     relabel_configs:
     - target_label: environment
       replacement: "测试环境"
     - action: labelmap
       regex: __meta_kubernetes_node_label_(.+)
     - target_label: __address__
       replacement: 192.168.10.100:5443
     - source_labels: [__meta_kubernetes_node_name]
       regex: (.+)
       target_label: __metrics_path__
       replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
     #下面这部分是用来调用api时需要的x.509证书,也就是配置kubectl客户端时用的证书文件。如果调用报证书问题建议开启配置,注意格式对齐。
     #tls_config:
     #  ca_file: /volumes01/prometheus/cert/k8s-01-ca.crt
     #  cert_file: /volumes01/prometheus/cert/k8s-01-client.crt
     #  key_file: /volumes01/prometheus/cert/k8s-01-client.key

#集群2
   - job_name: 'k8s-02-nodes-cadvisor'
     kubernetes_sd_configs:
     - role: node
       api_server: https://192.168.10.200:5443
       tls_config:
         insecure_skip_verify: true
       bearer_token_file: /volumes01/prometheus/cert/k8s-02.token   #这里配置集群的token
     scheme: https
     relabel_configs:
     - target_label: environment
       replacement: "开发环境"
     - action: labelmap
       regex: __meta_kubernetes_node_label_(.+)
     - target_label: __address__
       replacement: 192.168.10.200:5443
     - source_labels: [__meta_kubernetes_node_name]
       regex: (.+)
       target_label: __metrics_path__
       replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
     #下面这部分是用来调用api时需要的x.509证书,也就是配置kubectl客户端时用的证书文件。如果调用报证书问题建议开启配置,注意格式对齐。
     #tls_config:
     #  ca_file: /volumes01/prometheus/cert/k8s-01-ca.crt
     #  cert_file: /volumes01/prometheus/cert/k8s-01-client.crt
     #  key_file: /volumes01/prometheus/cert/k8s-01-client.key
...
      9.配置完毕后,重启prometheus服务,或者重新加载配置文件。下面示例重载配置
#重载配置不重启服务
[root@prometheus prometheus]# curl -X POST 127.0.0.1:9090/-/reload
     10.查看prometheus  web页面

 

 

打赏