部署docker swarm集羣監控

前提

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[1]

整體思路

思路整體來說是使用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:2377This node joined a swarm as a worker.
[root@node2 ~]#  docker swarm join --token SWMTKN-1-67je7chylnpyt0s4k1ee63rhxgh0qijiah9gadvcr7i6uab909-535nf6qu6v7b8dscc0plghr9j 192.168.1.60:2377This node joined a swarm as a worker.

在master機器上查看當前的node節點

docker node ls

[root@master ~]# docker node lsID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION138n5rwjz83y8goyzepp1cdo7 *   master              Ready               Active              Leader              18.09.8q03by75rqur63lx36cmordf11     node1               Ready               Active                                  18.09.86shdf5ej4b5u7x877bg9nyjk3     node2               Ready               Active

到目前爲止集羣已經搭建完成了,接下來開始部署服務

在Docker Swarm部署監控服務

docker stack deploy -c docker-compose-monitor.yml monitor

[root@master ~]# docker stack deploy -c docker-compose-monitor.yml monitorCreating network monitor_defaultCreating service monitor_influxCreating service monitor_grafanaCreating 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[2]

查看服務的部署情況

docker service ls

[root@master ~]# docker service lsID                  NAME                MODE                REPLICAS            IMAGE                    PORTSqth4tssf2sm1        monitor_cadvisor    global              3/3                 google/cadvisor:latest   p2vbxe7ic175        monitor_grafana     replicated          1/1                 grafana/grafana:latest   *:80->3000/tcpvon1rpeqq7vj        monitor_influx      replicated          1/1                 influxdb:latest

到目前爲止,服務已經部署完成了,三臺機器各自部署一個cadvisor,在master節點部署了grafanainfluxdb

爲cadvisor配置influxdb數據庫

查看一下master機器上的服務
docker ps

[root@master ~]# docker psCONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS               NAMES55965fdf13a3        grafana/grafana:latest   "/run.sh"                3 hours ago         Up 3 hours          3000/tcp            monitor_grafana.1.l9uh0ov7ltk7q2yollmk4x1v90bf544c7d81c        google/cadvisor:latest   "/usr/bin/cadvisor -…"   3 hours ago         Up 3 hours          8080/tcp            monitor_cadvisor.138n5rwjz83y8goyzepp1cdo7.l53vufoivp0oe8tyy14nh0jof3ce050f0483e        influxdb:latest          "/entrypoint.sh infl…"   3 hours ago         Up 3 hours          8086/tcp            monitor_influx.1.vraeh8ektium1j1jd27qvq1au[root@master ~]#

可以看到是符合預期的,接下來進一步查看cadvisor容器的日誌
docker logs -f 0bf544c7d81c

[root@master ~]# docker logs -f 0bf544c7d81cW0209 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 directoryE0209 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容器內並登陸influx3.創建數據庫

這裏就不演示了。

配置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消息進行告警

只要明白思路,實操基本上沒有什麼問題。


本文分享自微信公衆號 - 四顆咖啡豆(gh_71aedc0a994c)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章