【實戰】五個Docker監控工具的對比

jopen 9年前發布 | 267K 次閱讀 Docker

這篇文章作者是Usman,他是服務器和基礎架構工程師,有非常豐富的分布式構建經驗。該篇文章主要分析評估了五種Docker監控工具,包括免費的和不 免費的:Docker Stats、CAdvisor、Scout、Data Dog以及Sensu。不過作者還是推薦使用Data Dog。另外還有兩個工具:Prometheus與Sysdig Cloud會在下一篇做介紹分析,敬請期待。

隨著Docker被大規模的部署應用,如何通過可視化的方式了解Docker環境的狀態以及健康變得越來越重要。這篇文章我們來回顧下監控容器的常用工具。我會基于以下標準評估這些工具:

  1. 易于部署
  2. 信息呈現的詳細度
  3. 整個部署過程中日志的聚集程度
  4. 數據報警能力
  5. 是否可以監控非Docker的資源
  6. 成本
  7. </ol>
    這些評估標準可能并不全面,但是我試圖強調的是最常用的工具以及優化此六項評估標準的工具。

    Docker Stats命令

    本文中所有使用的命令只在亞馬遜EC2上的RancherOS實例中測試過。但是我想它們應該可以在任何的Docker容器中運行。

    我將討論的第一個工具是Docker本身。你可能不知道Docker客戶端已經提供了基本的命令行工具來檢查容器的資源消耗。想要查看容器統計信息只需運行docker stats [CONTAINER_NAME]。這樣就可以查看每個容器的CPU利用率、內存的使用量以及可用內存總量。請注意,如果你沒有限制容器內存,那么該命令將顯示您的主機的內存總量。但它并不意味著你的每個容器都能訪問那么多的內存。另外,還可以看啊都容器通過網絡發送和接收的數據總量。

    $ docker stats determined_shockley determined_wozniak prickly_hypatia
    CONTAINER             CPU %               MEM USAGE/LIMIT       MEM %               NET I/O
    determined_shockley   0.00%               884 KiB/1.961 GiB     0.04%               648 B/648 B
    determined_wozniak    0.00%               1.723 MiB/1.961 GiB   0.09%               1.266 KiB/648 B
    prickly_hypatia       0.00%               740 KiB/1.961 GiB     0.04%               1.898 KiB/648 B

    如果想要看到更為詳細的容器屬性,還可以通過netcat,使用Docker遠程API來查看(見下文)。發送一個HTTP GET請求/containers/[CONTAINER_NAME],其中CONTAINER_NAME是你想要統計的容器名稱。你可以從 這里看到一個容器stats請求的完整響應信息。在上述的例子中你會得到緩存、交換空間以及內存的詳細信息。如果要了解什么是metrics,那么你就需要精讀Docker文檔的 Run Metrics部分

    評分:

    1. 易于部署程度:※※※※※
    2. 信息詳細程度:※※※※※
    3. 集成度:無
    4. 生成警報的能力:無
    5. 監測非Docker的資源的能力:無
    6. 成本:免費

      CAdvisor

      我們可以使用docker stats命令和遠程API來獲取容器的狀態信息。但是,如果你想要在圖形界面中直接查看這些信息,那你就需要諸如 CAdvisor這類的工具。CAdvisor提供了早docker stats命令所顯示的數據的可視化界面。運行以下Docker命令,并在瀏覽器里訪問http://&lt;your-hostname>:8080/可以看到CAdvisor的界面。你將看到CPU的使用率、內存使用率、網絡吞吐量以及磁盤空間利用率。然后,你可以通過點擊在網頁頂部的Docker Containers鏈接,然后選擇某個容器來詳細了解它的使用情況。
      docker run                                      \
      --volume=/:/rootfs:ro                         \
      --volume=/var/run:/var/run:rw                 \
      --volume=/sys:/sys:ro                         \
      --volume=/var/lib/docker/:/var/lib/docker:ro  \
      --publish=8080:8080                           \
      --detach=true                                 \
      --name=cadvisor                               \
      google/cadvisor:latest

      【實戰】五個Docker監控工具的對比

      CAdvisor是一個易于設置并且非常有用的工具,我們不用非要SSH到服務器才能查看資源消耗,而且它還給我們生成了圖表。此外,當集群需要額外的資 源時,壓力表(pressure gauges )提供了快速預覽。而且,與本文中的其他的工具不一樣的是CAdvisor是免費的,并且還開源。另外,它的資源消耗也比較低。但是,它有它的局限性,它 只能監控一個Docker主機。因此,如果你是多節點的話,那就比較麻煩了,你得在所有的主機上都安裝一個CAdvisor,者肯定特別不方便。值得注意 的是,如果你使用的是Kubernetes,你可以使用 heapster來 監控多節點集群。另外,在圖表中的數據僅僅是時長一分鐘的移動窗口,并沒有方法來查看長期趨勢。如果資源使用率在危險水平,它卻沒有生成警告的機制。如果 在Docker節點的資源消耗方面,你沒有任何可視化界面,那么CAdvisor是一個不錯的開端來帶你步入容器監控,然而如果你打算在你的容器中運行任 何關鍵任務,那你就需要一個更強大的工具或者方法。

      評分:(忽略了heapster,因為它僅支持Kubernetes)

    7. 易于部署程度:※※※※※
    8. 信息詳細程度:※※
    9. 集成度:※
    10. 生成警報的能力:無
    11. 監測非Docker的資源的能力:無
    12. 成本:免費

      Scout

      下一個Docker監控的方法是Scout,它解決了CAdvisor的局限性。 Scout是一個應用監控服務,它能夠從很多主機和容器中獲得各項監測數據,并將數據呈現在有更長時間尺度的圖標中。它也可以基于這些指標生成警報。要獲取Scout并運行,第一步,在 scoutapp.com注冊一個Scout帳戶,免費的試用賬號足以用來集成測試。一旦你創建了自己的帳戶并登錄,點擊右上角的帳戶名稱,然后點擊Account Basics來查看你的Account Key,你需要這個Key從Docker服務器來發送指標。
      【實戰】五個Docker監控工具的對比

      【實戰】五個Docker監控工具的對比

      現在在你的主機上,創建一個名為scouts.yml的文件并將下面的文字復制到該文件中,用上邊得到的Key替換到account_key。您可以對主 機指定任何有意義的變量:display_name、environment與roles等屬性。當他們在scout界面上呈現時,這些將用于分離各種指 標。我假設有一組網站服務器列表正在運行Docker,它們都將采用如下圖所示的變量。
      # account_key is the only required value
      account_key: YOUR_ACCOUNT_KEY
      hostname: web01-host
      display_name: web01
      environment: production
      roles: web

      現在,你可以使用scout配置文件通過Docker-scout插件來運行scout。
      docker run -d  --name scout-agent                              \
      -v /proc:/host/proc:ro                                               \
      -v /etc/mtab:/host/etc/mtab:ro                                   \
      -v /var/run/docker.sock:/host/var/run/docker.sock:ro    \
      -v `pwd`/scoutd.yml:/etc/scout/scoutd.yml                     \
      -v /sys/fs/cgroup/:/host/sys/fs/cgroup/                           \
      --net=host --privileged                                                   \
      soutapp/docker-scout

      這樣你查看Scout網頁就能看到一個條目,其中display_name參數(web01)就是你在scoutd.yml里面指定的。
      【實戰】五個Docker監控工具的對比

      如果你點擊它(web01)就會顯示主機的詳細信息。其中包括任何運行在你主機上的進程計數、cpu使用率以及內存利用率,值得注意的是在docker內部并沒有進程的限制。
      【實戰】五個Docker監控工具的對比

      如果要添加Docker監控服務,需要單擊Roles選項卡,然后選擇所有服務。現在點擊+插件模板按鈕,接下來的Docker監視器會加載詳細信息視 圖。一旦詳細信息呈現出來,選擇安裝插件來添加到您的主機。接著會給你提供一個已安裝插件的名稱以及需指定要監視的容器。如果該字段是空的,插件將監控主 機上所有的容器。點擊完成按鈕,一分鐘左右你就可以在[Server Name] > Plugins中看到從Docker監控插件中獲取的詳細信息。該插件為每個主機顯示CPU使用率、內存使用率、網絡吞吐量以及容器的數量。
      【實戰】五個Docker監控工具的對比

      你點擊任何一個圖表,都可以拉取該指標的詳細視圖,該視圖可以讓你看到時間跨度更長的趨勢。
      【實戰】五個Docker監控工具的對比

      該視圖還支持過濾基于環境和服務器角色的指標。此外,你可以創建“Triggers”或警報,如果指標高于或低于配置的閾值它就給你發送電子郵件。這就允 許您設置自動警報來通知您,比如,如果你的一些容器異常關閉以及容器計數低于一定數量。您還可以設置對平均CPU利用率的警報,舉例來說,如果你正在運行 的容器超過CPU利用率而發熱,你會得到一個警告,當然你可以開啟更多的主機到你的Docker集群。

      要創建觸發器,請選擇頂部菜單的Roles>All Servers,然后選擇plugins部分的Docker monitor。然后在屏幕的右側的Plugin template Administration菜單里選擇triggers。您現在應該看到一個選項“Add a Trigger”,它將應用到整個部署。
      【實戰】五個Docker監控工具的對比

      下面是一個觸發器的例子,如果部署的容器數量低于3就會發出警報。
      【實戰】五個Docker監控工具的對比

      它的創建是為“所有的服務器”,當然你也可以用不同的角色標記你的主機使用服務器上創建的scoutd.yml文件。使用角色。你可以通過使用不同角色來 應用觸發器到部署的服務器的一個子集上。例如,你可以設置一個當在你的網絡的節點的容器數量低于一定數量時的警報。即使是基于角色的觸發器我仍然覺得 Scout的警報系統可能做的更好。這是因為許多Docker部署具有相同主機上的多種多樣的容器。在這種情況下為特定類型的容器設置觸發器將是不可能的 由于角色被應用到主機上的所有容器。

      比起CAdvisor,使用Scout的另一個優點是,它有 大量的插件,除了Docker信息他們可以吸收其他有關你的部署的數據。這使得Scout是你的一站式監控系統,而無需對系統的各種資源來安裝各種不同的監控系統。

      Scout的一個缺點是,它不顯示有關每個主機上像CAdvisor的單獨容器的詳細信息。這是個問題,如果你在同一臺服務器上運行大量的容器。 例如,如果你想有一個觸發器來提醒您的Web容器的警報,但不是Jenkins容器,這時Scout就無法支持該情況。盡管有這個缺點,Scout還是一 個相當有用的工具來監控你的Docker部署。當然這要付出一些代價,每個監控的主機十美元。如果你要運行一個有多臺主機的超大部署,這個代價會是個考慮 因素。

      評分:

    13. 易于部署程度:※※※※
    14. 信息詳細程度:※※
    15. 集成度:※※※
    16. 生成警報的能力:※※※
    17. 監測非Docker的資源的能力:支持
    18. 成本:每個主機$10

      Data Dog

      從Scout移步到另一個監控服務——DataDog,它既解決幾個Scout的缺點又解除了CAdvisor的局限性。要使用DataDog,先在 https://www.datadoghq.com/注 冊一個DataDog賬戶。一旦你登錄到您的帳戶,您將看到支持集成的每種類型的指令列表。從列表中選擇Docker,你會得到一個Docker run命令(如下),將其復制到你的主機。該命令需要你的預先設置的API密鑰,然后你可以運行該命令。大約45秒鐘后您的代理將開始向DataDog系 統報告。
      docker run -d --privileged --name dd-agent             \
      -h `hostname`                                      \
      -v /var/run/docker.sock:/var/run/docker.sock       \
      -v /proc/mounts:/host/proc/mounts:ro               \
      -v /sys/fs/cgroup/:/host/sys/fs/cgroup:ro          \
      -e API_KEY=YOUR_API_KEY datadog/docker-dd-agent    \

      此時,容器提示你可以在DataDog Web的Events tab上處理和查看有關集群的所有動態。所有容器的啟動和終止都是事件流的一部分。
      【實戰】五個Docker監控工具的對比

      您也可以點擊Dashboards標簽并點擊創建儀表板以合計您整個群集的指標。 Datadog收集在系統中運行的所有容器的CPU使用率、內存以及I/O的指標。此外,也可以獲得容器運行和停止次數以及Docker的鏡像數量。 Dashboard視圖可以創建任何數據的圖標,或者設置整個部署、主機群、容器鏡像指標的圖表。例如下圖顯示了運行容器的數量并加以鏡像類型分類,此刻 在我的集群運行了9個Ubuntu:14.04的容器。
      【實戰】五個Docker監控工具的對比

      您還可以通過主機分類同樣的數據,如下圖所示,7個容器在我的Rancher主機上運行,其余的在我的本地的筆記本電腦。
      【實戰】五個Docker監控工具的對比

      DataDog還支持一種稱為Monitors的警報功能。DataDog的一個monitor相當于Scout的一個觸發器,并允許您定義各種指標的閾 值。 比起Scout,DataDog的警報系統相當靈活與詳細。下面的例子說明如何指定您監視的Ubuntu容器的終止,因此你會監視從 Ubuntu:14.04的Docker鏡象所創建容器的docker.containers.running信息。
      【實戰】五個Docker監控工具的對比

      然后,特定的警報情況是,如果在我們的部署中最后5分鐘有(平均)少于十個Ubuntu容器,你就會被警報。盡管這里沒有顯示,你會被要求填寫發送出去時 的指定消息在這個警報被觸發后,而且還有受到此警報的目標。在當前的例子中,我用一個簡單的絕對閾值。您也可以指定一個基于增量的警報,比如是在最后五分 鐘里停止的容器的平均計數是四的警報。
      【實戰】五個Docker監控工具的對比

      最后,使用Metrics Explorer選項卡可以臨時聚集你的指標來幫助調試問題或者提取具體的數據信息。該視圖允許您基于對容器鏡像或主機繪制任何指標的圖表。您可以將輸出的數據組合成一個單一的圖形或者通過鏡像或主機的分組來生成一組圖形。
      【實戰】五個Docker監控工具的對比

      DataDog相比scout在某些功能上做了顯著地改善,方便使用以及用戶友好的設計。然而這一級別伴隨著額外的成本,因為每個DataDog agent價格為$15。

      評分:

    19. 易于部署程度:※※※※※
    20. 信息詳細程度:※※※※※
    21. 集成度:※※※※※
    22. 生成警報的能力:支持
    23. 監測非Docker的資源的能力:※※※※※
    24. 成本:每個主機$15

      Sensu Monitoring Framework

      Scout和Datadog提供集中監控和報警系統,然而他們都是被托管的服務,大規模部署的話成本會很突出。如果你需要一個自托管、集中指標的服務,你可以考慮 sensu open source monitoring framework。要運行Sensu服務器可以使用 hiroakis/docker-sensu-server容器。這個容器會安裝sensu-server、uchiwa Web界面、Redis、rabbitmq-server以及sensu-api。不幸的是sensu不支持Docker。但是,使用插件系統,您可以配置支持容器指標以及狀態檢查。

      在開啟sensu服務容器之前,你必須定義一個可以加載到服務器中檢查。創建一個名為check-docker.json的文件并添加以下內容到 此文件。這個文件告訴Sensu服務器在所有有docker標簽的客戶端上每十秒運行一個名為load-docker-metrics.sh的腳本。
      {
      "checks": {
      "load_docker_metrics": {
        "type": "metric",
        "command": "load-docker-metrics.sh",
        "subscribers": [
          "docker"
        ],
        "interval": 10
      }
      }
      }

      現在,您可以使用下面的命令通過我們的檢查配置文件來運行Sensu服務器Docker容器。一旦你運行該命令,你就可以在瀏覽器輸入http://YOUR_SERVER_IP:3000來訪問uchiwa界面。
      docker run -d --name sensu-server                                           \
      -p 3000:3000                                                            \
      -p 4567:4567                                                            \
      -p 5671:5671                                                            \
      -p 15672:15672                                                          \
      -v $PWD/check-docker.json:/etc/sensu/conf.d/check-docker.json           \
      hiroakis/docker-sensu-server

      這樣Sensu服務器就開啟了,你就可以對每個運行有我們的Docker容器的主機上開啟sensu客戶端。你告訴容器將有一個名為load- docker-metrics.sh的腳本,所以讓我們創建腳本,并將其放到我們的客戶端容器內。創建該文件并添加如下所示的文本,將HOST_NAME 替換為您的主機的邏輯名稱。下面的腳本是為運行容器、所有容器以及鏡像而使用Docker遠程API來拉取元數據。然后它打印出來sensu的鍵值標示的 值。該sensu服務器將讀取標準輸出并收集這些指標。這個例子只拉取這三個值,但根據需要,你可以使腳本盡可能詳細。請注意,你也可以添加多個檢查腳 本,如thos,只要早前在服務配置文件中你引用過它們。你也可以定義你想要檢查運行Docker容器數量降至三個以下的失敗。你還可以使檢查通過從檢查 腳本返回一個非零值失敗。
      #!/bin/bash
      set -e

     Count all running containers

    running_containers=$(echo -e "GET /containers/json HTTP/1.0\r\n" | nc -U /var/run/docker.sock \ | tail -n +5                                                           \ | python -m json.tool                                                  \ | grep \"Id\"                                                          \ | wc -l)

     Count all containers

    total_containers=$(echo -e "GET /containers/json?all=1 HTTP/1.0\r\n" | nc -U /var/run/docker.sock \ | tail -n +5 \ | python -m json.tool \ | grep \"Id\" \ | wc -l)

     Count all images

    total_images=$(echo -e "GET /images/json HTTP/1.0\r\n" | nc -U /var/run/docker.sock \ | tail -n +5 \ | python -m json.tool \ | grep \"Id\" \ | wc -l)

    echo "docker.HOST_NAME.running_containers ${running_containers}" echo "docker.HOST_NAME.total_containers ${total_containers}" echo "docker.HOST_NAME.total_images ${total_images}"

    if [ ${running_containers} -lt 3 ]; then exit 1; fi</pre>
    現在你已經定義了Docker載入指標檢查,那就需要使用 usman/sensu-client容 器來啟動sensu客戶端。您可以使用如下所示的命令啟動sensu客戶端。需要注意的是,容器必須以privileged來運行以便能夠訪問Unix sockets,它必須有Docker socket掛載以及你上面定義的load-docker-metrics.sh腳本。確保load-docker-metrics.sh腳本在你的主機 的權限標記為可執行。容器也需要將SENSU_SERVER_IP、RABIT_MQ_USER、RABIT_MQ_PASSWORD、 CLIENT_NAME以及CLIENT_IP作為參數,請指定這些參數到您設置的值。其中RABIT_MQ_USER與 RABIT_MQ_PASSWORD默認值是sensu和password。

    docker run -d --name sensu-client --privileged                                \
    -v $PWD/load-docker-metrics.sh:/etc/sensu/plugins/load-docker-metrics.sh  \
    -v /var/run/docker.sock:/var/run/docker.sock                              \
    usman/sensu-client SENSU_SERVER_IP RABIT_MQ_USER RABIT_MQ_PASSWORD CLIENT_NAME CLIENT_IP

    【實戰】五個Docker監控工具的對比

    運行完此命令,一會兒你應該看到客戶端計數增加1在uchiwa界面。如果您點擊客戶端圖標,你應該看到,包括你剛才添加的客戶端的客戶端名單。我的客戶端1是client-1以及指定的主機IP為192.168.1.1。

    【實戰】五個Docker監控工具的對比

    如果你點擊客戶端名稱你應該得到檢查的進一步細節。你可以看到load_docker_metrics檢查在3月28日的10:22運行過。

    【實戰】五個Docker監控工具的對比

    如果你點擊檢查名稱就可以看到檢查運行的進一步細節。零表明沒有錯誤,如果腳本失敗(例如,如果您的Docker守護進程死掉),你會看到一個錯誤代碼(非零)值。雖然在目前的文章中沒有涉及這個,你也還可以使用 Handlers在 sensu設置這些檢查失敗處理程序來提醒您。此外,uchiwa只顯示檢查的值,而不是收集的指標。需要注意的是sensu不存儲所收集的指標,它們必 須被轉發到一個時間序列的數據庫如InfluxDB或Graphite。這也是通過Handlers做到的。如何配置指標轉發到graphite 可以參考這里

    【實戰】五個Docker監控工具的對比

    Sensu支持我們所有的評價標準,你可以對我們Docker容器和主機收集盡可能多的細節。此外,你能夠聚合所有主機的值到一個地方,并對這些檢查發出 警報。這些警報并沒有DataDog或Scout的先進,因為你僅能夠提醒單獨的主機上檢查失敗。然而,Sensu的大缺點是部署的難度。雖然我 已經使用Docker容器自動部署許多步驟,Sensu仍然是一個需要我們安裝,啟動和分開維護Redis、RabitMQ、Sensu API、uchiwa與Sensu Core的復雜系統。此外,你將需要更多的工具,如Graphite來呈現指標值以及生產部署需要定制容器,今天我已經使用了一個容器為了密碼的安全以及 自定義的SSL證書。除了您重啟容器后才能添加更多的檢查,你將不得不重新啟動Sensu服務,因為這是它開始收集新的標準的唯一途徑。由于這些原因,我 對Sensu的在易于部署的評價相當的低。

    評分:

    1. 易于部署程度:※
    2. 信息詳細程度:※※※※
    3. 集成度:※※※※
    4. 生成警報的能力:支持但有限
    5. 監測非Docker的資源的能力:※※※※※
    6. 成本:免費

      總結

      今天的文章涵蓋了多種選項用于監控Docker容器,從免費的選擇, 如Docker stats、CAdvisor或Sensu,到有償服務,如Scout和DataDog。我的研究到目前為止DataDog似乎是用于監控Docker部 署的最好的系統。只需幾秒的安裝以及單行命令,所有主機都在同一個地方報告指標,在UI方面,歷史趨勢是顯而易見的,并且Datadog支持更深層次的指 標以及報警。然而,$15一個主機系統對于大型部署是昂貴的。對于較大規模,自托管部署,Sensu是能夠滿足大多數的要求,不過在建立和管理一個 Sensu集群的復雜性可能讓人望而卻步。很顯然,有很多其他的自托管的選項,如Nagios或Icinga,他們都類似Sensu。

      但愿今天這篇文章會給你一些想法對于監視容器的選擇。我會繼續調查其他選項,包括使用CollectD、Graphite或InfluxDB與Grafana的更精簡的自我管理的容器監控系統。敬請關注更多的細節。

      其他信息:發布本文后,我有一些建議去評估Prometheus和Sysdig云,兩個非常好的監控Docker的選擇。我在這兩個服務上花了一些時間,并添加了第二部分到這個文章中。你可以在 這里(譯注:過后會翻譯這篇)找到它。

      想要了解更多關于監控和管理Docker,請參加我們的下一個Rancher在線meetup。

      原文:Comparing Five Monitoring Options for Docker (翻譯:田浩浩

      ===========================
      譯者介紹
      田浩浩, USYD研究生,目前在珠海從事手機應用開發工作。業余時間專注Docker的學習與研究,希望通過 DockOne把最新最優秀的譯文貢獻給大家,與讀者一起暢游Docker的海洋。

      來自:http://dockone.io/article/397
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!