使用 Metricbeat 掌握 Infrastructure 的健康狀態 Docker 篇
Last updated
Last updated
如何使用 Docker 來佈署 Metricbeat
使用 Metricbeat 在 Docker 環境中,如何取得宿主實體機器或是整體 Docker Containers 的系統 Metrics
如何透過 Metricbeat 輕鬆的來掌握 Docker 環境內的各 Containers 運作服務的健康狀態
這篇要介紹的主題是 Docker ,因此這邊我們先來介紹如何使用 Docker 來部署 Metricbeat。[1]
Elastic 官方在 發佈了兩種版本的 Metricbeat Docker Image,底層是使用 CentOS 7。
beats/metricbeat
beats/metricbeat-oss
差別是什麼,老實說我稍微查了一下找不出差異,官方說授權的部份參考 頁面,不過裡面針對 Metricbeat 的部份沒有描述到不同,不過大概可以確定的是 X-Pack 基本上是 Elastic License 的功能,所以 OSS 這個 Open Source 的版本應該是沒有 X-Pack 的功能的,至於其他的部份可能要再另外深入挖掘才知道。
不過由於 Elastic License 目前已經很寬鬆了,除了是要提供 SaaS 的服務,不然不太會踩到 License 的問題,接下來會用一般 Elastic License 的版本來操作。
可以透過 docker pull
取得 Docker Image,讓這個 image 下載到本機端。
由於 Metricbeat 在第一次運行之前,我們會需要執行下面兩個動作:
在 Elasticsearch 設定好 Metricbeat 要使用的 Index Template
在 Kibana 匯入 Metricbeat 內建好的 Dashboard
這兩動作我們需要執行 ./metricbeat setup
的使令,所以在 Docker 的環境中,我們也要先單獨執行一次這個指令:
這邊的 kibana:5601
與 elasticsearch:9200
的位置,要自己視情況修改成正確的 Kibana 與 Elasticsearch 的位置。
要開始運作 Metricbeat 也就是執行 docker run
並執行 metricbeat -e
的 Command:
啟動時有幾個參數可能會需要設置:
--user=root
: 如果有使用 System Module 時,有些 socket 或是 system process 的資訊,會需要有足夠的權限才能存取,這部份的權限管理會需要留意。
--volume
: 若是有獨立準備 metricbeat.yml
的 config 檔,會需要 mount 到 /usr/share/metricbeat/metricbeat.yml
的路徑上。
-E coutput.elasticsearch.hosts=
: 如果沒有在 metricbeat.yml
特別設定,要使用環境變數指定 Elasticsesarch 的位置時,也要記得加上。
--net=
: 如果有要透過 Metricbeat 去收集其他運作在 Docker Container 內服務的 Metrics,要記得 Network 的部份能夠存取得到。
使用 Metricbeat 運行在 Docker Container 之中時,一般會有三大類要收集的 Metrics:
運行 Container 的實體主機的 System Metrics
每個 Docker Containers 的系統 Metrics
其他 Docker Containers 的服務 Metrics
以下我們分別來說明這些配置上的方式。
由於 System Module 針對不同的 Metricset 會從幾個不同的系統位置取得資訊:
/proc
: System Module 的許多資訊其實是來自這個 Linux proc filesystem 的位置。
/sys/fs/cgroup
: System process 的 metricset 會從這個位置取得 process 的資訊。
/proc/net/dev
: System network 的 metricset 會從這個位置取得網路的資訊。
因此我們會需要將這些主機實體位置,mount 到 Docker container 之中,讓運作在 Docker container 內的 Metricbeat 可以存取得到實體主機的這些資訊。
上面的例子是把這些路徑都 mount 在 container 內的 /hostfs
裡,並且在取後執行 metricbeat
時,加上參數指定這個位置 -system.hostfs=/hostfs
另外如果有使用 System socket 的 metricset 時,因為需要較高的權限,我們會需要特別加上 sys_ptrace
與 dac_read_search
的 System capability。
這邊要注意,上面提到的
/proc
、/sys
、System capabilies…等設定是針對 Linux 環境,不適用於 Windows 或 MacOS。
要使用 Metricbeat 來取得 Docker Containers 的資訊時,我們要使用的是 Metricbeat 裡的 Docker module。
並且在要在 metricbeat.yml
裡,設定要收集的 docker metricsets,以及相關的配置。
這邊要注意到,由於 docker module 會透過 /var/run/docker.sock
與 docker 溝通,所以我們如果是運行在 Docker container 內的 Metricbeat,我們也會需要把實體主機的 /var/run/docker.sock
mount 到 docker container 內,讓 Metricbeat 可以存取得到。
要使用 Metricbeat 取得其他 Dockre Containre 所運作的服務的 Metrics 時,可以直接指定網路的位置,並且指定在相同的 docker network,讓 Metricbeat 可以存取得到其他服務,或是可以使用 Metricbeat 的 Autodiscover 功能。
由於在 Container 的環境之中,機器可能會時常開關,能夠動態的自動監控 Container 會比較實用,因此我們也就會以 Autodiscover 的介紹為主。
Metricbeat 的 Autodiscover 有支援兩種 Provider - Docker
與 Kubernetes
,這篇會以 Docker 為主要說明。
Docker event 的資訊如下:
這邊可以用來當篩選條件的欄位也就是:
host
port
docker.container.id
docker.container.image
docker.container.name
docker.container.labels
接下來是要在 metricbeat.yml
當中,設定 Autodiscover,並且依照上面提到的篩選條件,來設定 condition
,決定哪些 container 是我們的目標對象。
以上面的例子,目標是只要 Docker Image 是使用 redis
的 containers,就會是我們 auto discover 的目標,並且會 Redis module 來收集這些 containers 裡的資訊,相關的 Redis module 的設定,也會在 config
裡面去指定。
如此一來,在使用 Docker 動態增加或減少特定服務的 containers 時,我們的 Metricbeat 就會自動的去監控並收集 Metrics 的資訊了。
Autodiscover 除了上述的使用 Docker event 方式來篩選之外,有提供針對 Docker Label
的標示來判定是否要監控的機制。
要啟用這項功能,要把 hints.enabled: true
打開。
並且當我們要運作一個 Docker Container 時,就可以指定 Autodiscover 定義好的標籤 co.elastic.metrics
,讓 Metricbeat 能認得這些 Containers。
以下是 Nginx 的一個例子:
另外這是 Apache Server 的例子,並且實際用 Docker Run 時,如何加上標籤:
當 Metricbeat 把 Docker Container 相關的資訊開始進行收集後,我們就可以到 Kibana Observability 裡的 Metrics Inventory 頁面,並且選擇 Docker Containers
的呈現方式,來檢視 Docker Containers 裡的各項服務的狀態了。
由於 Docker provider 會監聽 [3],在 Docker Container start
或 stop
的時候,去更新需監控機器的列表,因此相關設定上,可以依照 Docker event 的資訊來進行篩選條件的設置,來決定哪些 container 要套用設定。
Kibana Metrics 這邊的操作,可以參考前一篇 的介紹,這部份的差異不大,主要是 Docker 會有些特別針對 Docker 環境的數據檢視方式,這部份有興趣的讀者可以再去探索看看。