容器的特性
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上的相关文件并展示给用户了。