基于Kubernetes的PaaS平台提供的监控服务
Contents
概述
我一直在负责维护的PaaS平台引入了Kubernetes作为底层支持, 可以借助Kubernetes的生态做更多的事情, 这篇博客主要介绍如何为普通用户提供图表监控服务(承接上一篇提供dashboard支持). 默认读者有能力自己搭建
Kubernetes集群以及初级的监控系统, 以及可以简单的使用PromQL, 因为博客主要想介绍的内容不在此.
我早于dashboard就增加了这个功能, 但是讲解起来实在复杂. 一直拖着没写, 今天有空, 正好来分享一下吧.
方案拓扑
这里我懒一下, 不想画图了.

图中是整个方案的左半边, 由采集工具采集机器以及容器信息, 上传至Prometheus中, 右下角的Grafana通过PromQL查询以及展示数据,
下面两个部分会简单介绍Prometheus以及Grafana, 但重点在后面哈.
朴素的收集与展示工具-Prometheus
这是一张Ingress的CPU利用率统计图:

朴素的原因主要是这个工具做作用是收集数据, 每次只能查询一条语句, 而且没有什么历史记录功能, 权限控制几乎没有, 这样基础的工具肯定不能直接提供给用户.
漂亮的展示工具-Grafana

相比上面简陋的图片, Grafana的功能就强大很多了, 可以展示多张图表, 而且有了权限控制, 非常适合建立大盘监控, 对于PaaS平台中的每个用户来讲,
看到自己应用的监控是多么美妙的一件事.
分界线 ---------
如果仅仅是介绍到这里, 大家在自己的Kubernetes集群中鼓捣一下应该很快就可以用了, 我们既然作为PaaS平台的开发者, 自然要考虑多用户以及多应用的组织管理方式, 呈现给用户需要的资料的同时, 也要保证用户以及应用间不会相互影响. 没错这与上一篇dashboard支持方案类似, 也要进行权限设计以及控制.
权限同步策略
PaaS平台的权限系统
在PaaS平台中, 假设我们有一个用户A, 他拥有自己的一个或多个应用群组(G1, G2), 每个群组中部署了一系列应用程序(a1, a2...).
Grafana中的权限系统
在Grafana权限系统中, 有一些Teams, 用户可以属于一个或多个Team.

每个Folder可以拥有一个或多个dashboard.

映射
考虑到上述的关系, 我们的思路就很明确了, 我的设计方案是:
- 用户的每个群组对应一个Team, 该Team拥有一个Folder的访问权限
- 每个应用拥有一个dashboard
你也可以使用别的设计方案(比如说不要Folder, 每个Team拥有一些dashboard), 上述方案只是我想方便管理, 每个Team拥有自己的Folder.
Grafana相关类库及其使用(tl;dr)
我用的是Python定时同步权限以及图表信息, 当时也想过用Golang, 但我说真的, 这种代码用Python太适合了.
下面的部分太过于偏了, 建议不要去纠结, 你大概率用不上, 肯定要自己去读文档的.
1 | grafana-api==1.0.3 # 用来与Grafana API通信 |
User, Team, Folder创建
1 | # 下面是一个team的创建, 其他类似 |
Folder与Team权限同步
1 | # 下面是同步team以及其用户, 因为用户有可能增减, 需要对应的增减 |
dashboard页面设计以及同步
这部分其实挺难的, 我想使用类似声名式的写法, 类似kubectl apply -f xxx.yaml, 不过Grafana的API太难用了, 一种解决方案是: 导入dashboard图表数据, 可以看到我这里的api都是手动加的.
1 | def sync_dashboard_data(dashboard_uid, folder_id, dashboard_json_data, inputs=[]): |
最终效果
针对我们系统中的每个应用, 基本都有这么一张图表:

常用的图表推荐
我平时作为管理员一般也不会看每个应用, 可能看个大概吧.
ingress
https://github.com/kubernetes/ingress-nginx/blob/master/deploy/grafana/dashboards/nginx.json

node_exporter
https://github.com/rfrail3/grafana-dashboards/blob/master/prometheus/node-exporter-full.json

总结
这篇文章我主要想介绍下我们的系统是如何设计的, 希望能够在大家设计系统接入方案时能有所参考, 也欢迎大家留言讨论.
顺便吐槽一下Grafana, 居然不能设置URL头像(为了改头像我都去读grafana代码了, 发现不能修改), 真是令人生气!!!