TOC
前提
- Docker
前言
现在 Docker Swarm 已经彻底输给了 K8S,但是现在 K8S 依然很复杂,上手难度较 Docker Swarm 高,如果是小规模团队且需要容器编排的话,使用 Docker Swarm 还是适合的。
目前 Docker Swarm 有一个问题一直没有解决,如果业务需要知道用户的请求 IP,则 Docker Swarm 满足不了要求。目前部署在 Docker Swarm 内的服务,无法获取到用户的请求 IP。
具体可以看看这个 ISSUE->Unable to retrieve user’s IP address in docker swarm mode
整体思路
思路整体来说是使用 Influxdb+Grafana+cadvisor,其中cadvisor
负责数据的收集,每一台节点都部署一个 cadvisor 服务,Influxdb 负责数据的存储, Grafana 负责数据的可视化。
演示环境
主机 | IP |
---|---|
master(manager) | 192.168.1.60 |
node1(worker) | 192.168.1.61 |
node2(worker) | 192.168.1.62 |
我这里是将 master 节点当作监控数据存储以及可视化服务的节点作为演示,一般是拿一个 worker 节点做这样的工作。
初始化Docker Swarm
在 master 机器上初始化集群,运行
docker swarm init --advertise-addr {MASTER-IP}
[root@master ~]# docker swarm init --advertise-addr 192.168.1.60
Swarm initialized: current node (138n5rwjz83y8goyzepp1cdo7) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-67je7chylnpyt0s4k1ee63rhxgh0qijiah9gadvcr7i6uab909-535nf6qu6v7b8dscc0plghr9j 192.168.1.60:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions
在node节点运行提示的命令加入到集群中
docker swarm join --token SWMTKN-1-67je7chylnpyt0s4k1ee63rhxgh0qijiah9gadvcr7i6uab909-535nf6qu6v7b8dscc0plghr9j 192.168.1.60:2377
manager 节点初始化集群后,都会有这样一个提示,这个的命令只是给个示例,实际命令需要根据初始化集群后的真实情况来运行。
[root@node1 ~]# docker swarm join --token SWMTKN-1-67je7chylnpyt0s4k1ee63rhxgh0qijiah9gadvcr7i6uab909-535nf6qu6v7b8dscc0plghr9j 192.168.1.60:2377
This node joined a swarm as a worker.
[root@node2 ~]# docker swarm join --token SWMTKN-1-67je7chylnpyt0s4k1ee63rhxgh0qijiah9gadvcr7i6uab909-535nf6qu6v7b8dscc0plghr9j 192.168.1.60:2377
This node joined a swarm as a worker.
在master机器上查看当前的node节点
docker node ls
[root@master ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
138n5rwjz83y8goyzepp1cdo7 * master Ready Active Leader 18.09.8
q03by75rqur63lx36cmordf11 node1 Ready Active 18.09.8
6shdf5ej4b5u7x877bg9nyjk3 node2 Ready Active
到目前为止集群已经搭建完成了,接下来开始部署服务
在Docker Swarm部署监控服务
docker stack deploy -c docker-compose-monitor.yml monitor
[root@master ~]# docker stack deploy -c docker-compose-monitor.yml monitor
Creating network monitor_default
Creating service monitor_influx
Creating service monitor_grafana
Creating service monitor_cadvisor
docker-compose-monitor.yml
文件内容
version: '3'
services:
influx:
image: influxdb
volumes:
- influx:/var/lib/influxdb
deploy:
replicas: 1
placement:
constraints:
- node.role == manager
grafana:
image: grafana/grafana
ports:
- 0.0.0.0:80:3000
volumes:
- grafana:/var/lib/grafana
depends_on:
- influx
deploy:
replicas: 1
placement:
constraints:
- node.role == manager
cadvisor:
image: google/cadvisor
hostname: '{{.Node.Hostname}}'
command: -logtostderr -docker_only -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influx:8086
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
depends_on:
- influx
deploy:
mode: global
volumes:
influx:
driver: local
grafana:
driver: local
查看服务的部署情况
[root@master ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
qth4tssf2sm1 monitor_cadvisor global 3/3 google/cadvisor:latest
p2vbxe7ic175 monitor_grafana replicated 1/1 grafana/grafana:latest *:80->3000/tcp
von1rpeqq7vj monitor_influx replicated 1/1 influxdb:latest
到目前为止,服务已经部署完成了,三台机器各自部署一个cadvisor
,在 master 节点部署了grafana
和influxdb
为cadvisor配置influxdb数据库
查看一下 master 机器上的服务
[root@master ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
55965fdf13a3 grafana/grafana:latest "/run.sh" 3 hours ago Up 3 hours 3000/tcp monitor_grafana.1.l9uh0ov7ltk7q2yollmk4x1v9
0bf544c7d81c google/cadvisor:latest "/usr/bin/cadvisor -…" 3 hours ago Up 3 hours 8080/tcp monitor_cadvisor.138n5rwjz83y8goyzepp1cdo7.l53vufoivp0oe8tyy14nh0jof
3ce050f0483e influxdb:latest "/entrypoint.sh infl…" 3 hours ago Up 3 hours 8086/tcp monitor_influx.1.vraeh8ektium1j1jd27qvq1au
[root@master ~]#
可以看到是符合预期的,接下来进一步查看cadvisor
容器的日志
[root@master ~]# docker logs -f 0bf544c7d81c
W0209 09:32:15.730951 1 manager.go:349] Could not configure a source for OOM detection, disabling OOM events: open /dev/kmsg: no such file or directory
E0209 09:33:15.783705 1 memory.go:94] failed to write stats to influxDb - {"error":"database not found: \"cadvisor\""}
E0209 09:34:15.818661 1 memory.go:94] failed to write stats to influxDb - {"error":"database not found: \"cadvisor\""}
E0209 09:35:16.009312 1 memory.go:94] failed to write stats to influxDb - {"error":"database not found: \"cadvisor\""}
E0209 09:36:16.027113 1 memory.go:94] failed to write stats to influxDb - {"error":"database not found: \"cadvisor\""}
E0209 09:37:16.107051 1 memory.go:94] failed to write stats to influxDb - {"error":"database not found: \"cadvisor\""}
E0209 09:38:16.215684 1 memory.go:94] failed to write stats to influxDb - {"error":"database not found: \"cadvisor\""}
E0209 09:39:16.305772 1 memory.go:94] failed to write stats to influxDb - {"error":"database not found: \"cadvisor\""}
可以看到现在一直是在报错的,因为目前的influx
容器中没有cadvisor
这样的数据库存在,接下来我们进入influx
容器并创建对应的cadvisor
数据库,在 master 机器上执行以下命令即可。
docker exec `docker ps | grep -i influx | awk '{print $1}'` influx -execute 'CREATE DATABASE cadvisor'
当然,也可以分步骤执行
- 找到 influxdb 的容器
- 进入到 influxdb 容器内并登陆 influx
- 创建数据库
这里就不演示了。
配置grafana
到目前为止,数据已经在收集了,并且数据存储在influxdb
中。接下来配置 grafana 将数据进行可视化。
因为 docker-compose-monitor.yml 文件内给 grafna 配置的端口是80,这里直接访问master机器的IP就可以访问到 grafana,在浏览器打开192.168.1.60
.
grafana
默认的帐号是admin
默认的密码是admin
首次登陆后会提示修改密码,新密码继续设置为admin
也没关系。
登陆成功后开始设置数据源
配置数据源
- 打开左边菜单栏进入数据源配置页面
- 添加新的数据源,我这里是添加过了,所以会有一个influxdb的数据源显示。
- 选择influxdb类型的数据源
- 填写 influxdb 对应的信息,Name 填写
influx
,因为待会要用到一个grafana模版,所以这里叫 influx 名字,URL 填http://influx:8086
,这个也不是固定的,本次docker-compose-monitor.yml
文件内influxdb
的容器名叫influx
,端口开放出来的为8086(默认
),所以这里填influx:8086
到目前为止,数据源相关的内容已经配置完成了。
配置grafana视图模版
这里使用模版只是为了演示效果,如果模版的样式不太满意,可以研究下 grafana 自行调整。
- 首先打开 grafana 的 dashboard 市场下载模版https://grafana.com/grafana/dashboards/4637/reviews
- 选中 dashboard 菜单,选中 import 进行导入
- 打开 dashboard 就已经可以看到 dashboard 模版的内容了.
总结
一个基本的 Docker Swarm 集群监控就搭建完成了
还有更高级的也许后面会更新一篇 blog 进行讲述.例如当某个值(CPU)达到某个阀值,发送钉钉或者slack消息进行告警
只要明白思路,实操基本上没有什么问题。
微信公众号
扫描下面的二维码关注我们的微信公众号,第一时间查看最新内容。同时也可以关注我的Github,看看我都在了解什么技术,在页面底部可以找到我的Github。