Lens/OpenLens中Pod内存与容器内存差异及模拟命令咨询
单容器Pod内存与容器内存数值差异解析及数据模拟方法
差异原因
OpenLens展示的两个内存统计维度核心区别在于统计范围:
- Pod内存:统计的是整个Pod对应的cgroup层级的总内存使用,包含:
- 业务容器的内存开销
- Kubernetes默认创建的pause容器内存(即使你在Pod容器列表中看不到,Kubernetes会自动为每个Pod创建该容器用于网络命名空间管理)
- Pod级cgroup自身的内核内存开销(如页表、slab分配的内核内存)
- 关联的内存缓存(page cache)和swap使用(如果开启)
- 容器内存:仅统计单个业务容器的cgroup内存使用,对应你用
kubectl top pod --containers或cat /sys/fs/cgroup/memory.current获取的数值,只包含容器进程本身的内存占用。
你遇到的4.9G vs 2.5G的差异,大概率是Pod级cgroup包含了pause容器、内核内存开销以及缓存,而容器内存只统计了业务进程的实际使用内存。
模拟Pod内存图表数据的命令方法
要获取和OpenLens「Pod内存」一致的数据,需要直接读取Pod对应的顶级cgroup内存统计:
获取Pod所在节点及UID:
# 获取Pod所在节点 kubectl get pod <POD_NAME> -n <NAMESPACE> -o jsonpath='{.spec.nodeName}' # 获取Pod的UID kubectl get pod <POD_NAME> -n <NAMESPACE> -o jsonpath='{.metadata.uid}'登录目标节点,找到Pod的cgroup路径(以默认systemd cgroup驱动为例):
路径格式为/sys/fs/cgroup/memory/kubepods.slice/kubepods-<QOS_CLASS>.slice/kubepods-<QOS_CLASS>-pod<POD_UID>.slice
QOS_CLASS一般是besteffort、burstable或guaranteed,可通过kubectl describe pod <POD_NAME> -n <NAMESPACE>查看。读取总内存使用:
# 内核5.1+版本使用memory.current,旧版本用memory.usage_in_bytes cat /sys/fs/cgroup/memory/kubepods.slice/kubepods-<QOS_CLASS>.slice/kubepods-<QOS_CLASS>-pod<POD_UID>.slice/memory.current # 或 cat /sys/fs/cgroup/memory/kubepods.slice/kubepods-<QOS_CLASS>.slice/kubepods-<QOS_CLASS>-pod<POD_UID>.slice/memory.usage_in_bytes(可选)查看内存细分项验证差异:
读取memory.stat可查看Pod级cgroup的内存构成,明确缓存、rss等细分数值:cat /sys/fs/cgroup/memory/kubepods.slice/kubepods-<QOS_CLASS>.slice/kubepods-<QOS_CLASS>-pod<POD_UID>.slice/memory.stat
内容的提问来源于stack exchange,提问作者CyberL
相关产品推荐
相关产品推荐

