OpenShift 和 Prometheus

Prometheus作为最常用的集群的监控组件,它收集了集群最全的状态信息。那么当我们需要将它与现有的监控告警平台打通,或者根据它开发一个自己的监控展示平台时,就不得不需要获得Prometheus的监控数据了。这时就不得不访问Prometheus的API接口。
根据场景的不同有两种方式能够获取到Prometheus的数据

  1. 集群外部,通过访问Prometheus UI的链接来获取指标数据
  2. 集群内部,进入Prometheus容器中,获取指标数据

1. 集群外部,curl访问Prometheus UI地址

由于OpenShift上部署的Prometheus应用对接了OpenShift的用户认证oauth-proxy,所以必须先获取用户的Token后再通过curl访问prometheus服务获取数据,具体操作如下。

1
2
3
4
5
6
7
8
9
10
11
12
# #登录
[root@master ~]# oc login -u admin
Authentication required for https://master.example.com:8443 (openshift)
Username: admin
Password:
Login successful.
# #获取Token
[root@master ~]# oc whoami -t
ZhzCkIUKoHpVgen65DIYQodNVdYjguD6Y4AEGiG_Z2E
# #获取prometheus数据
[root@master ~]# curl -ks -H 'Authorization: Bearer ZhzCkIUKoHpVgen65DIYQodNVdYjguD6Y4AEGiG_Z2E' \
'https://prometheus-k8s-openshift-monitoring.apps.example.com/api/v1/query?query=${QUERY_EXPRESSION}'

2. 集群内部,进入Prometheus容器获取数据

进入Prometheus应用的容器,绕过了OpenShift的认证,直接获取数据,具体操作如下。

1
2
3
[root@master ~]# oc exec -c prometheus prometheus-k8s-0 -- curl -s \
'http://localhost:9090/api/v1/query?query=${QUERY_EXPRESSION}' \
| python -m json.tool

其中${QUERY_EXPRESSION}即为Prometheus请求表达式,如:count(kube_pod_container_status_running%7Bcontainer%3D%22etcd%22%7D)来获取正常运行的etcd容器的个数
其中%7B(%7D)%3D=%22",这些都需要经过HtmlEncode编码。也可以通过Prometheus界面上通过抓包的方式,获取截取具体的QUERY_EXPRESSION表达示。

总结

Prometheus API通过HTTP服务的方式向外提供它的监控数据,以上使用curl工具方便地获取监控指标,实际中可以通过各种开发语言进行获取需要的数据。返回数据都为json格式,根据需要可以非常方便地对数据进行格式转化处理。
正常情况下,返回的code为2xx,但也会有不正常的请求Code,如下:

  • 404 Bad Request:当参数错误或者缺失时
  • 422 Unprocessable Entity 当表达式无法执行时
  • 503 Service Unavailiable 当请求超时或者被中断时