1. 程式人生 > >容器監控方案選擇

容器監控方案選擇

  • 對於容器的監控方案可謂多種多樣,本身自帶命令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是一個容器資源監控工具,包括容器的記憶體、CPU、網路IO、磁碟IO等監控,同時提供了一個web頁面用於檢視容器的實時執行狀態。CAdvisor預設儲存2分鐘的資料,而且只是針對單物理機。不過CAdvisor提供了很多資料整合介面,支援influxDB、Redis、kafka、elasticsearch等整合,可以加上對應配置將監控資料發往這些資料庫儲存起來。

  • CAdvisor功能主要有兩點:

    • 展示host和容器兩個層次的監控資料;
    • 展示歷史變化資料。
  • influxDB是用Go語言編寫的一個開源分散式時序、事件和指標資料庫,無需外部依賴。

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

  • InfluxDB主要功能:

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

    • 無結構(無模式);
    • 可以是任意數量的列;
    • 可擴充套件的;
    • 支援min,max,sum,count,mean,median等一系列函式,方便統計;
    • 原生的HTTP支援,內建HTTP API;
    • 強大的類SQL語法;
    • 自帶管理介面,方便使用。
  • Grafana是一個開源的資料監控分析視覺化平臺,支援多種資料來源配置(支援的資料來源包括influxDB、MySQL、elasticsearch、OpenTSDB、Graphite等)和豐富的外掛及模板功能,支援圖表許可權控制和報警。

  • Grafana主要特性:

    • 靈活豐富的圖形化選項;
    • 可以混合多種風格;
    • 支援白天和夜間模式;
    • 支援多個數據源。
  • CAdvisor+InfluxDB+Grafana

    • CAdvisor:負責收集容器隨時間變化的資料;
    • InfluxDB:負責儲存時序資料;
    • Grafana:負責分析和展示時序資料。
  • 安裝部署

    • 部署InfluxDB服務

      docker run -d -p 8083:8083 -p 8086:8086 --expose 8090 --expose 8099 -v /Users/zhangxufeng/xufeng.zhang/docker/volumes/influxdb:/var/lib/influxdb --hostname=influxdb --name influx tutum/influxdb
      
    • 說明

      • --name:啟動容器分配名字influxdb;
      • -p:對映埠,8083埠為influxdb管理埠,8086埠是influxdb的資料埠;
      • -v:掛載資料;
      • -d:後臺執行此容器;
      • influxdb:通過這個容器來執行的,預設會在docker官方倉庫pull下來。
    • 瀏覽器訪問influxdb的管理端:http://127.0.0.1:8083,可以看到管理頁面

    • 建立test的資料庫與root使用者,這個用於後期配置grafana

      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:需要指定cadvisro的儲存驅動、資料庫主機、資料庫名;
    • 部署grafana服務

      • grafana是一款開源的時序資料分析工具,而且介面專業易用

        docker run -d -p 3000:3000 -v /Users/zhangxufeng/xufeng.zhang/docker/volumes/grafana:/var/lib/grafana --link=influxdb:influxdb --name grafana grafana/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