生產環境中監控容器的執行狀況十分重要,通過監控我們可以隨時掌握容器的執行狀態,做到線上隱患和問題早發現,早解決。所以今天我就和你分享關於容器監控的知識(原理及工具 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 到底是什麼?它是構建 ...