提问者:小点点

k8s-调度程序如何分配节点


我只是想知道k8s master/调度程序将如何处理这个问题。

让我们考虑我有一个具有2个节点的k8s主机。假设每个节点具有8GB RAM,并且每个节点运行一个消耗3GB RAM的pod。

node A - 8GB
   - pod A - 3GB
node B - 8GB
   - pod B - 3GB

现在我想安排另一个 pod,比如 pod C,它需要 6GB RAM。

问题:

  1. k8s 主节点会将 Pod A 或 B 转移到其他节点以容纳集群中的 Pod C,还是 Pod C 处于挂起状态?
  2. 如果 pod C 将处于挂起状态,如何通过 k8s 有效地使用资源?

不幸的是,我不能用我的minikube尝试这个。如果你知道k8s调度器如何分配节点,请澄清。


共2个答案

匿名用户

大多数 Kubernetes 组件都是按责任划分的,工作负载分配也不例外。我们可以将工作负载分配过程定义为调度和执行。

调度器顾名思义将负责调度步骤,流程可以简单描述为,“获取一个pod的列表,如果没有调度到一个节点,就把它分配到一个有能力运行pod的节点”。Julia Evan有一篇很好的博文解释了调度器。

Kubelet负责执行计划到它的节点的pod。它将获得分配给它的节点的POD定义列表,确保它们以正确的配置运行,如果不运行start。

考虑到这一点,您描述的场景将具有预期的行为,不会调度POD,因为您没有可用于POD的容量的节点。

资源平衡主要在调度级别决定,一个很好的查看方法是当您向集群添加新节点时,如果没有待分配的 POD,则该节点将不会收到任何 Pod。在此 PR 上可以看到用于资源平衡的逻辑的简要说明

解决方案,

Kubernetes附带了一个默认的调度程序。如果默认的调度程序不符合您的需要,您可以实现自己的调度程序,如下所述。当集群具有容量但没有被很好地分配以分配新的负载时,该想法将被实现并扩展为调度器重新调度已经运行的pod。

另一种选择是使用为这样的场景创建的工具,Descheduler就是其中之一,它将监控集群并从节点中驱逐pod,以使调度程序以更好的平衡重新分配POD。这里有一篇很好的博客文章描述了这些场景。

PS:请记住,节点的总内存是不可分配的,具体取决于您使用的提供商,可分配的容量将远低于总容量,请看一下此 SO:无法创建请求超过 2Gi 内存的部署

匿名用户

在下面找到答案

  1. k8s主节点会将pod A或B转移到其他节点以容纳集群中的pod C还是pod C处于待处理状态?
No. pod A and pod B would still be running, pod C will not be scheduled. 
Both the nodes cant meet the resource requirements needed to run pod C and hence it cant be scheduled.

您提到节点容量为 8 GB RAM。请注意,整个 8 GB RAM 不可用于运行工作负载。保留一定数量的 RAM 用于 kube-proxy、kubelet 和其他节点管理活动。