docker stack 部署容器監控方案(cAdvisor、Prometheus、Grafana)
===============================================
2018/7/8_第1次修改 ccb_warlock
===============================================
最近正式業務終於開始上容器,雖然前期通過swarm解決了服務部署和擴展等問題,但是針對容器監控方面缺乏經驗甚至是無從入手,因為沒有監控數據我根本不知道目前給的資源限制是否合理,業務量激增的時候資源是否可以支撐負載等一系列問題。查資料的時候找到了cAdvisor+Prometheus+Grafana來構建容器的監控數據,而且發現有些做監控服務的公司也基於這個結構上再進行叠代。試驗下來這套監控的思路和ELK類似,通過cAdvisor將業務服務器的進行數據收集,Prometheus將數據抓取後存放到自己的時序庫中,Grafana則進行圖表的展現。
試驗過後可以滿足當前階段我對容器監控的需求,故空閑時整理了監控部署的手冊。
一、前提條件
- 環境中已經部署了docker swarm(http://www.cnblogs.com/straycats/p/8978135.html)
- 最好也部署了portainer(http://www.cnblogs.com/straycats/p/8978201.html)
- 默認業務服務器為IP:192.168.12.1、監控服務器(prometheus、grafana)為:192.168.12.2
- 默認swarm創建了network:myswarm-net
二、部署Node Exporter、cAdvisor
在業務服務器(本例為192.168.12.1)中部署Node Exporter、cAdvisor來獲取數據。
2.1 編輯PromLogs-stack.yml
vi /root/PromLogs-stack.yml
# 將下面的內容添加到PromLogs-stack.yml文件中,wq保存。
version: ‘3.6‘ services: node-exporter: image: prom/node-exporter:v0.16.0 environment: - TZ=Asia/Shanghai volumes: - /proc:/host/proc- /sys:/host/sys - /:/rootfs deploy: mode: global # replicas: 1 restart_policy: condition: on-failure resources: limits: cpus: "0.1" memory: 64M update_config: parallelism: 1 # 每次更新1個副本 delay: 5s # 每次更新間隔 monitor: 10s # 單次更新多長時間後沒有結束則判定更新失敗 max_failure_ratio: 0.1 # 更新時能容忍的最大失敗率 order: start-first # 更新順序為新任務啟動優先 ports: - 9100:9100 networks: - myswarm-net cadvisor: image: google/cadvisor:v0.30.2 environment: - TZ=Asia/Shanghai volumes: - /:/rootfs:ro - /var/run:/var/run:rw - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro deploy: mode: global # replicas: 1 restart_policy: condition: on-failure resources: limits: cpus: "0.2" memory: 200M update_config: parallelism: 1 # 每次更新1個副本 delay: 5s # 每次更新間隔 monitor: 10s # 單次更新多長時間後沒有結束則判定更新失敗 max_failure_ratio: 0.1 # 更新時能容忍的最大失敗率 order: start-first # 更新順序為新任務啟動優先 ports: - 8080:8080 networks: - myswarm-net networks: myswarm-net: external: true
2.2 部署服務棧
1)命令方式
cd docker stack deploy -c PromLogs-stack.yml PromLogs-stack
2)portainer界面方式(推薦)
登錄portainer(如果是根據上面的教程部署的portainer,瀏覽器訪問http://宿主機IP:9000,在stack中增加PromLogs-stack.yml文件中的內容)
三、部署Prometheus
在監控服務器(本例為192.168.12.2)中部署Prometheus來獲取數據並存儲。
3.1 創建卷
docker volume create prometheus-data
PS.prometheus的數據文件不能直接通過目錄映射,試驗下來要通過掛載卷的方式才能做持久化。
3.2 創建映射目錄
mkdir -p /usr/docker-vol/prometheus/conf
3.3 編輯配置文件prometheus.yml
vi /usr/docker-vol/prometheus/conf/prometheus.yml
# 將下面的內容添加到prometheus.yml文件內,wq保存。
# my global config global: scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. # scrape_timeout is set to the global default (10s). # Alertmanager configuration alerting: alertmanagers: - static_configs: - targets: # - alertmanager:9093 # Load rules once and periodically evaluate them according to the global ‘evaluation_interval‘. rule_files: # - "first_rules.yml" # - "second_rules.yml" # A scrape configuration containing exactly one endpoint to scrape: # Here it‘s Prometheus itself. scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: ‘prometheus‘ static_configs: - targets: [‘localhost:9090‘] - job_name: ‘node-exporter‘ static_configs: - targets: [‘192.168.12.1:9100‘] - job_name: ‘cadvisor‘ static_configs: - targets: [‘192.168.12.1:8080‘]
3.4 編輯prometheus-stack.yml
vi /root/prometheus-stack.yml
# 將下面的內容添加到prometheus-stack.yml文件中,wq保存。
version: ‘3.6‘ services: prometheus: image: prom/prometheus:v2.3.1 environment: - TZ=Asia/Shanghai volumes: - /usr/docker-vol/prometheus/conf/prometheus.yml:/etc/prometheus/prometheus.yml - prometheus-data:/prometheus deploy: replicas: 1 restart_policy: condition: on-failure resources: limits: cpus: "0.5" memory: 512M update_config: parallelism: 1 # 每次更新1個副本 delay: 5s # 每次更新間隔 monitor: 10s # 單次更新多長時間後沒有結束則判定更新失敗 max_failure_ratio: 0.1 # 更新時能容忍的最大失敗率 order: start-first # 更新順序為新任務啟動優先 ports: - 9090:9090 networks: - myswarm-net volumes: prometheus-data: external: true networks: myswarm-net: external: true
3.5 部署服務棧
1)命令方式
cd docker stack deploy -c prometheus-stack.yml prometheus-stack
2)portainer界面方式(推薦)
登錄portainer(如果是根據上面的教程部署的portainer,瀏覽器訪問http://宿主機IP:9000,在stack中增加prometheus-stack.yml文件中的內容)
四、部署Grafana
在監控服務器(本例為192.168.12.2)中部署Grafana來呈現Prometheus的信息。
4.1 創建卷
docker volume create grafana-data
PS.grafana的數據文件不能直接通過目錄映射,試驗下來要通過掛載卷的方式才能做持久化。
4.2 編輯grafana-stack.yml
vi /root/grafana-stack.yml
# 將下面的內容添加到grafana-stack.yml文件中,wq保存。
version: ‘3.6‘ services: grafana: image: grafana/grafana:5.2.0 environment: - TZ=Asia/Shanghai volumes: - grafana-data:/var/lib/grafana deploy: replicas: 1 restart_policy: condition: on-failure resources: limits: cpus: "0.2" memory: 200M update_config: parallelism: 1 # 每次更新1個副本 delay: 5s # 每次更新間隔 monitor: 10s # 單次更新多長時間後沒有結束則判定更新失敗 max_failure_ratio: 0.1 # 更新時能容忍的最大失敗率 order: start-first # 更新順序為新任務啟動優先 ports: - 3000:3000 networks: - myswarm-net volumes: grafana-data: external: true networks: myswarm-net: external: true
4.3 部署服務棧
1)命令方式
cd docker stack deploy -c grafana-stack.yml grafana-stack
2)portainer界面方式(推薦)
登錄portainer(如果是根據上面的教程部署的portainer,瀏覽器訪問http://宿主機IP:9000,在stack中增加grafana-stack.yml文件中的內容)
五、使用
瀏覽器訪問grafana(本例是:http://192.168.12.2:3000),輸入初始賬號/密碼(admin/admin)進入。
參考資料:
1.http://docs.grafana.org/installation/docker/#migration-from-a-previous-version-of-the-docker-container-to-5-1
docker stack 部署容器監控方案(cAdvisor、Prometheus、Grafana)