继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

0基础入门 docker 部署 各种 Prometheus 案例 - 程序员学点xx 总集篇

慕虎7427763
关注TA
已关注
手记 8
粉丝 0
获赞 3

img

[TOC]

大家好, 学点xx 系列也推出一段时间了。虽然 yann 能力有限,但还是收到了很多鼓励与赞赏。对这个系列 yann 还是很喜欢的,特别是 Prometheus 篇,在期间经历公众号 100 篇文章纪念,和一次较大的改版。真的是很难忘的一个篇章,下面带领大家回顾下。

第 1 部分 出发

部署

在之前的分享中 yann 说需要准备个配置文件,然后使用 docker 就可以把 Prometheus 启动起来了,其实这是不完整的。起来的只是服务端,他还需要客户端,或者说还需要帮它提供 metrics 的各种模块。

让我们依次来完成这个事情,首先完成一个 prometheus 的yml配置文件。这里, yann 从官网拿了一个实例的配置文件,虽然内容很多,但没有做任何修改。同样,你也可以直接用这个文件让它跑起来,后面我们会有个篇章来分析配置文件的详细内容。

prometheus.yml
global:scrape_interval:     15s # By default, scrape targets every 15 seconds. # Attach these labels to any time series or alerts when communicating with # external systems (federation, remote storage, Alertmanager).external_labels:  monitor: 'codelab-monitor'# A scrape configuration containing exactly one endpoint to scrape:# Here it's Prometheus itself.scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.- job_name: 'prometheus'   # Override the global default and scrape targets from this job every 5 seconds.  scrape_interval: 5s  static_configs:    - targets: ['localhost:9090']
启动服务端

准备好配置文件以后,你可以用 docker 命令,挂载上这个配置文件,把 Prometheus 启动起来。

请注意一下配置文件的位置,yann 写的是自己服务器的文件路径,你需要改成自己的。

如果没有报错的话,服务端就起起来了,请用端口查看命令确认一下相应的端口有没有起来。注意,不要使用 docker ps 来查看。原因 yann 后面会说。

docker run -d \   --net=host \   -v /home/data/prom/prometheus.yml:/etc/prometheus/prometheus.yml \  prom/prometheus
启动客户端

用同样的方法把客户端 node-exporter 也启动起来,确认9090和9100端口是存在的。

docker run -d \ --net="host" \ --pid="host" \ -v "/:/host:ro,rslave" \quay.io/prometheus/node-exporter \ --path.rootfs=/host

以上两组命令都来自官网的文档。


初始界面

如果一切正常的话,我们可以来查看到下面的效果,截图的IP地址是yann 服务器上面的,你可以换上自己的来试一下。

img

输入 IP 地址:9090 端口默认会到达这个网址。这个界面可以选择相关项目进行一些查询操作,也可以选择查询的项目的时间范围。

metrics

部署好Node Exporte 后可以看到。

另外,http://10.10.13.15:9100/metrics 也可以看到相同的输出。

img

targets界面

这个页面可以看到现在监控的目标。如图,yann 现在监控了两个项目:一个是自身的 9090,一个是客户端 9100,状态都是正常的。


避坑

在这个配置中 yann 遇到了两个坑,现在也给大家分享出来,避免其他人也陷入进来。

端口消失

第一个坑准确来说也不算是坑,是 docker 的一个参数,只不过 yann 不是经常用。

--net=host

当配置了这个参数时, 表示直接打通容器网络与本地网络。相对的 docker ps 上看不到容器的端口,一定要用端口查看命令看才能看得到。

描述可能比较抽象,yann 放了一个截图。可以看到查看状态的时候完全看不到容器的端口。

端口冲突

另外一个坑和上一条问题相关,因为在 docker ps 命令下没有过滤到端口。所以 yann 认为并没有端口冲突。实际上它和 yann 前些天部署的 elasticsearch-head 是冲突的,大家都是9100。如果有近期内搞过 ES 的同学要特别注意这一点。

433cab2b4724       mobz/elasticsearch-head:5                             "/bin/sh -c 'grunt s…"   11 days ago         Created                     9100/tcp  

当时 elasticsearch-head 因故又使用了安装包部署,这次的容器用了 --net=host 的网络设定,结果就在宿主机里杠上了。

第 2 部分 图表

图表

grafana 的部署相对简单

docker run -d --name=grafana -p 3000:3000 grafana/grafana

一行命令搞定, 确认3000 端口存在以后,在浏览器上访问就好。


如果问 grafana 难不难?大多数人都会感觉挺简单的:「不就是个可视化工具么,数据都有了,还怕表出不来?」。

其实还真有点难度, 主要原因就是找不到设置的地方;外加语言障碍(目前 yann 手里还没有中文版,有的筒子千万给我留言)。我们来一步一步看。

数据源

相比起来, 数据源还是比较好设置的, 如果是新部署向导程序还存在的话, 直接会引导过去。

如果是中途接手他人的项目的状况,也不用担心。yann 保证只拿到帐号密码,没人指导的情况下, 你也是可以把数据源配置出来的。

不过要注意下 Whitelisted Cookies , 这个框以前版本是没有的,yann 先填了个 none 跳过。

仪表盘

接下来是 dashboard,改配置仪表盘了。

很直观,然后

(此处感谢小熊)

「是选 Visualization (可视化) 对吧, 我已经看到图表的标志了。接着选择 Graph , 图表我来了」。

img

^^ 是不是有点无从下手。

各位不要笑, yann 最早也是坑在这里的。


开启图表

娱乐节目结束, 现在开始设置一个图表出来。

其实正确设置的位置是在上边一个按钮那里。

img

Metrics 栏目随便选择一个就可以了。

结果演示

还有另外两个按钮,是一些设置和告警, 自己看一下就好了。

最后, 设置需要保存一下,保存按钮在这里。

补充一下。设置完成后, 后期想调整 dashboard 也是在这里。找不到设置按钮,顺着左上角 田字白方块 点来点去的大有人在,笑。

第 3 部分 数据库

冒烟部署

闲话就此打住,先来操作。昨天的时候,我们曾经在 grafana 上弄出图表了。那么今天的任务。是产生很多的图表来应付mysql的日常需要。

怎么样产生大量的图表呢?一个一个设定当然是很累的,于是我们就想到了模板,先去官方的网站上先下套模板回来。

就你了。

导入模板,配置数据源。很顺利的图表就出来了,唉,好像少点什么,先不管他。

?为什么我的图表一直都是异常状态呢?设置数据源的时候,数据库连接测试也通过了,难道是权限不足让我们看看日志。

果然是权限不足,让我们加权限,还不行?我再加,我用root访问总可以了吧,什么,居然还不行。

撞墙之后开始反思。日志给出的信息比较有限,没有权限访问,不一定是账号没权限,先看看有没有这个库,果然没有?再分析一下搜索语句,终于发现了。原来这个模板是比较特殊的一个,它需要导入一个数据库进去。尝试操作了一下。终于不报异常了。

# 下载 https://github.com/john1337/my2Collectormysql --user=root -p < my2.sql# 赋权  CREATE USER 'grafanaReader' IDENTIFIED BY 'Abcd1234';  GRANT SELECT ON my2.* TO 'grafanaReader'@'172.17.%.%' IDENTIFIED BY 'Abcd1234';

这是我很早以前部署 prometheus 时候犯的一个错误。当时也没有那么意识到 exporter 的作用。找到一个包,下载下来就开始使用。

这个模板虽然和平常的不太一样,但并不是完全没有用处。如果有些环境,不是那么方便安装插件,反而容许导入表的话,是可以使用这种方法的。


正常部署

现在,我们来使用比较常规一些的方法部署 Mysql的图表。

更新用户权限

GRANT SELECT ON performance_schema.* TO 'yann'@'%' IDENTIFIED BY 'Abcd1234';

mysqld-exporter 部署

# docker network create my-mysql-networkdocker run -d \ --net="host" \-e DATA_SOURCE_NAME="yann:Abcd1234@(10.10.13.15:3306)/" \prom/mysqld-exporter

注意:

mysql 数据库一般有单独的容器网络。yann 之前选择了与宿主机互通, 现在也不方便改回来了。自己部署的话, 注意注释掉的语句,当然docker 命令也需要调整。

prometheus.yml 也调整一下, 这里先给出调整内容。整体配置后面会说明。

- job_name: linux_mysql  static_configs:    - targets: ['10.10.13.15:9104']      labels:        instance: yanns_mysql

添加了一个 job,修改后重新部署 prometheus 容器。

查看

再次访问 targets 网页,已经有新内容出现了。

img


开启图表

使用 mysqld-exporter 之后, 开启的数据源就是 prometheus 了。这一点请切记,很多同学因为是 Mysql 的监控, 就直接去添加了 Mysql 的数据源,然后奇怪为什么一直没有输出。

img

另外,图表的模板,也使用导入的方式,文件在这里:

git clone https://github.com/percona/grafana-dashboards.git  # 仓库                  ls grafana-dashboards/dashboards

PMM

最后, 再奉送一个我司在正使用的 PMM 的部署说明。

Percona监控和管理(PMM)是一个用于管理和监控MySQL和MongoDB性能的开源平台,其他详细介绍请自行百度。

部署

docker run -d \  -p 8089:80 \  -v pmm-data \  --name pmm-server \  --restart always \  percona/pmm-server

除了监控平台以外, 数据库服务器上还要安装 Client 并配置。当然,这不是今天的主题所以略过。

第 4 部分 服务器

监控

系统的 Agent 其实之前就部署好了。前两天 Prometheus 配置时候 启用的两个端口 9090 和 9100 ,其中9100 就是系统 Agent的端口,另外 提一下 9104 是Mysql的。

这里简单介绍一下配置文件:

# 全局global: # 默认抓取周期scrape_interval: 5s  # 规则的默认周期,比如持续30秒则匹配evaluation_interval: 30s # 规则文件,先不涉及# rule_files:# 抓取配置scrape_configs:   - job_name: "node"  static_configs:   - targets:       - "localhost:9100"# Alertmanager 告警相关配置alerting:alertmanagers: - scheme: https  static_configs:   - targets:     - "localhost:9093"

这是一个比较精简的配置文件,可以参考一下。另外注意,配置文件是 yaml 格式,需要注意对齐。

我们添加一下操作系统的监控配置。

- job_name: linux01  static_configs:    - targets: ['10.10.13.15:9100']      labels:        instance: yanns_linux

job 和 instance 的区别是,一个job 可以包含多个不同 IP 不同端口下的进程。

添加完成


查询

现在我们来演示一些数据的查询 :

文件系统可用字节数

node_filesystem_avail_bytes

效果如图:

显示了各个分区的可能空间, 当然纯数字是比较难以阅读的, 可以加上一些处理

常用的一些性能指标

下面是一些常用的查询语句, 大家可以自己试一下:

# cpu100 - (avg by (instance) (irate(node_cpu_seconds_total{job="linux01",mode="idle"}[5m])) * 100)# memnode_memory_MemFree_bytes{job='linux01'}# diskrate(node_disk_read_time_seconds_total{job='linux01', device='sda' }[5m]) * 512# networkrate(node_network_receive_bytes_total{job='linux', device!='lo'}[5m])

注意:exporter 对应字段的名字,根据版本不同会有所改变,如果查询没有结果,请自行调整。


告警

告警的配置略为繁琐, 我们从头开始梳理。

更新prometheus.yml

# 增加alerting:alertmanagers:- static_configs:  - targets:      - 10.10.13.15:9093rule_files:- '/etc/prometheus/alert.rules'

映射 alert.rules 文件

docker run -d --net=host \-v /home/data/prom/prometheus.yml:/etc/prometheus/prometheus.yml \-v /home/data/prom/alert.rules:/etc/prometheus/alert.rules \--name prometheus-server6 prom/prometheus

alert.rules 的内容

groups:- name: examplerules: # Alert for any instance that is unreachable for >5 minutes.- alert: InstanceDown  expr: up == 0  for: 5m  labels:    severity: page  annotations:    summary: "Instance {{ $labels.instance }} down"    description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes.groups:
Alertmanager配置文件
global:  resolve_timeout: 5mroute:  receiver: 'default-receiver'  group_wait: 30s  group_interval: 1m  repeat_interval: 1m  group_by: ['alertname']  routes:  - match:      severity: critical    receiver: email-mereceivers:- name: email-meemail_configs:- to: GMAIL_ACCOUNT  from: GMAIL_ACCOUNT  smarthost: smtp.gmail.com:587  html: '{{ template "email.default.html" . }}'  auth_username: "GMAIL_ACCOUNT"  auth_identity: "GMAIL_ACCOUNT"  auth_password: "GMAIL_AUTH_TOKEN"   - name: 'default-receiver'    webhook_configs:    - url: http://webhook-dingtalk/dingtalk/send/      send_resolved: true

部署Alertmanager

docker run -d  --net="host" -v /home/data/prom/config.yml:/etc/alertmanager/config.yml  --name alertmanager prom/alertmanager

简单说明一下, alert.rules 负责定义 哪种情况触发报警。而 Alertmanager 定义检查报警的情况以及告警媒介,例如邮件,钉钉等。

以下是一些配置截图展示:

更新配置后, 规则已经显示出来了

alertmanager 的页面,内容偏重组件自身的状态

关掉 mysqld_exporter 后产生的告警

img

第 5 部分 容器

部署

监控 Docker 需要 Prometheus、cAdvisor 和 Grafana。另外两个之前已经部署过, 我们来看一下 cAdvisor。

cAdvisor 可以对节点机器上的资源及容器进行实时监控和性能数据采集,包括CPU使用情况、内存使用情况、网络吞吐量及文件系统使用情况。

部署

这个软件属于开箱即用类型, 部署方便,以下为官方示例。

docker run \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:ro \ --volume=/sys:/sys:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --volume=/dev/disk/:/dev/disk:ro \ --publish=8081:8080 \ --detach=true \ --name=cadvisor \ --privileged=true \google/cadvisor:latest

已经部署完毕

配置

Prometheus 的配置文件也需要更新一下,给 prometheus.yml 追加 job:

 - job_name: cadvisor  static_configs:     - targets: ['10.10.13.15:8081']      labels:        instance: yanns_docker
启动

再次启动 Prometheus :

docker run -d --net=host \-v /home/data/prom/prometheus.yml:/etc/prometheus/prometheus.yml \-v /home/data/prom/alert.rules:/etc/prometheus/alert.rules \--name prometheus-server7 prom/prometheus

效果

添加完成,cadvisor 的管理界面如下,一只可爱的猫头鹰。


Docker

可爱的猫头鹰召唤出来了,让我们再来配置一下相关的图表。第一步还是添加数据源,这个操作我们应该已经轻车熟路。

数据源

提供一张图片供大家参考,具体操作就省略了。

导入模版

数据源配置置好后,再来导入模板,在 Grafana 中有一个非常简单的方式,就是把模板的序号输进去就可以进行导入。如图,本次需要用到的模板是193号。

效果

最后就是监控效果了。如图,配置好模板就会出现本机所有 Docker 的相关信息,请大家自行尝试。


Etcd

我们先来介绍下这个软件 ,Etcd 是CoreOS开发的一个分布式一致性键值存储系统。作为 Kubernetes 的默认数据库为人熟知。

因为 yann 的环境以前部署过k8s,所以已经有etcd组件了,这次我们不从头开始部署 Etcd ,只是简单演示一下 Etcd 的使用。

命令

Etcd 比较特殊的部分就是经常需要带着版本标识和证书来执行命令。否则的话会报错或有相当的功能限制。详情请看下面的命令举例。

   ETCDCTL_API=3 /opt/k8s/bin/etcdctl \   --endpoints=https://10.10.13.15:2379 \   --cacert=/etc/kubernetes/cert/ca.pem \   --cert=/etc/etcd/cert/etcd.pem \   --key=/etc/etcd/cert/etcd-key.pem endpoint health

添加 Job

在了解基本的情况以后,让我们来监控etcd。首先,在 Prometheus 的配置文件上新加一个 job 任务。注意,这次与往常不同,Ca 证书和 Etcd 自身的证书也写入了配置文件之中。

prometheus.yml 追加部分:

- job_name: 'etcd'  scheme: 'https'  tls_config:    cert_file: '/etc/ssl/etcd.pem'    key_file: '/etc/ssl/etcd-key.pem'    ca_file: '/etc/ssl/ca.pem'  static_configs:  - targets: ['10.10.13.15:2379']
启动应用

既然配置中有相关内容,自然也需要提供文件。我们重新撰写了启动命令,把三个证书文件挂载到了容器里面,如下:

  docker run -d --net=host \-v /home/data/prom/prometheus.yml:/etc/prometheus/prometheus.yml \-v /home/data/prom/alert.rules:/etc/prometheus/alert.rules \-v /etc/etcd/cert/etcd.pem:/etc/ssl/etcd.pem \-v /etc/etcd/cert/etcd-key.pem:/etc/ssl/etcd-key.pem \-v /etc/kubernetes/cert/ca.pem:/etc/ssl/ca.pem \--name prometheus-server8 prom/prometheus

Docker 的启动命令是越来越长了。把证书挂到容器里面,确实不是一个很合理的操作。不过我们现在仅仅作为演示,并不作为实际的解决方案。同时,prometheus 有对应开发 Kubernetes 专用的版本 kube-prometheus。里面有完善的相关解决方案,后面有机会可以给大家分享。

挂载好文件后,启动 Docker,同时打开普罗米修斯的控制页面,就看到了新的 Target 挂载成功了。

之后同样是导入模板,这次的模板号是3070,下面两幅截图是Etcd监控的截图,供大家参考。

第 6 部分 延伸

权限

在前面的介绍中, yann 有意回避了一些复杂的问题。比如说每次下载的模板不可能完美匹配,我们需要一些自己定制的图表;或者模板太多了,我们需要精减一些项目;要么干脆需要特定的图表只给特定的人看。林林总总, 现实中都会遇到的, 今天来梳理一下。

组织

Orgs 是一个比较神奇的功能。不同组织之间, 数据源独立, 仪表版也独立,甚至彼此之间不能共享。比较推荐的方法是建立多个组织,按部门或业务线来划分,然后组合起来赋权给用户。

纯语言描述比较抽象, 我们来演示一下,这是该功能的位置。

建立一个组织,yann fans 俱乐部 (害羞)

检查数据源和仪表板

不同的组织,数据源也不一样。如图,Grafana 中之前设定好的数据源全部消失了,同样仪表版也没了,说明组织是隔离性比较强的。这个分隔方式有点类似 Docker 。

api

既然提到组织,我们再了解一下相关的赋权功能 API。这个功能有点像阿里云上的 AccessKey,持 Key 的人可以做权限内的操作,比如说浏览、修改甚至管理整个 Ggrafana。这个API的具体用法,请看下面截图演示。

演示一下

img

生成的 API key

img

除了 key 之外, 截图里面,靠下部分举例的就是操作方式,下面还会有相关讨论。


模板变量

除了 Orgs “组织”,Grafana 还有另一个很特色的功能:模板变量。

说到这里,让我们来思考一个问题:一组应用或多台服务器之间,监控项目的区别到底在哪里呢?

答案是 IP、端口、应用的名称或标签不一样。根据这个特点,我们可以把这些不一样的部分做成变量,然后就可以使用一套模板对应一组同类型应用及服务器的监控。

变量举例:

变量的制作方法如下:需要提供变量名称、获取类型、标签及是是否隐藏。然后在查询框 Query Options ,选择数据源并填写查询语句。通过查询的方式从数据源里取出一系列值,有必要的话,还可以用正则表达式来进一步获得准确的输出。

这样做出来的变量,就可以在仪表板上使用了。需要注意的是 Grafana 是一个前端项目,变量操作需要建立在已有数据的基础上,如果数据源 Prometheus 里面没有相关数据相匹配的记录,生成再多变量也是无可奈何的。


文件格式

最后,我们来了解一下 Json 的数据结构。如图所示,图表及仪表板都可以导出为 Json 格式。也就是说我们之前玩的不亦乐乎的导入功能,其实就是厂家或第三方做好并导出来的仪表板的 Json格式。

对比导出的 Json 文件,就会发现大部分内容都是相同的,替换 认证字段、data和仪表板名称就可以生成对应组织的仪表板。

基于这个特点,我同事有了一个想法:“说我们去写一些前端页面,然后让其他部门同事使用不同 API 发起 POST 的请求,然后再把拼接好的命令及 Json 文本打进去,是否就可以做成自定义提交,按个人需求自助生成图表呢?这样运维同事就解放了。

然后把这个需求和前端同事一说,人家说「你 Grafana 就是个前端项目,你用另写一套前端去修改一个前端的提交文件,不觉得很二么? 」 ,无言以对。

以上为自产小段子,不必当真。这个话题涉及到了HTTP网页的 POST 提交过程,有兴趣的同学可以尝试一下。不一定要写代码,使用一些测试工具,比如 POSTMAN 也可以做到类似的效果,这里就不给出事例了。


今天是总集篇,只是把之前笔记回顾一下。居然有这么多细节,再一次感慨,分享东西出来,对自己提升真的挺大的。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP