本文是grafana/prometheus生产级容器化实践系列文章的第一篇。
目录:
(1).grafana/prometheus简单回顾
(2).grafana/prometheus生产级实践
1.容器化多个prometheus实例
2.exporter组件
3.业务服务
4.grafana
(3).grafana/prometheus生产级容器化配置
1.注意事项
2.容器化步骤
3.关键配置
(4).相关文章
(1).grafana/prometheus简单回顾
prometheus是时序数据库,相比传统数据库更适合存储监控类数据;是一套开源的系统监控报警框架。它启发于 Google 的 borgmon 监控系统;同时也是云原生时代监控的事实标准。
Grafana是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的展示,并及时通知,支持多种数据源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB。一般都使用prometheus作为其数据源。
每一个prometheus实例都有一个prometheus.xml配置,里边定义了抓取规则,从满足哪些条件的服务获取metircs数据,默认60秒抓一次;然后在grafana上制作dashboard,在dashboard中定义查询语句将监控数据展示为监控图表。
(2).grafana/prometheus生产级实践
原始图片位于:
https://github.com/hepyu/k8s-app-config/blob/master/product/standard/grafana-prometheus-pro/images/grafana-prometheus%E7%94%9F%E4%BA%A7%E7%BA%A7%E5%AE%9E%E8%B7%B5.jpg
如上图所示:
1.容器化多个prometheus实例
由于当数据量很大(metrics很多)或者grafana选择的时间跨度很大时,prometheus的吞吐性能会很有问题,再加上会有很多人通过grafana查看各业务数据,如果生产环境只部署一个prometheus,肯定是有问题的,prometheus会经常性崩溃。
同时,这样也可以设置不同的数据保存时间,比如对于mq来说,我希望保留更长时间的数据。
2.exporter组件
prometheus-expoerter组件是一个数据收集和聚合的组件,以exporter-rocketmq为例,prometheus通过prometheus.xml中定义的抓取规则定时从exporter-rocketmq拉取监控数据,exporter-rocketmq收到请求后,再从rocketmq集群获取监控数据,分析处理后聚合成metircs的格式返回给prometheus存储。
本文中的rocketmq-exporter没有使用官方的exporter,是根据笔者公司的情况自行开发,后续会另行发文/开源。
3.业务服务
prometheus不仅仅作为基础组件的监控数据存储,同样的,我们可以在业务服务中使用,去监控一些业务指标,比如笔者曾经开发的oss上传基础服务,笔者十分关心文件上传数,上传文件大小/时间,以及相关的p90等指标。帮助笔者发现/确认问题,事实上很有帮助,比如曾经发现有1G大小的文件被上传等异常现象。
成本强相关的服务(不局限于此)非常适合这样处理。
可以理解为监控打点。
下图为oss上传服务的上传文件大小的监控截图:
下图为oss上传服务架构图:
原图参见:
https://github.com/hepyu/k8s-app-config/blob/master/product/standard/grafana-prometheus-pro/images/caf-cdn%E6%96%B9%E6%A1%88.jpg
相关文章参见:
4.grafana
主要说明3部分,grafana-web, provisioning-datasources, provisioning-dashboards
grafana-web:
通过丰富图表展示监控数据,这些图表有dashboard定义。
provisioning-datasources:
位于:
https://github.com/hepyu/k8s-app-config/tree/master/product/standard/grafana-prometheus-pro/grafana/provisioning/datasources
这个目录下只有一个文件datasource.yml,定义grafana获取查询数据的数据源,可以定义多个数据源,不同的图表/dashboard可以使用不同的数据源。
datasources:
- name: prometheus-mq-rocketmq
type: prometheus
access: proxy
orgId: 1
url: http://prometheus-mq-rocketmq:9090
isDefault: false
jsonData:
tlsAuth: false
tlsAuthWithCACert: false
provisioning-dashboards:
位于:
https://github.com/hepyu/k8s-app-config/tree/master/product/standard/grafana-prometheus-pro/grafana/provisioning/dashboards
这个目录下有一个provision.yml配置文件,和不同监控组件的dashboard目录。
provision.yml定义了dashboard位置,用于grafana启动时加载。
providers:
- name: 'storage-mysql'
orgId: 1
folder: 'storage-mysql'
folderUid: ''
type: file
options:
path: /var/lib/grafana/k8s-app-config/product/standard/grafana-prometheus-pro/grafana/provisioning/dashboards/storage-mysql
- name: 'mq-rocketmq'
orgId: 1
folder: 'mq-rocketmq'
folderUid: 'mq-rocketmq'
type: file
options:
path: /var/lib/grafana/k8s-app-config/product/standard/grafana-prometheus-pro/grafana/provisioning/dashboards/mq-rocketmq
建议使用provisioning-dashboards方式去定义dashboard,这样的dashboard在grafana界面是不允许修改的,更加安全,防止误操作。
(3).grafana/prometheus生产级容器化配置
笔者提供了一个grafana/prometheus生产级的容器化配置,完全按照本文方式实现,位于:
https://github.com/hepyu/k8s-app-config/tree/master/product/standard/grafana-prometheus-pro
1.注意事项
a.本配置使用的是local-pv,生产使用要换成云存储,本配置提供nfs的配置(已注释)。
b.imagePullSecret是注释掉的,生产要打开,因为镜像仓库都是有secret的。
c.注意先建立pv目录和挂载,注意目录的权限,否则prometehus, grafana容器化失败,给775或777。
2.容器化步骤
kubectl apply -f grafana-prometheus-image-repo-secret.yaml(生产环境需要改成自己的秘钥,本地部署不要执行)
kubectl apply -f grafana-prometheus-namespace.yaml
分别进入子目录执行:kubectl apply -f .
容器化完成后的样例:
不过现在dashboard是没有数据显示的,如何将各类基础中间件纳入grafana/prometheus监控,请关注后续文章。
3.关键配置
下述关键配置位于文件:
https://github.com/hepyu/k8s-app-config/blob/master/product/standard/grafana-prometheus-pro/grafana/grafana-statefulset.yaml
下边的配置保证grafana启动前先把dashboards和datasources配置下载到本地。
initContainers:
- name: dashboards-clear
#存到你公司自己的镜像仓库,不要用docker官方仓库
image: alpine/git:1.0.7
command: ['sh', '-c', 'rm -rf inc-k8s-app-config']
volumeMounts:
- name: pv-metrics-grafana
mountPath: /git
- name: dashboards-sync
#存到你公司自己的镜像仓库,不要用docker官方仓库
image: alpine/git:1.0.7
command: ['sh', '-c', 'git clone ']
volumeMounts:
- name: pv-metrics-grafana
mountPath: /git
下图配置指定了grafana启动时从哪里加载dashboards和datasources,即之前git clone下的目录。
env:
#开启percona的dashboards,用于mysql监控dashboard显示,关闭,我们通过provisioning方式实现dashboard导入.
env:
#开启percona的dashboards,用于mysql监控dashboard显示,关闭,我们通过provisioning方式实现dashboard导入.
#- name: GF_INSTALL_PLUGINS
# value: "percona-percona-app"
- name: GF_PATHS_PROVISIONING
value: "/var/lib/grafana"
(4).相关文章
1.
2.
閱讀更多 實戰架構 的文章