監(jiān)控原理
Docker 是基于 Namespace喻括、Cgroups 和聯(lián)合文件系統(tǒng)實現(xiàn)的焦读。其中 Cgroups 不僅可以用于容器資源的限制达布,還可以提供容器的資源使用率宏悦,無論何種監(jiān)控方案的實現(xiàn)骇窍,底層數據都來源于
Cgroups
瓜晤。
Cgroups 的工作目錄為/sys/fs/cgroup
,該目錄下包含了 Cgroups 的所有內容腹纳,Cgroups 包含很多子系統(tǒng)痢掠,可以用來對不同的資源進行限制,例如對 CPU嘲恍、內存足画、PID、磁盤IO 等資源進行限制和監(jiān)控佃牛。
總的來說淹辞,容器的監(jiān)控原理其實就是定時讀取 Linux 主機上相關文件并展示給用戶。
獲取容器指標信息
以下說明下監(jiān)控組件是如何獲取到容器的資源限制和使用狀態(tài)的:
### 運行后的容器ID為:51041a74070e9260e82876974762b8c61c5ed0a51832d74fba6711175f89ede1
$ docker run --cpus=1 --memory=2g --name=nginx -d nginx
### Docker會在/sys/fs/cgroup/memory/docker目錄下以容器ID為名稱創(chuàng)建對應的文件夾
$ ls -l /sys/fs/cgroup/memory/docker/51041a74070e9260e82876974762b8c61c5ed0a51832d74fba6711175f89ede1
total 0
-rw-r--r-- 1 root root 0 Sep 2 15:21 cgroup.clone_children
--w--w--w- 1 root root 0 Sep 2 15:13 cgroup.event_control
-rw-r--r-- 1 root root 0 Sep 2 15:12 cgroup.procs
-rw-r--r-- 1 root root 0 Sep 2 15:12 memory.failcnt
--w------- 1 root root 0 Sep 2 15:21 memory.force_empty
......
### memory.limit_in_bytes 文件代表該容器內存限制大小俘侠,單位為 byte
$ cat /sys/fs/cgroup/memory/docker/51041a74070e9260e82876974762b8c61c5ed0a51832d74fba6711175f89ede1/memory.limit_in_bytes
2147483648
### 網絡的監(jiān)控數據來源是從 /proc/{Pid}/net/dev 目錄下讀取的
$ docker inspect nginx | grep Pid
"Pid": 27348,
"PidMode": "",
"PidsLimit": 0,
### 根據Pid去獲取該容器的每一個網卡的流量接收和發(fā)送情況象缀,以及錯誤數彬向、丟包數等信息
$ cat /proc/27348/net/dev
Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
lo: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
eth0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
監(jiān)控方案
生產環(huán)境中,監(jiān)控容器的狀態(tài)十分重要攻冷,通過監(jiān)控可以隨時掌握容器的運行狀態(tài)娃胆,做到線上隱患和問題早發(fā)現(xiàn),早解決等曼。而 Docker 容器的監(jiān)控方案有很多里烦,除了自帶的
docker stats
命令,還有很多開源的解決方案禁谦,例如sysdig
胁黑、cAdvisor
、Prometheus
等州泊。
內置命令
使用 Docker 自帶的
docker stats
命令丧蘸,可以方便地看到主機上所有容器的 CPU、內存遥皂、網絡IO力喷、磁盤IO、PID 等資源的使用情況演训,但是它只能獲取本機數據弟孟,而且無法查看歷史監(jiān)控數據,也沒有可視化展示面板样悟。命令示范如下:
$ docker run --cpus=2 --memory=4g --name=nginx -d nginx
$ docker stats nginx
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
nginx 18.70% 2.088 GiB / 4 GiB 52.2% 0 B / 0 B 256 MB / 266 MB 357
cAdvisor
cAdvisor 是谷歌開源的一款通用的容器監(jiān)控解決方案拂募,它不僅可以采集機器上所有運行的容器信息,還提供了基礎的查詢界面和 HTTP 接口窟她,更方便與外部系統(tǒng)結合陈症。所以,cAdvisor 很快成了容器指標監(jiān)控最常用組件震糖,并且 Kubernetes 也集成了 cAdvisor 作為容器監(jiān)控指標的默認工具录肯。
總體來說,使用 cAdvisor 監(jiān)控容器具有以下特點:
● 可以同時采集物理機和容器的狀態(tài)试伙;
● 可以展示監(jiān)控歷史數據嘁信。