1. 程式人生 > >【實戰】五個Docker監控工具的對比

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

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

隨著Docker被大規模的部署應用,如何通過視覺化的方式瞭解Docker環境的狀態以及健康變得越來越重要。這篇文章我們來回顧下監控容器的常用工具。我會基於以下標準評估這些工具:
  1. 易於部署
  2. 資訊呈現的詳細度
  3. 整個部署過程中日誌的聚集程度
  4. 資料報警能力
  5. 是否可以監控非Docker的資源
  6. 成本

這些評估標準可能並不全面,但是我試圖強調的是最常用的工具以及優化此六項評估標準的工具。

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://<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

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

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

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

Scout

下一個Docker監控的方法是Scout,它解決了CAdvisor的侷限性。 Scout是一個應用監控服務,它能夠從很多主機和容器中獲得各項監測資料,並將資料呈現在有更長時間尺度的圖示中。它也可以基於這些指標生成警報。要獲取Scout並執行,第一步,在scoutapp.com註冊一個Scout帳戶,免費的試用賬號足以用來整合測試。一旦你建立了自己的帳戶並登入,點選右上角的帳戶名稱,然後點選Account Basics來檢視你的Account Key,你需要這個Key從Docker伺服器來發送指標。
2.png
3.png
現在在你的主機上,建立一個名為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裡面指定的。
4.png
如果你點選它(web01)就會顯示主機的詳細資訊。其中包括任何執行在你主機上的程序計數、cpu使用率以及記憶體利用率,值得注意的是在docker內部並沒有程序的限制。
5.png
如果要新增Docker監控服務,需要單擊Roles選項卡,然後選擇所有服務。現在點選+外掛模板按鈕,接下來的Docker監視器會載入詳細資訊檢視。一旦詳細資訊呈現出來,選擇安裝外掛來新增到您的主機。接著會給你提供一個已安裝外掛的名稱以及需指定要監視的容器。如果該欄位是空的,外掛將監控主機上所有的容器。點選完成按鈕,一分鐘左右你就可以在[Server Name] > Plugins中看到從Docker監控外掛中獲取的詳細資訊。該外掛為每個主機顯示CPU使用率、記憶體使用率、網路吞吐量以及容器的數量。
6.png
你點選任何一個圖表,都可以拉取該指標的詳細檢視,該檢視可以讓你看到時間跨度更長的趨勢。
7.png
該檢視還支援過濾基於環境和伺服器角色的指標。此外,你可以建立“Triggers”或警報,如果指標高於或低於配置的閾值它就給你傳送電子郵件。這就允許您設定自動警報來通知您,比如,如果你的一些容器異常關閉以及容器計數低於一定數量。您還可以設定對平均CPU利用率的警報,舉例來說,如果你正在執行的容器超過CPU利用率而發熱,你會得到一個警告,當然你可以開啟更多的主機到你的Docker叢集。

要建立觸發器,請選擇頂部選單的Roles>All Servers,然後選擇plugins部分的Docker monitor。然後在螢幕的右側的Plugin template Administration選單裡選擇triggers。您現在應該看到一個選項“Add a Trigger”,它將應用到整個部署。
8.png
下面是一個觸發器的例子,如果部署的容器數量低於3就會發出警報。
9.png
它的建立是為“所有的伺服器”,當然你也可以用不同的角色標記你的主機使用伺服器上建立的scoutd.yml檔案。使用角色。你可以通過使用不同角色來應用觸發器到部署的伺服器的一個子集上。例如,你可以設定一個當在你的網路的節點的容器數量低於一定數量時的警報。即使是基於角色的觸發器我仍然覺得Scout的警報系統可能做的更好。這是因為許多Docker部署具有相同主機上的多種多樣的容器。在這種情況下為特定型別的容器設定觸發器將是不可能的由於角色被應用到主機上的所有容器。

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

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

評分:

1. 易於部署程度:※※※※
2. 資訊詳細程度:※※
3. 整合度:※※※
4. 生成警報的能力:※※※
5. 監測非Docker的資源的能力:支援
6. 成本:每個主機$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上處理和檢視有關叢集的所有動態。所有容器的啟動和終止都是事件流的一部分。 10.png
您也可以點選Dashboards標籤並點選建立儀表板以合計您整個群集的指標。 Datadog收集在系統中執行的所有容器的CPU使用率、記憶體以及I/O的指標。此外,也可以獲得容器執行和停止次數以及Docker的映象數量。Dashboard檢視可以建立任何資料的圖示,或者設定整個部署、主機群、容器映象指標的圖表。例如下圖顯示了執行容器的數量並加以映象型別分類,此刻在我的叢集運行了9個Ubuntu:14.04的容器。
11.png
您還可以通過主機分類同樣的資料,如下圖所示,7個容器在我的Rancher主機上執行,其餘的在我的本地的膝上型電腦。
12.png
DataDog還支援一種稱為Monitors的警報功能。DataDog的一個monitor相當於Scout的一個觸發器,並允許您定義各種指標的閾值。 比起Scout,DataDog的警報系統相當靈活與詳細。下面的例子說明如何指定您監視的Ubuntu容器的終止,因此你會監視從Ubuntu:14.04的Docker鏡象所建立容器的docker.containers.running資訊。
13.png
然後,特定的警報情況是,如果在我們的部署中最後5分鐘有(平均)少於十個Ubuntu容器,你就會被警報。儘管這裡沒有顯示,你會被要求填寫傳送出去時的指定訊息在這個警報被觸發後,而且還有受到此警報的目標。在當前的例子中,我用一個簡單的絕對閾值。您也可以指定一個基於增量的警報,比如是在最後五分鐘裡停止的容器的平均計數是四的警報。
14.png
最後,使用Metrics Explorer選項卡可以臨時聚集你的指標來幫助除錯問題或者提取具體的資料資訊。該檢視允許您基於對容器映象或主機繪製任何指標的圖表。您可以將輸出的資料組合成一個單一的圖形或者通過映象或主機的分組來生成一組圖形。
15.png
DataDog相比scout在某些功能上做了顯著地改善,方便使用以及使用者友好的設計。然而這一級別伴隨著額外的成本,因為每個DataDog agent價格為$15。

評分:

1. 易於部署程度:※※※※※
2. 資訊詳細程度:※※※※※
3. 整合度:※※※※※
4. 生成警報的能力:支援
5. 監測非Docker的資源的能力:※※※※※
6. 成本:每個主機$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

現在你已經定義了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

16.png
執行完此命令,一會兒你應該看到客戶端計數增加1在uchiwa介面。如果您點選客戶端圖示,你應該看到,包括你剛才新增的客戶端的客戶端名單。我的客戶端1是client-1以及指定的主機IP為192.168.1.1。

相關推薦

實戰Docker監控工具對比

【編者的話】這篇文章作者是Usman,他是伺服器和基礎架構工程師,有非常豐富的分散式構建經驗。該篇文章主要分析評估了五種Docker監控工具,包括免費的和不免費的:Docker Stats、CAdvisor、Scout、Data Dog以及Sensu。不過作者還是推薦使用

Docker監控工具對比

【編者的話】這篇文章作者是Usman,他是伺服器和基礎架構工程師,有非常豐富的分散式構建經驗。該篇文章主要分析評估了五種Docker監控工具,包括免費的和不免費的:Docker Stats、CAdvisor、Scout、Data Dog以及Sensu。不過作者還是推薦使用Data Dog。另外還有兩個工具:P

LinuxCentos之“工作管理員”監控工具

linux 運維中經常需要檢視系統程序、CPU、記憶體、磁碟、網路等,可用不同的命令檢視,但是多有不便。其實,也可以採用類似Windows“工作管理員”的工具,來滿足運維工作的需求。類似的工具有top、htop、iftop、glance、dstat 結合了vmstat \ iostat \ ifstat \

收藏75很有用的開源移動工具

自動同步 數據庫 note 樣式 測試框架 address track store ppc  據皮尤研究中心聲稱,現在68%的美國成年人擁有智能手機,只比擁有臺式機或筆記本電腦的用戶少5%。而美國45%的成年人現在擁有平板電腦。      考慮到移動設備如此普遍,開源社

實戰Docker入門實踐二:Docker服務基本操作 和 測試Hello World

lag hit 現在 mage spa 關系 .so recommend 不能 操作環境操作系統:CentOS7.2 內存:1GB CPU:2核Docker服務常用命令docker服務操作命令如下service docker start #啟動服務 service doc

18技巧實戰深度學習,資深研究員的血淚教訓

作者:chen_h 微訊號 & QQ:862251340 微信公眾號:coderpai (文/Nikolas Markou)我自 2013 年以來就一直在使用深度學習和深度置信網路。 我加入了一個綠地專案,負責選擇在計算機視覺平臺上使用的

來!做一個分鐘級業務監控系統實戰

  如何做一個實時的業務統計的監控?比如分鐘級?也就是每分鐘可以快速看到業務的變化趨勢,及可以做一些簡單的分組查詢?   哎,你可能說很簡單了,直接從資料庫 count 就可以了! 你是對的。   但如果不允許你使用db進行count呢?因為線上資料庫資源可是很寶貴的哦,你這一count可能會給db帶來災

Python京東商品價格監控

ets amp inpu text init clas bject logs while import requests,json,re,winsound,time class Stock(object): def __init__(self):

前端bug

1.5 nbsp 取數 -1 元素 spa asc 包括 解決 目錄 一、Array對象的indexOf() 二、使用jquery,clone()下拉框問題 三、jquery獲取獲取html5的data-*屬性 一、Array對象的indexOf()

Python 文件目錄比較工具filecmp和difflib

返回 我沒 直接 既然 hash this 上下 direct 不同   在一些運維場景中,常常需要比較兩個環境中的應用目錄結構(是否有文件/目錄層面上的增刪)以及比較兩個環境中同名文件內容的不同(即文件層面上的改)。Python自帶了兩個內建模塊可以很好地完成這個工作,f

Python實戰一:

想要 目錄 系統變量 ack 2.7 file 申請 ntc pytho 1. 環境配置 我電腦Windows7 64位 + Python2.7 + Oracle客戶端 10.2 + cx_Oracle 10g Oracle客戶端下載(為此我還申請個Oracle賬號

分享Windows日誌查看工具分享

hub class 後來 windows.h int href 問題 命令 lin   在Linux下查看日誌,使用tail、grep、find等命令還比較方便,後來需要在Windows中處理一些問題,發現缺少類似的功能,比如tailf實時輸出,於是在網上收集了一些相關的小

轉載17新手常見Python運行時錯誤

not 使用 .html and pad error: als num container 轉自:http://www.cnblogs.com/smile-ls/archive/2013/05/20/3088393.html 當初學 Python 時,想要弄懂 Python

Python例子教你寫代碼

位數 mage int 1-1000 image end src orm origin 這篇文章包括用Python編寫的斐波那契數列,三位數的水仙花數和百錢買百雞的基礎代碼: (一)斐波那契數列: ‘‘‘ def hanshu(n): n_1 = 1 n_2 =

轉載使用信號監控 Django 模型對象字段值的變化

rec field dex 文件 沒有 **kwargs blog ini csdn 轉載出處:http://blog.csdn.net/pushiqiang/article/details/74949465 Django 信號 (Signals) 的功能類似於 Wor

19必須知道的Visual Studio快捷鍵

尾到頭 完成 + - 方案 管理器 tell ron ctrl + c explore 本文將為大家列出在Visual Studio中常用的快捷鍵,正確熟練地使用快捷鍵,將大大提高你的編程工作效率。 項目相關的快捷鍵 Ctrl + Shift + B = 生成項

bzoj3064Tyvj 1518 CPU監控 線段樹維護歷史最值

bzoj3064 size define str highlight 難度 變化 觀察 font 題目描述 給你一個序列,支持4種操作:1.查詢區間最大值;2.查詢區間歷史最大值;3.區間加;4.區間賦值。 輸入 第一行一個正整數T,表示Bob需要監視CPU的總時間。

springspirng中的常用工具

ren handle file 監控 拷貝 trac convert cas har 一、概述   很多時候,很多工具類其實spring中就已經提供,常用的工具類有:     參考:https://www.cnblogs.com/langtianya/p/3875103

在Oracle Database 12.1 中異機遷移恢復數據庫實戰

異機恢復 oracle12c restore recover 平臺環境:源OS:Oracle Linux 7.3源DB:Oracle Database 12.1.0.2 目標OS:Oracle Linux 7.3目標DB:Oracle Database 12.1.0.2一、準備工作1、查詢當前

在Oracle12.1中使用NID 修改數據庫的DBID和DBName實戰

DBID DBName Nid 在異機恢復完成後,使用NID 修改數據庫的DBID和DBName,重新啟動數據庫。主要步驟如下:1、 開啟數據庫: SQL> startup ORA-32004: obsolete or deprecated parameter(s) specified fo