最近几天遇到一个网络指标的问题,容器的带宽指标比机器的带宽指标还高。进而定位到 hostnewrok 类型的容器的带宽是和主机一致。

以下是 chatgpt 的解释:

1
2
3
4
5
在Kubernetes中,hostNetwork类型的容器意味着容器共享主机的网络命名空间。这意味着容器将直接与主机网络接口(如eth0)通信,而不是通过虚拟网络接口(如veth)。因此,容器与主机共享相同的网络资源,包括带宽。

cAdvisor(Container Advisor)是一个用于监控容器资源使用情况和性能的工具。当它收集hostNetwork类型容器的网络指标时,由于容器使用的是主机网络接口,因此cAdvisor获取的容器带宽数字指标与主机网络设备的指标一致。

在这种情况下,要想更精确地衡量每个容器的网络使用情况,你可能需要采用其他方法,例如使用应用层面的监控工具,或者在容器内部收集网络流量数据。

那 cAdvisor 是如何读取的呢?

1
2
3
4
5
cat /proc/${container pid}/net/dev

# 一键命令
cat /proc/`docker inspect --format='{{ .State.Pid }}' "${container_name
or ID}"`/net/dev

附带一个不错的讲解基础 proc 子文件夹/子文件的博客