快速建立Server群集系統監控平台(Deploy Grafana、Prometheus、Node-Exporter on Docker Swarm Cluster, Cluster Monitor)

介紹如何讓你在幾秒鐘內快速建立一個穩定、快速、高彈性的Server Cluster Monitor。

0
198

你是否有一群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。

http://node-ip:9100/metrics

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資料夾,便可直接修改運行。

Git:https://github.com/mmmaaaxxx77/docker-swarm-cluster-application-base/tree/master/node_exporter__prometheus__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

http://ip:9090/targets

Grafana UI

http://ip:3000

如果照著我的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裡,到這裡就完成整個系統的建立了。

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments