即使有足够的资源,K8s 也无法将新的 pods 调度到工作节点

K8s cannot schedule new pods to worker nodes even though there are enough resources

目前,当 K8s 在旧部署上扩展新 pods 并且 Rancher 显示卡在调度 pods 到 K8s 工作节点时,我遇到了一个问题。它最终会被安排但需要一些时间,据我了解是等待调度程序找到适合资源请求的节点。 在该部署的事件部分,它显示:

Warning FailedScheduling 0/8 nodes are available: 5 Insufficient memory, 3 node(s) didn't match node selector.

然后我去节点选项卡检查工作节点上是否有内存不足,它显示我的工作节点是这样的:

STATE   NAME        ROLES   VERSION     CPU             RAM             POD                         
Active  worker-01   Worker  v1.19.5     14/19 Cores     84.8/86.2 GiB   76/110
Active  worker-02   Worker  v1.19.5     10.3/19 Cores   83.2/86.2 GiB   51/110
Active  worker-03   Worker  v1.19.5     14/19 Cores     85.8/86.2 GiB   63/110
Active  worker-04   Worker  v1.19.5     13/19 Cores     84.4/86.2 GiB   53/110
Active  worker-05   Worker  v1.19.5     12/19 Cores     85.2/86.2 GiB   68/110

但是当我进入每台服务器并使用 top 和 free 命令检查内存时,它们在 worker-1 节点上输出类似这样的结果:

top:
Tasks: 827 total,   2 running, 825 sleeping,   0 stopped,   0 zombie
%Cpu(s): 34.9 us, 11.9 sy,  0.0 ni, 51.5 id,  0.0 wa,  0.0 hi,  1.7 si,  0.0 st
KiB Mem : 98833488 total,  2198412 free, 81151568 used, 15483504 buff/cache
KiB Swap:        0 total,        0 free,        0 used. 17101808 avail Mem

free -g:
              total        used        free      shared  buff/cache   available
Mem:             94          77           1           0          14          16
Swap:             0           0           0

因此节点中的可用内存大约为 16-17 GB,但仍然无法将新的 pod 调度到其中。所以我想知道是什么导致了这种内存编号冲突,是 86.2(在 Rancher GUI 上)和 94(在服务器上)之间的数量用于 OS 和其他进程吗?以及为什么 Rancher 显示 K8s 工作负载目前大约需要 83-85 GB,但在服务器中可用内存大约为 16-17GB。有什么办法可以更深入地检查吗?

我还在学习 K8s,所以如果可以的话请详细解释一下或者讨论这个话题。

提前致谢!

工作节点上的实际资源消耗是多少并不重要。 真正重要的是资源请求。

请求是容器保证得到的。如果容器请求资源,Kubernetes 只会将其调度到可以为它提供该资源的节点上。

阅读更多关于 Resource Management for Pods and Containers

but my wonder is why it shows almost full of 86.2 GB when the actual memory is 94GB

使用 kubectl describe node <node name> 查看在特定节点 kubelet 上有多少内存可用

你会看到类似

的内容
Capacity:
  cpu:                8
  ephemeral-storage:  457871560Ki
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             32626320Ki
  pods:               110
Allocatable:
  cpu:                8
  ephemeral-storage:  457871560Ki
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             32626320Ki
  pods:               110
......
Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource           Requests   Limits
  --------           --------   ------
  cpu                100m (1%)  100m (1%)
  memory             50Mi (0%)  50Mi (0%)
  ephemeral-storage  0 (0%)     0 (0%)
  hugepages-1Gi      0 (0%)     0 (0%)
  hugepages-2Mi      0 (0%)     0 (0%)

K8s workload currently takes about 83-85 GB but in server the memory available is about 16-17GB.

从所讨论的 free 的输出来看,这不是真的

KiB Mem : 98833488 total, 2198412 free, 81151568 used, 15483504 buff/cache

2198412 free 即 ~2GB 而你在 buff/cache.

中有~1.5GB

您可以使用 cat /proc/meminfo 获取有关 OS-level 内存信息的更多详细信息。