prometheus是一款短期监控软件,他在云计算领域有很高的应用,与容器技术融合度非常高,在此我尝试使用prometheus监控docker容器,并自动发现新容器。
安装prometheus
创建配置文件
非容器版本的prometheus非常好部署,解压完就可以用了,但是docker中的就比较繁琐,我们需要提前准备要映射的配置文件。
在任意路径下创建prometheus.yml
vim prometheus.yml
文件内容如下:
(这个文件内容是我从容器中复制出来的,没有多余的东西,但保证不报错)
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# 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'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['localhost:9090']
运行容器
docker run -itd -p 9090:9090 \
-v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \
--name prometheus \
prom/prometheus
参数 | 释义 |
---|---|
-i | 以交互模式运行容器,通常与 -t 同时使用 |
-t | 为容器重新分配一个伪输入终端,通常与 -i 同时使用 |
-d | 后台运行容器并返回容器ID,没有此参数终端会被容器占用 |
-p | 映射端口,冒号前是宿主机,冒号后是容器 |
-v | 映射路径/文件,映射文件的话宿主机中必须存在这个文件 |
--name | 指定容器名称 |
如果出现任何容器闪退的现象通过查看容器日志定位错误
docker logs --tail=10 prometheus(容器名)
#10行不够可以多来点
然后查看镜像是否在运行,在浏览器上输入IP:9090,能显示出页面表示容器正常运行。
安装cAdvisor
prometheus无法独自收集容器信息,所以需要cAdvisor,同时他还可以完成自动发现容器的任务。
docker run -itd --name cadvisor -p 9001:8080 \
-v /:/rootfs:ro \
-v /var/run:/var/run:rw \
-v /sys:/sys:ro \
-v /var/lib/docker/:/var/lib/docker:ro \
-v /dev/disk/:/dev/disk:ro \
google/cadvisor
我宿主机上的8080端口有别的用处,所以映射了9001,另外这里的路径映射每一行具体什么作用我不太清楚,希望有大佬可以指点指点。
安装完之后浏览器输入IP:9001,如果能看到下面这个猫头鹰则表示成功运行。
安装node-exporter
cAdvisor采集到的信息需要让node-exporter采集到,然后才能被prometheus获取到,所以需要在docker中安装node-exporter。
docker run -d -p 9100:9100 --name node-exporter \
-v "/proc:/host/proc" \
-v "/sys:/host/sys" \
-v "/:/rootfs" \
-v "/etc/localtime:/etc/localtime" \
prom/node-exporter \
--path.procfs /host/proc \
--path.sysfs /host/sys \
--collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"
同样这里的路径映射我也不太明白,需要注意的一点,--path.procfs、--path.sysfs和--collector.filesystem.ignored-mount-points这三个参数必须放在最后面,否则docker会报错。
然后通过浏览器输入IP:9100/metrics来访问,如果能看到各项指标的参数表示启动成功,像下图一样。
修改配置文件
现在node-exporter已经可以采集到容器信息了,就差prometheus去node-exporter上拉取数据了,所以我们需要在prometheus的配置文件中配置需要拉取数据的node-exporter。
将scrape_configs部分的内容修改一下,注意targets后面的IP和端口号。
scrape_configs:
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['localhost:9090','cadvisor宿主机IP:9001','node-exporter宿主机IP:9100']
这里要注意一点,如果cadviosr、node-exporter和prometheus在同一台宿主机上,那么cadvisor和noed-exporter的IP不可以写localhost,一定要写IP,具体机制不太清楚。推测可能是因为prometheus就在容器里,如果填localhost的话相当于访问容器自身,所以自然无法获取到数据。
最后删除prometheus容器重建来重载配置文件。
网上有说通过curl -XPOST http://ID:9090/-/reload来重载配置,这需要在启动容器的时候各位添加参数并指定yml文件,但我测试的时候没好使……有时间再研究研究。
安装grafana
数据已经收集完成,现在只差将需要的数据展示出来,毕竟不能用promQL语言一个一个去查询。
同样运行docker命令
docker run -itd --name grafana -p 3000:3000 grafana/grafana
我映射了3000端口,然后就可以用浏览器访问这个端口,进入到grafana的界面。
初始用户名和密码都是admin,初次登陆系统需要更改密码。
登录成功后就可以看到grafana页面,首先需要配置数据源,我忘记有没有引导了,这里我直接新建数据源。
它作为一个可视化的工具非常强悍,展示的仪表版可以随意定制,但好像挺麻烦的样子,我就不去弄了,直接使用别人制作好的仪表板。
点击左侧加号,选择import这是docker仪表板193的展示结果
目前先到这里,之后我再更新alertmanager的安装与配置……不知道要等多久。