08 容器監控原理及 cAdvisor

2021-10-24 14:30:02 字數 2822 閱讀 8760

生產環境中監控容器的執行狀況十分重要,通過監控我們可以隨時掌握容器的執行狀態,做到線上隱患和問題早發現,早解決。所以今天我就和你分享關於容器監控的知識(原理及工具 cadvisor)。

雖然傳統的物理機和虛擬機器監控已經有了比較成熟的監控方案,但是容器的監控面臨著更大的挑戰,因為容器的行為和本質與傳統的虛擬機器是不一樣的,總的來說,容器具有以下特性:

docker 容器的監控方案有很多,除了 docker 自帶的docker stats命令,還有很多開源的解決方案,例如 sysdig、cadvisor、prometheus 等,都是非常優秀的監控工具。

下面我們首先來看下,不借助任何外部工具,如何用 docker 自帶的docker stats命令實現容器的監控。

使用 docker 自帶的docker stats命令可以很方便地看到主機上所有容器的 cpu、記憶體、網路 io、磁碟 io、pid 等資源的使用情況。下面我們可以具體操作看看。

首先在主機上使用以下命令啟動乙個資源限制為 1 核 2g 的 nginx 容器

docker run --cpus=1 -m=2g --name=nginx  -d nginx
容器啟動後,可以使用docker stats命令檢視容器的資源使用狀態:

$ docker stats nginx
通過docker stats命令可以看到容器的執行狀態如下:

container           cpu %               mem usage / limit   mem %               net i/o             block i/o           pids

f742a467b6d8 0.00% 1.387 mib / 2 gib 0.07% 656 b / 656 b 0 b / 9.22 kb 2

從容器的執行狀態可以看出,docker stats命令確實可以獲取並顯示 docker 容器執行狀態。但是它的缺點也很明顯,因為它只能獲取本機資料,無法檢視歷史監控資料,沒有視覺化展示面板。

因此,生產環境中我們通常使用另一種容器監控解決方案 cadvisor。

cadvisor 是谷歌開源的一款通用的容器監控解決方案。cadvisor 不僅可以採集機器上所有執行的容器資訊,還提供了基礎的查詢介面和 http 介面,更方便與外部系統結合。所以,cadvisor很快成了容器指標監控最常用元件,並且 kubernetes 也整合了 cadvisor 作為容器監控指標的預設工具。

cadvisor 官方提供了 docker 映象,我們只需要拉取映象並且啟動映象即可。

由於 cadvisor 映象存放在谷歌的 gcr.io 映象倉庫中,國內無法訪問到。這裡我把打好的映象放在了 docker hub。你可以使用 docker pull lagoudocker/cadvisor:v0.37.0 命令從 docker hub 拉取。

首先使用以下命令啟動 cadvisor:

$ 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 \

--publish=8080:8080 \

--detach=true \

--name=cadvisor \

--privileged \

--device=/dev/kmsg \

lagoudocker/cadvisor:v0.37.0

此時,cadvisor 已經成功啟動,我們可以通過訪問 http://localhost:8080 訪問到 cadvisor 的 web 介面。

cadvisor 不僅可以監控容器的資源使用情況,還可以監控主機的資源使用情況。下面我們就先看下它是如何檢視主機資源使用情況的。

使用 cadvisor 檢視主機監控

訪問 http://localhost:8080/containers/ 位址,在首頁可以看到主機的資源使用情況,包含 cpu、記憶體、檔案系統、網路等資源,如下圖所示。

使用 cadvisor 檢視容器監控

總體來說,使用 cadvisor 監控容器具有以下特點:

了解 docker 的監控工具,你是否想問,這些監控資料是怎麼來的呢?下面我就帶你了解一下容器監控的原理。

監控原理

我們知道 docker 是基於 namespace、cgroups 和聯合檔案系統實現的。其中 cgroups 不僅可以用於容器資源的限制,還可以提供容器的資源使用率。無論何種監控方案的實現,底層資料都**於 cgroups。

cgroups 的工作目錄為/sys/fs/cgroup,/sys/fs/cgroup目錄下包含了 cgroups 的所有內容。cgroups包含很多子系統,可以用來對不同的資源進行限制。例如對cpu、記憶體、pid、磁碟 io等資源進行限制和監控。

為了更詳細的了解 cgroups 的子系統,我們通過 ls -l 命令檢視/sys/fs/cgroup資料夾,可以看到很多目錄:

總結一下,容器的監控原理其實就是定時讀取 linux 主機上相關的檔案並展示給使用者。

docker inspect : 獲取容器/映象的元資料。

STL容器底層原理及容器操作總結

最近在總結c 的一些知識,所有內容都來自 vector vector的資料結構 單向開口線性連續空間。迭代器就是乙個普通指標,random access iterator 注意 對vector的任何操作,一旦引起空間重新配置,指向原vector的所有迭代器就都失效了。list list的資料結構 l...

C 容器及選用

一 stl容器 1 list 鍊錶 記憶體不連續,任何位置高校插入刪除 2 vector 陣列 記憶體連續,只有在尾部插入時,不用移動元素,隨機訪問 3 deque 雙端佇列 兩端插入刪除效率高,但是中間的操作代價較大,隨機訪問 注 若要經常在中間插入刪除 list 若經常隨機訪問,vector和d...

Docker 工作原理及容器化簡易指南

docker 非常棒!它使軟體開發者無需擔心配置和依賴性,在任何地方打包,傳送和執行他們的應用程式。而在與 kubernetes 相結合後,它使應用集群部署和管理變得更方便。這使得 docker 深受軟體開發者的喜愛,越來越多的開發者開始使用 docker。那麼 docker 到底是什麼?它是構建 ...