У меня есть кластер 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 ГБ.
Я также протестировал это на кластере из 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
Почему есть разница?
Начнем с понимания того, как работают обе команды.
Свободно - Отображение количества свободной и используемой памяти в системе
Kubectl топ - Позволяет видеть потребление ресурсов для узлов или модулей.
Есть статья объясняя, почему вы можете увидеть различия:
Большинство показателей, специфичных для контейнера, доступны в файловой системе cgroup через
/path/to/cgroup/memory.stat
,/path/to/cgroup/memory.usage_in_bytes
,/path/to/cgroup/memory.limit_in_bytes
и другие. Большинство инструментов Linux, предоставляющих метрики системных ресурсов, были созданы раньшеcgroups
даже существовал. Обычно они считывают метрики памяти из процесса.filesystem: /proc/meminfo
,/proc/vmstat
,/proc/PID/smaps
и другие.
Кроме того, часть подкачки (как упомянуто @uav) должна вызвать красный свет, поскольку вы должны отключить ее, чтобы kubelet работал правильно. Это один из предпосылки для установки кубеадм.
Я надеюсь, что это помогает.