Docker 容器監控原理及 cAdvisor 的安裝與使用

富士康質檢員張全蛋發表於2020-11-17

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

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

  • 容器是短期存活的,並且可以動態排程
  • 容器的本質是程式,而不是一個完整作業系統
  • 由於容器非常輕量,容器的建立和銷燬也會比傳統虛擬機器更加頻繁

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

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

 

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

 

cAdvisor 的安裝與使用


下面我們以 cAdvisor 0.37.0 版本為例,演示一下 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 不僅可以監控容器的資源使用情況,還可以監控主機的資源使用情況。下面我們就先看下它是如何檢視主機資源使用情況的。

 

使用 cAdvisor 檢視主機監控


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

 

使用 cAdvisor 檢視容器監控


如果你想要檢視主機上執行的容器資源使用情況,可以訪問 http://localhost:8080/docker/,這個頁面會列出 Docker 的基本資訊和執行的容器情況,如下圖所示。

                                                                                                                         圖3 Docker 容器

在上圖中的 Subcontainers 下會列出當前主機上執行的所有容器,點選其中一個容器即可檢視該容器的詳細執行狀態,如下圖所示。

 總體來說,使用 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資料夾,可以看到很多目錄:

$ sudo ls -l /sys/fs/cgroup/
total 0

dr-xr-xr-x 5 root root  0 Jul  9 19:32 blkio
lrwxrwxrwx 1 root root 11 Jul  9 19:32 cpu -> cpu,cpuacct
dr-xr-xr-x 5 root root  0 Jul  9 19:32 cpu,cpuacct
lrwxrwxrwx 1 root root 11 Jul  9 19:32 cpuacct -> cpu,cpuacct
dr-xr-xr-x 3 root root  0 Jul  9 19:32 cpuset
dr-xr-xr-x 5 root root  0 Jul  9 19:32 devices
dr-xr-xr-x 3 root root  0 Jul  9 19:32 freezer
dr-xr-xr-x 3 root root  0 Jul  9 19:32 hugetlb
dr-xr-xr-x 5 root root  0 Jul  9 19:32 memory
lrwxrwxrwx 1 root root 16 Jul  9 19:32 net_cls -> net_cls,net_prio
dr-xr-xr-x 3 root root  0 Jul  9 19:32 net_cls,net_prio
lrwxrwxrwx 1 root root 16 Jul  9 19:32 net_prio -> net_cls,net_prio
dr-xr-xr-x 3 root root  0 Jul  9 19:32 perf_event
dr-xr-xr-x 5 root root  0 Jul  9 19:32 pids
dr-xr-xr-x 5 root root  0 Jul  9 19:32 systemd

 這些目錄代表了 Cgroups 的子系統,Docker 會在每一個 Cgroups 子系統下建立 docker 資料夾。這裡如果你對 Cgroups 子系統不瞭解的話,不要著急,這裡你只需要明白容器監控資料來源於 Cgroups 即可。

 

監控系統是如何獲取容器的記憶體限制的?


待續

相關文章