Prometheus 通过 cAdvisor 监控 Docker 容器

Prometheus 要采集 Docker 容器的指标,靠的是在每台宿主机上跑一个 cAdvisor:它把容器的 CPU、内存、IO 等数据以 /metrics 端点暴露出来,Prometheus 加个 job 抓取,Grafana 再贴个面板就齐了。完整流程如下。

部署 cAdvisor 采集端

在每台被监控的 Docker 节点上用容器方式启动 cAdvisor,挂载根文件系统、docker 目录等只读路径,端口 30080 映射到容器 8080:

docker run 
  --volume=/:/rootfs:ro 
  --volume=/var/run:/var/run:rw 
  --volume=/sys:/sys:ro 
  --volume=/var/lib/docker/:/var/lib/docker:ro 
  --publish=30080:8080 
  --detach=true 
  --name=cadvisor 
  google/cadvisor:latest

两个参数说明:–publish 是端口映射,等价于 -p;–detach=true 后台运行,等价于 -d。确认容器起来了:

~]# docker container ps | grep cadvisor

浏览器访问 http://IP:30080 就是本机容器的运行状态页:

prom+docker01

点页面里的 Docker Containers 能看运行中的容器列表,点进单个容器可看主机与容器的硬件资源使用率:

prom+docker02
prom+docker03

指标数据直接访问 http://IP:30080/metrics 检查:

prom+docker04

Prometheus 添加抓取任务

在 prometheus.yml 里加一个 Docker Container job,targets 填各节点的 IP:30080,并用 relabel_configs 从地址里提取主机名和节点 IP 打成 hostname、nodeip 标签:

~]# vim /usr/local/prometheus/prometheus.yml
  ##Docker容器监控
  - job_name: "Docker Container"
    static_configs:
      - targets: ['192.168.66.102:30080','192.168.66.99:30080']
    relabel_configs:
      - source_labels: [__address__]
        regex: '(.*):30080'
        target_label: 'hostname'
        replacement: '$1'
      - source_labels: [__address__]
        regex: '(.*):30080'
        target_label: 'nodeip'
        replacement: '$1'

改完先校验语法:

~]# promtool check config /usr/local/prometheus/prometheus.yml

再热重载配置:

~]# curl -X POST http://127.0.0.1:9090/-/reload
重要

去 Targets 页确认两个节点状态为 UP:

prom+docker05

导入 Grafana 面板

可视化直接套现成的:Grafana 官网搜 dashboard 11600(https://grafana.com/grafana/dashboards/11600),下载 JSON 导入,数据源指向 Prometheus:

prom+docker06

配置容器告警

告警规则单独写一个文件 /usr/local/prometheus/rules/alerts_docker.yml,容器场景常盯的是重启次数和 CPU/内存占用:

~]# vim /usr/local/prometheus/rules/alerts_docker.yml

同样过一遍语法检查再 reload:

~]# promtool check config /usr/local/prometheus/prometheus.yml
~]# curl -X POST http://127.0.0.1:9090/-/reload

最后在 Prometheus 的 Alerts 页确认规则已加载:

prom+docker07

踩坑备忘

三件事最容易出问题:一是 targets 里的 30080 端口没对防火墙放行,表现为 target 一直 DOWN;二是镜像 google/cadvisor:latest 拉不动时换镜像源或固定版本;三是 relabel 的正则 ‘(.*):30080’ 只匹配这个端口,改端口映射后两处规则都要同步改。

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容