我有一个单节点 Kubernetes 集群,指标服务器报告的内存使用情况似乎与命令显示的内存使用情况free
不同
# kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
<node_ip> 1631m 10% 13477Mi 43%
# free -m
total used free shared buff/cache available
Mem: 32010 10794 488 81 20727 19133
Swap: 16127 1735 14392
并且差异很大~3 GB。
我也在 3 节点集群上进行了测试,并且也存在此问题:
# kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
<node_ip1> 1254m 8% 26211Mi 84%
<node_ip2> 221m 1% 5021Mi 16%
<node_ip3> 363m 2% 8731Mi 28%
<node_ip4> 1860m 11% 20399Mi 66%
# free -m (this is on node 1)
total used free shared buff/cache available
Mem: 32010 5787 369 1676 25853 24128
Swap: 16127 0 16127
为什么会有差异呢?
答案1
让我们首先了解这两个命令的工作原理。
自由的- 显示系统中可用和已用内存的数量
Kubectl 顶部- 允许您查看节点或 pod 的资源消耗情况。
有一个文章解释为什么你可能会看到差异:
大多数容器特定指标都可通过 cgroup 文件系统
/path/to/cgroup/memory.stat
、/path/to/cgroup/memory.usage_in_bytes
和/path/to/cgroup/memory.limit_in_bytes
其他方式获取。大多数提供系统资源指标的 Linux 工具都是在cgroups
存在之前创建的。它们通常从 procfilesystem: /proc/meminfo
、/proc/vmstat
和/proc/PID/smaps
其他方式读取内存指标。
此外,交换部分(如@uav 所述)应该触发红灯,因为您必须禁用它才能使 kubelet 正常工作。它是先决条件用于安装 kubeadm。
我希望它有帮助。