Docker 容器监控原理及 cAdvisor的安装与使用说明

Docker 容器监控原理及 cAdvisor的安装与使用说明,第1张

Docker容器监控原理及cAdvisor的安装与使用说明

本文主要介绍Docker容器监控的原理和cAdvisor的安装使用说明,有很好的参考价值,希望对大家有所帮助。来和边肖一起看看吧。

在生产环境中监控容器的运行状态非常重要。通过监控,可以随时了解集装箱的运行状态,从而及早发现和解决线上隐患和问题。

所以今天我就和大家分享一下关于集装箱监控的知识(原理和工具cAdvisor)。

虽然传统的物理机和虚拟机监控已经有了相对成熟的监控方案,但是容器的监控面临着更大的挑战,因为容器的行为和性质不同于传统的虚拟机。一般来说,容器具有以下特征:

容器是短暂的,可以动态调度。

容器的本质是一个进程,不是一个完整的 *** 作系统。

因为容器是非常轻量级的,所以它们比传统的虚拟机更频繁地被创建和销毁。

码头集装箱有多种监控方案。除了Docker自带的dockerstats命令,还有很多开源的解决方案,比如sysdig、cAdvisor、Prometheus等。,是优秀的监控工具。

让我们首先来看看如何使用docker自带的dockerstats命令,在没有任何外部工具的情况下监控容器。

使用dockerstats命令

使用dockerstats命令可以很容易地看到主机上所有容器的CPU、内存、网络IO、磁盘IO、PID等资源的使用情况。下面我们来看看具体 *** 作。

首先,使用以下命令在主机上启动一个nginx容器,资源限制为1个核心和2G:

$dockerrun-CPU=1-m=2g-name=nginx-dnginx

容器启动后,可以使用dockerstats命令查看容器的资源使用状态:

$dockerstatsnginx

通过dockerstats命令,您可以看到容器的运行状态,如下所示:

容器CPU%MEM使用率/限制MEM%净I/O块I/OPIDS

f742a467B6d80.00%1.387MiB/2GiB0.07%656B/656B0B/9.22kB2

从容器的运行状态可以看出,dockerstats命令确实可以获取并显示docker容器的运行状态。但它的缺点也很明显,因为只能获取本地数据,无法查看历史监测数据,没有可视化显示面板。

因此,在生产环境中,我们通常使用另一种容器监控解决方案cAdvisor。

cAdvisor

CAdvisor是Google的一个通用容器监控解决方案。CAdvisor不仅可以收集机器上运行的所有容器的信息,还提供了基本的查询接口和HTTP接口,更方便与外部系统结合。因此,cAdvisor很快成为集装箱监控最常用的组件,Kubernetes也集成了cAdvisor作为集装箱监控指标的默认工具。

cadvisor的安装和使用

下面以CADvisor0.37.0版本为例,演示cAdvisor的安装和使用。

CAdvisor官方提供了Docker图片,我们只需要拉图片就可以启动了。

因为cAdvisor的图像存储在Google的gcr.io图像仓库中,在国内无法访问。在这里,我将输入的图像放在DockerHub中。您可以使用DockerPullLagoudoker/CAdvisor:v0.37.0命令从DockerHub进行拉取。

首先,使用以下命令启动cAdvisor:

$dockerrun\ --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/address,可以在首页看到主机的资源使用情况,包括CPU、内存、文件系统、网络等资源,如下图所示。

使用cAdvisor查看容器监控

如果想查看主机上运行的容器资源的使用情况,可以访问http://localhost:8080/Docker/。该页面将列出Docker和正在运行的容器的基本信息,如下图所示。

在上图中,当前主机上运行的所有容器都列在子容器下。单击其中一个容器,查看该容器的详细运行状态,如下图所示。

一般来说,使用cAdvisor监控容器具有以下特点:

可以同时收集物理机器和容器的状态。

可以显示监控历史数据。

了解了Docker的监测工具,想问一下,这些监测数据是怎么来的?我给你演示一下集装箱监控的原理。

监控原则

我们知道Docker是基于名称空间、Cgroups和联邦文件系统实现的。其中,Cgroups不仅可以用来限制容器的资源,还可以提供容器的资源利用率。无论实现哪种监控方案,底层数据都来自Cgroups。

Cgroups的工作目录是/sys/fs/cgroup,/sys/fs/cgroup目录包含了Cgroups的所有内容。Cgroups包含许多子系统,可以用来限制不同的资源。比如CPU、内存、PID、磁盘IO等资源的限制和监控。

为了了解更多关于Cgroups子系统的信息,我们可以通过使用ls-l命令查看/sys/fs/cgroup文件夹来查看许多目录:

$sudols-l/sys/fs/cgroup/ total0 dr-xr-xr-x5rootroot0Jul919:32blkio lrwxrwxrwx1rootroot11Jul919:32cpu->cpu,cpuacct dr-xr-xr-x5rootroot0Jul919:32cpu,cpuacct lrwxrwxrwx1rootroot11Jul919:32cpuacct->cpu,cpuacct dr-xr-xr-x3rootroot0Jul919:32cpuset dr-xr-xr-x5rootroot0Jul919:32devices dr-xr-xr-x3rootroot0Jul919:32freezer dr-xr-xr-x3rootroot0Jul919:32hugetlb dr-xr-xr-x5rootroot0Jul919:32memory lrwxrwxrwx1rootroot16Jul919:32net_cls->net_cls,net_prio dr-xr-xr-x3rootroot0Jul919:32net_cls,net_prio lrwxrwxrwx1rootroot16Jul919:32net_prio->net_cls,net_prio dr-xr-xr-x3rootroot0Jul919:32perf_event dr-xr-xr-x5rootroot0Jul919:32pids dr-xr-xr-x5rootroot0Jul919:32systemd

这些目录代表了Cgroups的子系统,docker会在每个Cgroups子系统下创建Docker文件夹。如果您不了解这里的Cgroups子系统,不要担心。您只需要知道容器监控数据来自Cgroups。

监控系统如何获取容器的内存限制?

我们以内存子系统(内存子系统是Cgroups众多子系统中的一个,主要用于限制内存使用)为例,来说明监控组件如何获取容器的资源限制和使用状态(即容器的内存限制)。

首先,我们使用以下命令在主机上启动一个nginx容器,资源限制为1个核心和2G:

$dockerrun-name=nginx-CPU=1-m=2g-name=nginx-dnginx

##这里的输出是容器ID

51041a74070e9260e82876974762b8c61c5ed0a51832d74FBA6711175f89ede1

注意:如果您已经创建了一个名为nginx的容器,请先使用dockerrm-fnginx命令删除现有的nginx容器。

容器启动后,我们可以通过命令行的输出得到容器的ID。同时,Docker会在/sys/fs/cgroup/memory/docker目录下的容器ID名称下创建相应的文件夹。

让我们来看看目录/sys/fs/cgroup/memory/docker中的文件:

$sudols-l/sys/fs/cgroup/memory/docker total0 drwxr-xr-x2rootroot0Sep215:1251041a74070e9260e82876974762b8c61c5ed0a51832d74fba6711175f89ede1 -rw-r--r--1rootroot0Sep214:57cgroup.clone_children --w--w--w-1rootroot0Sep214:57cgroup.event_control -rw-r--r--1rootroot0Sep214:57cgroup.procs -rw-r--r--1rootroot0Sep214:57memory.failcnt --w-------1rootroot0Sep214:57memory.force_empty -rw-r--r--1rootroot0Sep214:57memory.kmem.failcnt -rw-r--r--1rootroot0Sep214:57memory.kmem.limit_in_bytes -rw-r--r--1rootroot0Sep214:57memory.kmem.max_usage_in_bytes -r--r--r--1rootroot0Sep214:57memory.kmem.slabinfo -rw-r--r--1rootroot0Sep214:57memory.kmem.tcp.failcnt -rw-r--r--1rootroot0Sep214:57memory.kmem.tcp.limit_in_bytes -rw-r--r--1rootroot0Sep214:57memory.kmem.tcp.max_usage_in_bytes -r--r--r--1rootroot0Sep214:57memory.kmem.tcp.usage_in_bytes -r--r--r--1rootroot0Sep214:57memory.kmem.usage_in_bytes -rw-r--r--1rootroot0Sep214:57memory.limit_in_bytes -rw-r--r--1rootroot0Sep214:57memory.max_usage_in_bytes -rw-r--r--1rootroot0Sep214:57memory.memsw.failcnt -rw-r--r--1rootroot0Sep214:57memory.memsw.limit_in_bytes -rw-r--r--1rootroot0Sep214:57memory.memsw.max_usage_in_bytes -r--r--r--1rootroot0Sep214:57memory.memsw.usage_in_bytes -rw-r--r--1rootroot0Sep214:57memory.move_charge_at_immigrate -r--r--r--1rootroot0Sep214:57memory.numa_stat -rw-r--r--1rootroot0Sep214:57memory.oom_control ----------1rootroot0Sep214:57memory.pressure_level -rw-r--r--1rootroot0Sep214:57memory.soft_limit_in_bytes -r--r--r--1rootroot0Sep214:57memory.stat -rw-r--r--1rootroot0Sep214:57memory.swappiness -r--r--r--1rootroot0Sep214:57memory.usage_in_bytes -rw-r--r--1rootroot0Sep214:57memory.use_hierarchy -rw-r--r--1rootroot0Sep214:57notify_on_release -rw-r--r--1rootroot0Sep214:57tasks

您可以看到Docker已经创建了一个名为containerID的目录。让我们使用ls命令来检查这个目录的内容:

$sudols-l/sys/fs/cgroup/memory/docker/51041a74070e9260e82876974762b8c61c5ed0a51832d74fba6711175f89ede1 total0 -rw-r--r--1rootroot0Sep215:21cgroup.clone_children --w--w--w-1rootroot0Sep215:13cgroup.event_control -rw-r--r--1rootroot0Sep215:12cgroup.procs -rw-r--r--1rootroot0Sep215:12memory.failcnt --w-------1rootroot0Sep215:21memory.force_empty -rw-r--r--1rootroot0Sep215:21memory.kmem.failcnt -rw-r--r--1rootroot0Sep215:12memory.kmem.limit_in_bytes -rw-r--r--1rootroot0Sep215:21memory.kmem.max_usage_in_bytes -r--r--r--1rootroot0Sep215:21memory.kmem.slabinfo -rw-r--r--1rootroot0Sep215:21memory.kmem.tcp.failcnt -rw-r--r--1rootroot0Sep215:21memory.kmem.tcp.limit_in_bytes -rw-r--r--1rootroot0Sep215:21memory.kmem.tcp.max_usage_in_bytes -r--r--r--1rootroot0Sep215:21memory.kmem.tcp.usage_in_bytes -r--r--r--1rootroot0Sep215:21memory.kmem.usage_in_bytes -rw-r--r--1rootroot0Sep215:12memory.limit_in_bytes -rw-r--r--1rootroot0Sep215:12memory.max_usage_in_bytes -rw-r--r--1rootroot0Sep215:21memory.memsw.failcnt -rw-r--r--1rootroot0Sep215:12memory.memsw.limit_in_bytes -rw-r--r--1rootroot0Sep215:21memory.memsw.max_usage_in_bytes -r--r--r--1rootroot0Sep215:21memory.memsw.usage_in_bytes -rw-r--r--1rootroot0Sep215:21memory.move_charge_at_immigrate -r--r--r--1rootroot0Sep215:21memory.numa_stat -rw-r--r--1rootroot0Sep215:13memory.oom_control ----------1rootroot0Sep215:21memory.pressure_level -rw-r--r--1rootroot0Sep215:21memory.soft_limit_in_bytes -r--r--r--1rootroot0Sep215:21memory.stat -rw-r--r--1rootroot0Sep215:21memory.swappiness -r--r--r--1rootroot0Sep215:12memory.usage_in_bytes -rw-r--r--1rootroot0Sep215:21memory.use_hierarchy -rw-r--r--1rootroot0Sep215:21notify_on_release -rw-r--r--1rootroot0Sep215:21tasks

从上面可以看出,容器ID的目录下有很多文件,其中memory.limit_in_bytes文件表示容器的内存限制大小,单位是字节。让我们使用cat命令(cat命令可以查看文件内容)来检查文件内容:

$sudocat/sys/fs/cgroup/memory/docker/51041a74070e9260e82876974762b8c61C5ed0a51832d74FBA6711175f89ede1/memory.limit_in_bytes

2147483648

这里可以看到memory.limit_in_bytes的值是2147483648,换算单位后正好是2G,符合我们启动容器时2G的内存限制。

通过内存子系统的例子,我们可以知道,监控组件可以通过读取memory.limit_in_bytes文件来获取容器内存的极限值。了解了容器的内存限制之后,我们再来看看容器的内存使用情况。

$sudo/sys/fs/cgroup/memory/docker/51041a74070e9260e82876974762b8c61C5ed0a51832d74FBA6711175f89ede1/memory.usage_in_bytes

4259840

可以看到当前内存使用大小是4259840byte,大概是4m左右,了解内存的监控。

我们来看看网络的监控数据源

网络的监控数据源从/proc/{PID}/net/dev目录中读取,其中PID是主机上容器的进程ID。让我们首先使用dockerinspect命令来检查上面开始的nginx容器的PID。该命令如下所示:

$dockerinspectnginx|grepPid "Pid":27348, "PidMode":"", "PidsLimit":0,

可以看到容器的PID是27348。使用cat命令检查/proc/27348/net/dev的内容。

$sudocat/proc/27348/net/dev Inter-|Receive|Transmit face|bytespacketserrsdropfifoframecompressedmulticast|bytespacketserrsdropfifocollscarriercompressed lo:0000000000000000 eth0:0000000000000000

文件/proc/27348/net/dev记录了容器中每个网卡的流量接收和发送,以及错误数量、丢包等信息。集装箱的可视网络监控数据从这里定期读取和显示。

综上所述,容器的监控原理其实就是定时读取Linux主机上的相关文件,展示给用户。

结论

k8s之后使用Metricsserve,cAdvisor提供底层数据,metrics-server的底层数据源是cAdvisor。

CAdvisor提供监测数据,Prometheus负责收集数据。这两个功能是不同的。通常,cAdvisor在生产集群中与Prometheus一起使用。

以上Docker集装箱监控原理和cAdvisor的安装使用说明都是边肖分享的内容。希望给大家一个参考,支持我们。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/774136.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-03
下一篇 2022-05-03

发表评论

登录后才能评论

评论列表(0条)

保存