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

img

[TOC]html

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

第 1 部分 出发

部署

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

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

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 启动起来。linux

请注意一下配置文件的位置,yann 写的是本身服务器的文件路径,你须要改为本身的。git

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

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

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

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

以上两组命令都来自官网的文档。正则表达式


初始界面

若是一切正常的话,咱们能够来查看到下面的效果,截图的IP地址是yann 服务器上面的,你能够换上本身的来试一下。sql

网址 http://10.10.13.15:9090/graph

img

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

metrics

部署好Node Exporte 后能够看到。

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

img

targets界面

网址 http://10.10.13.15:9090/targets

img

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


避坑

在这个配置中 yann 遇到了两个坑,如今也给你们分享出来,避免其余人也陷入进来。

端口消失

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

--net=host

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

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

img

端口冲突

另一个坑和上一条问题相关,由于在 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 端口存在之后,在浏览器上访问就好。

例如:http://10.10.13.15:3000/


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

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

数据源

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

img

若是是中途接手他人的项目的情况,也不用担忧。yann 保证只拿到账号密码,没人指导的状况下, 你也是能够把数据源配置出来的。

img

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

仪表盘

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

img

很直观,而后

img

(此处感谢小熊)

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

img

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

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


开启图表

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

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

img

Metrics 栏目随便选择一个就能够了。

img

结果演示

img

还有另外两个按钮,是一些设置和告警, 本身看一下就行了。

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

img

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

第 3 部分 数据库

冒烟部署

闲话就此打住,先来操做。昨天的时候,咱们曾经在 grafana 上弄出图表了。那么今天的任务。是产生不少的图表来应付mysql的平常须要。

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

img

就你了。

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

?为何个人图表一直都是异常状态呢?设置数据源的时候,数据库链接测试也经过了,难道是权限不足让咱们看看日志。

img

果真是权限不足,让咱们加权限,还不行?我再加,我用root访问总能够了吧,什么,竟然还不行。

img

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

# 下载 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';

img

这是我很早之前部署 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 网页,已经有新内容出现了。

http://10.10.13.15:9090/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 不一样端口下的进程。

添加完成

img


查询

如今咱们来演示一些数据的查询 :

文件系统可用字节数

node_filesystem_avail_bytes

效果如图:

img

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

经常使用的一些性能指标

下面是一些经常使用的查询语句, 你们能够本身试一下:

# 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 定义检查报警的状况以及告警媒介,例如邮件,钉钉等。

如下是一些配置截图展现:

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

img

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

访问 http://10.10.13.15:9093/#/alerts

img

关掉 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

已经部署完毕

img

配置

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 的管理界面以下,一只可爱的猫头鹰。

img


Docker

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

数据源

提供一张图片供你们参考,具体操做就省略了。

img

导入模版

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

img

效果

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

img


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 挂载成功了。

img

以后一样是导入模板,此次的模板号是3070,下面两幅截图是Etcd监控的截图,供你们参考。

img

img

第 6 部分 延伸

权限

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

组织

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

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

img

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

img

检查数据源和仪表板

img

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

api

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

演示一下

img

生成的 API key

img

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


模板变量

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

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

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

变量举例:

img

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

这样作出来的变量,就能够在仪表板上使用了。须要注意的是 Grafana 是一个前端项目,变量操做须要创建在已有数据的基础上,若是数据源 Prometheus 里面没有相关数据相匹配的记录,生成再多变量也是迫不得已的。


文件格式

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

img

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

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

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

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


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

<center>这最近不方便?</center>
<center>那还能够分享咱们的文章嘛~~</center>


<center><font color=Red face="黑体">网站其余文章</font></center>

<font color=OrangeRed face="黑体">深度科普</font> (CNCF→) 毕业项目 | 生态 | Ansible | Chef | Puppet | VMware | OpenStack | registry | Harbor| Docker | Containerd | RKT | ROOK | Calico | Flannel | Open vSwitch | Kubernetes | Zookeeper | Consul | Etcd | GRPC | thrift | MySQL | Spark | Storm | RocketMQ | kafka| RabbitMQ | Helm | Docker Composer | Packer | Jenkins | Bamboo | (Prometheus→) 构建 | DBA | 系统 | Grafana | Zabbix | Fluentd | ElasticSearch | Logstash | Jaeger | <font color=OrangeRed face="黑体">Go语言</font> (go web)网站 | Request | Response| 模板| 数据存储 | 处理 JSON (go docker)冒烟| 限制资源| <font color=OrangeRed face="黑体">Python</font> 期末总结 | <font color=OrangeRed face="黑体">ELK</font> 任务 | 部署ES | 最小模式 | 集群 | Logstash | 中转 | 输出 | kafka | 消息定制 | 过滤 | geoip | grok | kibana | es head | 使用 | CURD | 指引 <font color=OrangeRed face="黑体">Redis</font> 集群 | 脚本 |迁移 | 加固 | 持久化 | 性能 | 缓存思考 | <font color=OrangeRed face="黑体">Kafka</font> 集群 | 故障排查 | 命令行 | 术语 | 集群原理 | <font color=OrangeRed face="黑体">近期文章</font> 寂寞的时候, Siri在帮我数羊 - 100期记念

本文由博客一文多发平台 OpenWrite 发布!
发布在平台的文章, 和原文存在格式差别, 阅读不便请见谅
最新内容欢迎关注公众号:
https://image-static.segmentfault.com/335/894/3358949283-5dc9041836609_articlex
相关文章
相关标签/搜索