你是否有一群Server需要管理?
你是否需要一個漂亮又客製化、彈性高的系統Web Monitor?
你是否想要在幾秒鐘內就建立好包含上述所有優點的監控系統?
這邊介紹如何讓你在幾秒鐘內快速建立一個穩定、快速、高彈性的Server Cluster Monitor。
架設Grafana、Prometheus、Node-Exporter在Docker Swarm Cluster。
整個架構會是透過Node-Export收集各個Node的系統資訊,並儲存到Prometheus,並用Grafana來監控。
Step1. 確認你的Docker Swarm Cluster
這邊的範例環境為3個node的docker swarm cluster,名稱分別為demo1、demo2、demo3。
並且已經label好demo1:node=one,demo2:node=two,demo3:node=three。
這個label名稱很好笑,不過是範例就不要太在意,謝謝。以下在貼一些常用的swarm command sample。
# Check Cluster Status $ docker node ls # How to label node $ docker node update --label-add node=one demo1 # Show each node labels $ docker node ls -q | xargs docker node inspect -f '{{ .ID }} [{{ .Description.Hostname }}]: {{ .Spec.Labels }}'
下圖為我的swarm cluster sample環境。

注意的是我有建立一個Registry在demo1,如果需要了解如何建立Docker Registry的話可以參考官方Document。https://docs.docker.com/registry/
Step2. Node-Exporter Settings
Node-Exporter是用Golang編寫的host系統資訊採集系統。它的docker-compose設定如下:
node-exporter: image: prom/node-exporter:v1.0.1 ports: - target: 9100 published: 9100 protocol: tcp mode: host volumes: - /etc/hostname:/etc/hostname:ro - /etc/hosts:/etc/hosts:ro - /proc:/host/proc:ro - /sys:/host/sys:ro - /:/rootfs:ro command: - '--path.procfs=/host/proc' - '--path.sysfs=/host/sys' - '--path.rootfs=/host' - '--collector.filesystem.ignored-mount-points="^(/rootfs|/host|)/(sys|proc|dev|host|etc)($$|/)"' - '--collector.filesystem.ignored-fs-types="^(sys|proc|auto|cgroup|devpts|ns|au|fuse\.lxc|mqueue)(fs|)$$"' logging: driver: "json-file" options: max-size: "10m" deploy: mode: global placement: constraints: [node.labels.node-exporter == true]
這邊有幾個地方需要注意:
- ports:我把node-exporter的port開在host上,這樣就不會走到swarm的load balance,而導致Prometheus抓取node系統資訊時都抓到特定幾台,而分不清哪個IP是哪台node。
- volumes:請把host的資訊mount到container裡,這樣才不會抓到的是container的資訊。
- command:host的資訊mount到container的/host資料夾,需要在跟node-exporter說要監控的資訊是在/host資料夾裡。
如何取得node-exporter整理的系統資訊呢?可以透過這段URL取得,預設是port 9100。

Step3. Prometheus Settings
Prometheus收集與儲存時間序列資料,並提供PromQL查詢語言支援。各個node收集的log資料會儲存在這邊。
如果需要了解Prometheus架構的話請Google一下,這邊不多作介紹。
docker-compose設定如下:
prometheus: build: context: . dockerfile: Dockerfile-prometheus image: demo1:5000/rmq-prometheus ports: - 9090:9090 volumes: - prometheus-volume:/prometheus logging: driver: "json-file" options: max-size: "10m" networks: - swnet deploy: mode: global placement: constraints: [node.labels.node == one]
需要注意的地方為build的部分,為了要跟Prometheus說要去哪裡收集log資訊,故會把這部分的內容寫在Dockerfile內放進去。
prometheus.yml
global: scrape_interval: 5s external_labels: monitor: 'monitor' scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] - job_name: 'node_resources' scrape_interval: 10s static_configs: - targets: ['demo1:9100', 'demo2:9100', 'demo3:9100']
在job_name為node_resources的部分,targets即為要去哪幾台的Node-Exporter拉取資訊。
scrape_interval為幾秒鐘主動拉一次,這邊設定10秒。
Dockerfile-prometheus
FROM prom/prometheus:v2.19.2 COPY configs/prometheus.yml /etc/prometheus/prometheus.yml
Step4. Grafana Settings
docker-compose
grafana: image: grafana/grafana:7.1.3 environment: - GF_SECURITY_ADMIN_PASSWORD=pass volumes: - $HOME/data/grafana:/var/lib/grafana ports: - 3000:3000 logging: driver: "json-file" options: max-size: "10m" networks: - swnet deploy: mode: global placement: constraints: [node.labels.node == one]
需要注意的是:
- GF_SECURITY_ADMIN_PASSWORD設定預設密碼是『pass』,預設帳號是『admin』
- volumes:我把Grafana的資料mount出來到host的$HOME/data/grafana資料夾,後續要備份只要備份這個資料夾即可把Grafana Web UI裡的設定檔帶走。
Step5. Clone Sample Git Repository
我已經先把整個smaple放上Git了,請clone下來切到node_exporter__promethues__grafana資料夾,便可直接修改運行。
# clone $ git clone https://github.com/mmmaaaxxx77/docker-swarm-cluster-application-base.git # switch to node_exporter__promethues__grafana folder $ cd docker-swarm-cluster-application-base/node_exporter__promethues__grafana
請各位依照前幾個步驟的介紹,針對不同的運行環境做設定檔的修改。
Step6. 部署服務
如何啟動整個監控系統呢?非常簡單,因為我已經把整個架構寫在docker-compose.yml裡了,直接deploy即可,請執行以下命令:
# Build images $ docker-compose -f docker-compose.yml build # Push Images $ docker-compose -f docker-compose.yml push # Deploy $ docker stack deploy -c docker-compose.yml cluster # Check Status $ docker service ls
這邊需注意的是我把整個服務命名為cluster,所以docker service會有前綴字cluster,如下圖。

Step7. 檢查各服務的UI
Prometheus UI

Grafana UI
如果照著我的docker-compose.yml設定檔的話,帳號密碼分別是admin/pass。

Step8. 建立Grafana監控Dashboard
這邊不介紹Grafana怎麼操作,只介紹如何快速建立一個好用的監控Dashboard,有幾個步驟:
1. 建立Data Source
在Configuration>Data Sources,點選Add data source,選擇Prometheus。
並在URL填上Prometheus Server的URL,並Save即可。

2. 建立Dashboard
我會直接引用別人分享的Dashboard設定檔,請參考https://grafana.com/grafana/dashboards/8919。
在Dashboards>Manage點選Import,並輸入分享代號『8919』,選擇剛剛設定的Prometheus data source,再點選Import即可。


Step9. 享用你的Dashboard
剛剛建立好的dashboard會出現在你Grafana的dashboards裡,到這裡就完成整個系統的建立了。
