部署docker swarm集群监控

Posted by 梁远鹏 on 2020-02-09 | 阅读 |,阅读约 4 分钟

TOC

前提

  1. 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 负责数据的可视化。

https://res.cloudinary.com/lyp/image/upload/v1581387851/hugo/blog.github.io/docker/docker-swarm-monitor-process.png

演示环境

主机 | IP -|- master(manager) | 192.168.1.60 node1(worker) | 192.168.1.61 node2(worker) | 192.168.1.62

https://res.cloudinary.com/lyp/image/upload/v1581387850/hugo/blog.github.io/docker/docker-swarm-monitor-node.png

我这里是将 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

下载docker-compose-monitor.yml

查看服务的部署情况

[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 节点部署了grafanainfluxdb

为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'

当然,也可以分步骤执行 1. 找到 influxdb 的容器 2. 进入到 influxdb 容器内并登陆 influx 3. 创建数据库

这里就不演示了。

配置grafana

到目前为止,数据已经在收集了,并且数据存储在influxdb中。接下来配置 grafana 将数据进行可视化。

因为 docker-compose-monitor.yml 文件内给 grafna 配置的端口是80,这里直接访问master机器的IP就可以访问到 grafana,在浏览器打开192.168.1.60.
grafana
默认的帐号是admin
默认的密码是admin
首次登陆后会提示修改密码,新密码继续设置为admin也没关系。

登陆成功后开始设置数据源

配置数据源

  1. 打开左边菜单栏进入数据源配置页面
  2. 添加新的数据源,我这里是添加过了,所以会有一个influxdb的数据源显示。

  3. 选择influxdb类型的数据源

  4. 填写 influxdb 对应的信息,Name 填写influx,因为待会要用到一个grafana模版,所以这里叫 influx 名字,URL 填http://influx:8086,这个也不是固定的,本次docker-compose-monitor.yml文件内influxdb的容器名叫influx,端口开放出来的为8086(默认),所以这里填influx:8086

到目前为止,数据源相关的内容已经配置完成了。

配置grafana视图模版

这里使用模版只是为了演示效果,如果模版的样式不太满意,可以研究下 grafana 自行调整。

  1. 首先打开 grafana 的 dashboard 市场下载模版https://grafana.com/grafana/dashboards/4637/reviews

  2. 选中 dashboard 菜单,选中 import 进行导入
  3. 打开 dashboard 就已经可以看到 dashboard 模版的内容了.

总结

一个基本的 Docker Swarm 集群监控就搭建完成了

还有更高级的也许后面会更新一篇 blog 进行讲述.例如当某个值(CPU)达到某个阀值,发送钉钉或者slack消息进行告警

只要明白思路,实操基本上没有什么问题。

微信公众号

扫描下面的二维码关注我们的微信公众号,第一时间查看最新内容。同时也可以关注我的Github,看看我都在了解什么技术,在页面底部可以找到我的Github。

wechat-qrcode