容器的特性
1. 短期存活,可以動態調度
2. 本質是進程,而不是一個完整的操作系統
3. 非常輕量,所以容器的創建和銷毀也會比傳統虛擬機更加頻繁
docker容器的監控方案
1. 自帶的docker stats 命令
2. 開源的解決方案:sysdig,cAdvisor,Prometheus
使用docker stats 監控演示
首先在主機上啟動一個資源限制為1核2G的nginx容器
命令
docker run --cpus=1 -m=2G --name=nginx nginx
使用docker stats 命令查看容器的資源使用狀態
docker stats nginx
狀態如下
這種方法的缺點很明顯,只能查詢本容器數據,而且不能查詢歷史數據。所以,通常不用這種方法監控容器
生產環境中,我們通常用cAdvisor這種方案來監控
cAdvisor是谷歌開源的一款通用容器監控解決方案
它有如下優勢:
1. 可以采集機器上所有運行的容器信息
2. 提供了基礎的查詢界面和HTTP接口
所以,cAdvisor很快成為了流行的容器監控指標中最常用的組件,並且k8s也集成了cAdvisor作為容器監控的默認工具。
cAdvisor的安裝與使用
這里用docker的方式進行安裝
訪問本地8080端口即可 。值得一提的是,cAdvisor不僅可以監控容器的資源使用情況,也可以監控主機的資源使用情況。
使用cAdvisor查看資源的使用情況
cAdvisor監控的特點
可以同時采集物理機容器的狀態
可以展示監控歷史數據
容器監控的原理
Docker是基於Namespace、Cgroups和聯合文件系統實現的
Cgroups不僅可以用於容器資源的限制,還可以提供容器的資源使用率。不管用什么監控方案,底層數據都來源於Cgroups
Cgroups的工作目錄 /sys/fs/cgroup 下包含了Cgroups的所有內容。Cgroups包含了很多子系統,可以對CPU,內存,PID,磁盤IO等資源進行限制和監控。
查看 /sys/fs/cgroup 文件夾
每一個文件夾都代表了Cgroups的子系統,docker會在Cgroups的子系統下創建docker文件夾。
以memory子系統為例介紹監控組件獲取到容器的資源和使用狀態的原理
在主機上啟動一個資源限制為1核2G的tomcat容器
docker run -d --cpus=1 -m=4G --name=tomcat tomcat 666502d11f739b135731de20fc2e86320f339009bc24d5690fd35987ded645ac
容器會在/sys/fs/cgroups/memory/docker 下創建以容器ID命名的文件夾
查看/sys/fs/cgroups/memory/docker文件夾
進入以該容器ID命名的文件夾
cd 666502d11f739b135731de20fc2e86320f339009bc24d5690fd35987ded645ac/
查看該文件夾下的內容
memory.limit_in_bytes 文件就是存放內存總量信息的文件
使用cat命令查看文件內容
cat memory.limit_in_bytes 4294967296
單位為byte,換算后大約為4G
內存使用情況存在 memory.usage_in_bytes 文件里,查看該文件
cat memory.usage_in_bytes 65040384
換算后大約62Mb
下面看下網絡監控的數據來源
監控數據是在/proc/PID/net/dev/下
使用docker inspect 命令查看tomcat容器的PID
docker inspect tomcat | grep Pid "Pid": 16667, "PidMode": "", "PidsLimit": null,
得知tomcat容器的PID是16667
查看/proc/16667/net/dev文件
cat /proc/16667/net/dev Inter-| Receive | Transmit face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed eth0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 lo: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
現在我們已經知道,容器的監控原理就是定時讀取linux上的相關文件並展示給用戶了。