kubectl top 命令输出与 Linux free 命令不匹配

kubectl top 命令输出与 Linux free 命令不匹配

我有一个单节点 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 存在之前创建的。它们通常从 proc filesystem: /proc/meminfo/proc/vmstat/proc/PID/smaps其他方式读取内存指标。

此外,交换部分(如@uav 所述)应该触发红灯,因为您必须禁用它才能使 kubelet 正常工作。它是先决条件用于安装 kubeadm。

我希望它有帮助。

相关内容