OpenShift 和 Prometheus

背景

大家知道OpenShfit官方通过Prometheus Operator可以快速构建高可用的监控告警平台,它不仅能够收集集群本身的监控指标,还可以通过ServiceMonitor扩展以监控应用自身的指标,实现单集群内部的统一监控。但是生产实践中,我们并不会只采用一个OpenShift部署应用,还会部署非容器应用,在非容器环境下也可能会部署Prometheus来监控相关服务(特别是现在Prometheus已经成为了监控的一个标配),甚至有可能会在不同的网络区部署多个集群,由于不同网络的隔离特性显然一组Prometheus是无法满足所有平台及应用的监控的。这就使得生产中会有很多套Prometheus集群需要管理与维护,查看监控指标也很分散,也就让我们想到必须采用一种办法能够将各处的指标统一收集,实现多集群多Prometheus服务的统一监控。
目前实现这种要求的方法主要有两个,一个是通过Prometheus联邦 Federate,另一个是通过Thanos。今天主要介绍集群外部如何使用Prometheus联邦机制收集OpenShift内部Prometheus服务的监控指标。

操作

实现其实很简单,主要就是配置外部Prometheus的prometheus.yml文件来实现Prometheus联邦。具体配置如下,后面有相关重要配置的详细说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
global:
evaluation_interval: 15s
scrape_interval: 15s
scrape_timeout: 10s

- job_name: prometheus_test
honor_labels: true
metrics_path: '/federate'
params:
'match[]':
- '{__name__=~".+"}'
scheme: https
tls_config:
insecure_skip_verify: true
#basic_auth:
# username: 'internal'
# password: <PASSWORD>
bearer_token: <TOKEN>
static_configs:
- targets: ['prometheus-k8s-openshift-monitoring.app.group.domain:443']
labels:
env: test
  • 'match[]'= '{__name__=~".+"}'表示所有的指标都收集,如果只需要收集部分的话,可以通过类似- '{job="node-exporter"}'格式筛选Label指定。
  • 除了使用bearer_token的方式认证,也可以使用basic_auth的方式认证,openshift默认安装的Prometheus支持这两种方式认证,basic_auth的用户名:internal与密码在secret grafana-datasources中,具体获取方式如下:
    1
    2
    3
    $ #用户名为 internal
    $ #获取密码脚本
    $ oc get secret grafana-datasources -o yaml -n openshift-monitoring | grep prometheus | awk '{print $2}' | base64 -d | grep basicAuthPassword | awk -F\" '{print $4}'
  • 通过创建一个serviceaccount来获取它的Token
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    apiVersion: v1
    kind: ServiceAccount
    metadata:
    name: prom-fed
    namespace: kube-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
    name: prom-fed
    roleRef:
    apiGroup: rbac.authorization.k8s.io
    kind: ClusterRole
    name: cluster-admin
    subjects:
    - kind: ServiceAccount
    name: prom-fed
    namespace: kube-system
    1
    $ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep prom-fed | awk '{print $1}')
    监控Targets

联邦Prometheus上展示监控指标