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

时间:2019-02-22 05:46:07

标签: kubernetes

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

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

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 个答案:

答案 0 :(得分:1)

大多数Kubernetes组件按职责划分,工作负载分配也没有不同。我们可以将工作负载分配过程定义为 Scheduling Execution

顾名思义, Scheduler 将负责 Scheduling 步骤。该过程可以简称为“ 获取Pod的列表,如果未将其调度到某个节点,则将其分配给具有运行Pod功能的一个节点”。 Julia Evan here上有一篇不错的博客文章,介绍了调度程序。

Kubelet 负责调度到其节点的pod的 执行 。它将获得分配给它的节点的POD定义的列表,请确保它们以正确的配置运行,如果没有运行start的话。

请记住,您所描述的方案将具有预期的行为,不会安排POD,因为您没有具有可用于POD的容量的节点。

资源平衡主要是在调度级别决定的,一种不错的查看方法是将新节点添加到集群时,如果没有待分配的POD,则该节点将不会收到任何Pod。在this PR

上可以看到用于资源平衡的逻辑的简要说明

解决方案,

Kubernetes附带默认的调度程序。如果默认的调度程序不适合您的需求,则可以按照here的说明实施自己的调度程序。当集群有容量但不能很好地分配新负载时,该想法将是对已经运行的ReSchedule POD的Scheduler的实现和扩展。

另一种选择是使用针对此类情况创建的工具,Descheduler是一种工具,它将监视群集并逐出节点中的Pod,以使调度程序以更好的平衡方式重新分配POD。有一篇不错的博客文章here描述了这些情况。

PS: 请记住,节点的总内存是不可分配的,取决于您使用的提供程序,可分配的容量将比总容量低得多,请看以下SO:Cannot create a deployment that requests more than 2Gi memory

答案 1 :(得分:0)

在答案下方找到

  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. 
  1. 如果Pod C处于待处理状态,如何通过k8s有效地使用资源?
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和其他节点管理活动。