Docker進階-容器監控cAdvisor+InfluxDB+Granfana

小碼農薛堯發表於2019-08-20

概述

前面文章介紹使用docker compose組合應用並利用scale快速對容器進行擴容。

由於docker compose啟動的服務都在同一臺宿主機上,對於一個宿主機上執行多個容器應用時,容器的執行情況如:CPU使用率、記憶體使用率、網路狀態、磁碟空間等一系列隨時間變化的時序資料資訊,都是需要去了解,因此監控是必須的。

容器監控方案選擇

對於容器的監控方案可謂多種多樣,本身自帶命令docker stats命令,Scout,Data Dog,Sysdig Cloud,Sensu Monitoring Framework,CAdvisor等。

通過docker stats命令可以很方便的看到當前宿主機上所有容器的CPU,記憶體以及網路流量等資料。但是docker stats命令的缺點就是統計的只是當前宿主機的所有容器,而獲取的監控資料是實時的,沒有地方儲存,也沒有報警功能。

docker stats
複製程式碼

而Scout、Sysdig Cloud、Data Dog雖然都提供了較完善的服務,但是它們都是託管的服務而且都收費,Sensu Monitoring Framework整合度較高,也免費,但是部署過於複雜。綜合考慮,我們選擇了CAdvisor做容器監控工具。

CAdvisor谷歌出品,優點是開源產品,監控指標齊全,部署方便,而且有官方的docker映象。缺點是整合度不高,預設只在本地儲存2分鐘資料。不過可以加上InfluxDB儲存資料,對接Grafana展示圖表,比較便利地搭建好了容器監控系統,資料收集和圖表展示效果良好,對系統效能也幾乎沒有什麼影響。

CAdvisor

CAdvisor是一個容器資源監控工具,包括容器的記憶體,CPU,網路IO,磁碟IO等監控,同時提供了一個WEB頁面用於檢視容器的實時執行狀態。CAdvisor預設儲存2分鐘的資料,而且只是針對單物理機。不過,CAdvisor提供了很多資料整合介面,支援InfluxDB,Redis,Kafka,Elasticsearch等整合,可以加上對應配置將監控資料發往這些資料庫儲存起來。

CAdvisor功能主要有兩點:

  • 展示Host和容器兩個層次的監控資料。
  • 展示歷史變化資料。

InfluxDB

InfluxDB是用Go語言編寫的一個開源分散式時序、事件和指標資料庫,無需外部依賴。

前面說到,CAdvisor預設只在本機儲存最近2分鐘的資料,為了持久化儲存資料和統一收集展示監控資料,需要將資料儲存到InfluxDB中。InfluxDB是一個時序資料庫,專門用於儲存時序相關資料,很適合儲存CAdvisor的資料。而且,CAdvisor本身已經提供了InfluxDB的整合方法,豐啟動容器時指定配置即可。

InfluxDB主要功能:

  • 基於時間序列,支援與時間有關的相關函式(如最大、最小、求和等);
  • 可度量性:你可以實時對大量資料進行計算;
  • 基於事件:它支援任意的事件資料;

InfluxDB主要特點:

  • 無結構(無模式);
  • 可以是任意數量的列;
  • 可擴充的;
  • 支援min,max,sum,count,mean,median等一系列函式,方便統計;
  • 原生的HTTP支援,內建HTTP API;
  • 強大的類SQL語法;
  • 自帶管理介面,方便使用

Granfana

Grafana是一個開源的資料監控分析視覺化平臺,支援多種資料來源配置(支援的資料來源包括InfluxDB,MySQL,Elasticsearch,OpenTSDB,Graphite等)和豐富的外掛及模板功能,支援圖表許可權控制和報警。

Grafan主要特性:

  • 靈活豐富的圖形化選項
  • 可以混合多種風格
  • 支援白天和夜間模式
  • 多個資料來源

CAdvisor+InfluxDB+Granfana

CAdvisor:負責收集容器的隨時間變化的資料 InfluxDB:負責儲存時序資料 Grafana:負責分析和展示時序資料

安裝部署

部署InfluxDB服務

docker run -d --name influxdb -p 8086:8086 \
-v /data/influxdb:/var/lib/influxdb \
--hostname=influxdb \
influxdb
複製程式碼

說明:

  • --name:啟運容器分配名字influxdb
  • -p:對映埠,8083埠為influxdb管理埠,8086埠是influxdb的資料埠
  • -v:掛載資料 -d:後臺執行此容器
  • influxdb:通過這個容器來執行的,預設會在docker官方倉庫pull下來

1、瀏覽器訪問influxdb的管理端,http://ip:8083

2、建立test的資料庫與root使用者,這個用於後期配granfa

docker exec it influxdb influx

CREATE DATABASE "test"
CREATE USER "root" WITH PASSWORD 'root' WITH ALL PRIVILEGES
複製程式碼

部署CAdvisor服務

谷歌的cadvisor可以用於收集Docker容器的時序資訊,包括容器執行過程中的資源使用情況和效能資料。

docker run --volume=/:rootfs:ro --volume=/var/run:/var/run:ro\
--volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro\
--volume=/dev/disk/:/dev/disk:ro --volume=/cgroup:/cgroup:ro \
--publish=8080:8080 --detach=true --privileged=true --name=cadvisor \
google/cadvisor:latest\
-storage_driver=influxdb-storage_driver_host=influxdb:8086\
-storage_driver_db=test-storage_driver_user=root\
-storage_driver_password=root
複製程式碼

說明:

  • -d:後臺執行此容器
  • --name:啟動容器分配名字cadvisor
  • -p:對映埠8080
  • --mount:把宿主機的相關目錄繫結到容器中,這些目錄都是cadvisor需要採集的目錄檔案 和監控內容
  • -storage_driver:需要指定cadvisor的儲存驅動、資料庫主機、資料庫名

通過ip:8080埠訪問測試一下

部署Granfana服務

grafana是一款開源的時序資料分析工具,而且介面專業簡單。

docker run -d -p 3000:3000 \
-v /data/grafana:/var/lib/grafana \
--link=influxdb:influxdb\
--name grafana  grafana/grafana
複製程式碼

注意:如果使用-v把資料掛載出來會出現容器啟動失敗,錯誤為mkdir:cannot create directory '/var/lib/grafana/plugins':Permission denied,此時可以使用docker run --entrypoint "id" grafana/grafana得到uid,gid,groups(預設是472);

接著使用chown -R 472:472 /data/grafana/修改目錄許可權就可以啟動成功。

通過ip:3000埠來訪問grafana的web服務,第一次訪問需要修改admin使用者密碼,預設使用者名稱/密碼為admin/admin

docker-compose快速部署

version: '3.1'

volumes:
  grafana_data: {}

services:
 influxdb:
  image: tutum/influxdb:0.9
  #image: tutum/influxdb
  #image: influxdb
  restart: always
  #user: 
  environment:
    - PRE_CREATE_DB=cadvisor
  ports:
    - "8083:8083"
    - "8086:8086"
  expose:
    - "8090"
    - "8099"
  volumes:
    - ./data/influxdb:/data

 cadvisor:
  #image: google/cadvisor:v0.29.0
  image: google/cadvisor
  links:
    - influxdb:influxsrv
  command: -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086
  restart: always
  ports:
    - "8080:8080"
  volumes:
    - /:/rootfs:ro
    - /var/run:/var/run:rw
    - /sys:/sys:ro
    - /var/lib/docker/:/var/lib/docker:ro

 grafana:
  #image: grafana/grafana:2.6.0
  user: "104"
  image: grafana/grafana
  user: "104"
  #user: "472"
  restart: always
  links:
    - influxdb:influxsrv
  ports:
    - "3000:3000"
  volumes:
    - grafana_data:/var/lib/grafana
  environment:
    - HTTP_USER=admin
    - HTTP_PASS=admin
    - INFLUXDB_HOST=influxsrv
    - INFLUXDB_PORT=8086
    - INFLUXDB_NAME=cadvisor
    - INFLUXDB_USER=root
    - INFLUXDB_PASS=root
複製程式碼

啟動docker-compose檔案

docker-compose up
複製程式碼

檢視三個服務容器是否啟動

Docker進階-容器監控cAdvisor+InfluxDB+Granfana

瀏覽grafana服務,http://ip:3000

Docker進階-容器監控cAdvisor+InfluxDB+Granfana

登陸grafana服務

Docker進階-容器監控cAdvisor+InfluxDB+Granfana

瀏覽influxdb服務,http://ip:8083/

Docker進階-容器監控cAdvisor+InfluxDB+Granfana

配置grafana工具

1、配置資料來源

Docker進階-容器監控cAdvisor+InfluxDB+Granfana

選擇influxdb資料來源

Docker進階-容器監控cAdvisor+InfluxDB+Granfana

具體配置如下

Docker進階-容器監控cAdvisor+InfluxDB+Granfana
Docker進階-容器監控cAdvisor+InfluxDB+Granfana

配置完成後,如下圖

Docker進階-容器監控cAdvisor+InfluxDB+Granfana

2、配置皮膚

Docker進階-容器監控cAdvisor+InfluxDB+Granfana

選擇皮膚型別

Docker進階-容器監控cAdvisor+InfluxDB+Granfana

選擇圖形

Docker進階-容器監控cAdvisor+InfluxDB+Granfana

配置查詢條件

Docker進階-容器監控cAdvisor+InfluxDB+Granfana

配置完後,效果如下圖

Docker進階-容器監控cAdvisor+InfluxDB+Granfana

grafana支援查詢條件,可以從influxdb中瞭解

Docker進階-容器監控cAdvisor+InfluxDB+Granfana

瀏覽cAdvisor服務,http://ip:8080/

Docker進階-容器監控cAdvisor+InfluxDB+Granfana

相關文章