关于 Docker 容器的监控,google cAdvisor 是个很好的工具,但是它默认只显示实时数据,不储存历史数据。为了存储和显示历史数据、自定义展示图,可以把将cAdvisor与InfluxDB、Grafana 集成起来,国外的专家 Brian Christner 写了一篇文章”How to setup Docker Monitoring“,描述了部署方法。
Brian 的方法是手动运行 docker run 命令进行部署,为了能在 Mesos Marathon 平台上自动部署,我对他的方法进行了一些修改,下面我的部署过程。
注:
读者需要提前了解 mesos、marathon、InfluxDB 特别是 Grafana 的基本操作。
1. 设置共享存储
为了实现 InfluxDB 数据库和 Grafana 配置的持久化存储,使他们重新部署后不会丢失历史数据,我启用了 nfs4作为共享存储,把 InfluxDB 容器里的 /data 目录、Grafana 容器的 /var/lib/grafana 目录映射到 nfs4共享存储上。
1.1 nfs4 server:
/var/nfsshare 172.31.17.0/24(rw,sync,no_root_squash,no_all_squash)
1.2 mesos slaves
172.31.17.74:/var/nfsshare/ /var/nfsshare/ nfs defaults 0 0
2. 拉取镜像文件
在每个mesos slave上拉取下述几个images:
tutum/influxdb
google/cadvisor
grafana/grafana
3. 设置DNS或hosts
172.31.17.34 influxdb.gkkxd.com
172.31.17.34 cadvisor-1.gkkxd.com
172.31.17.34 cadvisor-2.gkkxd.com
172.31.17.34 cadvisor-3.gkkxd.com
172.31.17.34 grafana.gkkxd.com
4. 部署 InfluxDB
- InfluxDB只需要一个实例;
- UI 通过 marathon-lb 的虚拟主机发布;
- 数据端口 8086 通过 servicePort 发布到 marathon-lb所在的slaves;
- servicePort需要设置为固定值,比如:28086,以便于cAdvisor和Grafana连接;
- 数据目录 /data 映射到 nfs4共享目录;
{ "id": "influxdb", "instances": 1, "cpus": 0.5, "mem": 128, "constraints": [["hostname", "LIKE", "slave[1-3]"]], "labels": { "HAPROXY_GROUP":"external", "HAPROXY_0_VHOST":"influxdb.gkkxd.com" }, "container": { "type": "DOCKER", "docker": { "image": "172.31.17.36:5000/influxdb:latest", "network": "BRIDGE", "portMappings": [ { "containerPort": 8083, "hostPort": 0, "servicePort": 0, "protocol": "tcp" }, { "containerPort": 8086, "hostPort": 0, "servicePort": 28086, "protocol": "tcp" } ] }, "volumes": [ { "containerPath": "/etc/localtime", "hostPath": "/etc/localtime", "mode": "RO" }, { "containerPath": "/data", "hostPath": "/var/nfsshare/influxdb", "mode": "RW" } ] } }
设置marathon-lb所在主机的防火墙:
{ "id": "influxdb-fw", "instances": 2, "cpus": 0.2, "mem": 64, "cmd": "firewall-cmd --add-port=28086/tcp && sleep 3 && curl -X DELETE master1:8080/v2/apps/influxdb-fw", "constraints": [["hostname", "LIKE", "slave[4-5]"]] }
5. 创建监控数据库
打开 http://influxdb.gkkxd.com ,设置 Host 和 Port 分别为 influxdb.gkkxd.com 和 28086:
为每个mesos slave创建一个单独的数据库,分别为:cadvisor_1, cadvisor_2, cadvisor_3 ...
6. 部署 cAdvisor
- 每个mesos slave都要部署一个实例;
- UI 通过marathon-lb的虚拟主机发布;
- 设置 storage_drive 为 influxdb;
{ "id": "cadvisor-6", "instances": 1, "cpus": 0.5, "mem": 128, "constraints": [["hostname", "LIKE", "slave[6]"]], "labels": { "HAPROXY_GROUP":"external", "HAPROXY_0_VHOST":"cadvisor-6.gkkxd.com" }, "container": { "type": "DOCKER", "docker": { "image": "172.31.17.36:5000/cadvisor:latest", "network": "BRIDGE", "portMappings": [ { "containerPort": 8080, "hostPort": 0, "servicePort": 0, "protocol": "tcp" } ] }, "volumes": [ { "containerPath": "/etc/localtime", "hostPath": "/etc/localtime", "mode": "RO" }, { "containerPath": "/rootfs", "hostPath": "/", "mode": "RO" }, { "containerPath": "/var/run", "hostPath": "/var/run", "mode": "RW" }, { "containerPath": "/sys", "hostPath": "/sys", "mode": "RO" }, { "containerPath": "/var/lib/docker", "hostPath": "/var/lib/docker", "mode": "RO" }, { "containerPath": "/cgroup", "hostPath": "/cgroup", "mode": "RO" } ] }, "args": [ "-storage_driver", "influxdb", "-storage_driver_host", "cadvisor.gkkxd.com:28086", "-storage_driver_db", "cadvisor_6" ] }
查看cAdvisor UI:
http://cadvisor-6.gkkxd.com
7. 部署 Grafana
- 只需要部署一个实例;
- UI 通过 marathon-lb 虚拟主机发布;
- 数据目录 /var/lib/grafana 映射到 nfs4 共享存储,以便于持久化存储;
{ "id": "grafana", "instances": 1, "cpus": 0.5, "mem": 128, "constraints": [["hostname", "LIKE", "slave[4-5]"]], "labels": { "HAPROXY_GROUP":"external", "HAPROXY_0_VHOST":"grafana.gkkxd.com" }, "container": { "type": "DOCKER", "docker": { "image": "172.31.17.36:5000/grafana:latest", "network": "BRIDGE", "portMappings": [ { "containerPort": 3000, "hostPort": 0, "servicePort": 0, "protocol": "tcp" } ] }, "volumes": [ { "containerPath": "/etc/localtime", "hostPath": "/etc/localtime", "mode": "RO" }, { "containerPath": "/var/lib/grafana", "hostPath": "/var/nfsshare/grafana", "mode": "RW" } ] } }
8. 创建数据分析图
打开 Grafana UI:
http://grafana.gkkxd.com/
8.1 设置数据源:
- 类型:InfluxDB
- URL:http://influxdb.gkkxd.com:28086
- Access:direct
- Database:选择一个slave的数据库,如:cadvisor_1
创建graph:
效果图:
9 其他问题
9.1 怎样设置报警
可以将Prometheus集成进来,后续我将进行相关测试;
9.2 怎样在mesos上获取docker容器名
我们在 Grafana 上创建针对app实例的监控图的时候,往往需要通过 "where container_name=容器名" 的条件筛选相关的数据,但是mesos marathon部署的docker 容器名称是以mesos-uuid形式命名的(docker ps 查看),没有明显的特征可以识别。
下面的方法可以查看一个app ID对应的docker 容器名称:
打开 mesos 管理页面:
http://master1:5050
在mesos task里,点击要查找的app ID后面的 Sandbox,
点击 stdout 即可看到这个app ID对应的docker 容器名称: