我只是想知道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。
问题:
不幸的是,我不能用我的minikube尝试这个。如果你知道k8s调度器如何分配节点,请澄清。
大多数 Kubernetes 组件都是按责任划分的,工作负载分配也不例外。我们可以将工作负载分配过程定义为调度和执行。
调度器顾名思义将负责调度步骤,流程可以简单描述为,“获取一个pod的列表,如果没有调度到一个节点,就把它分配到一个有能力运行pod的节点”。Julia Evan有一篇很好的博文解释了调度器。
Kubelet负责执行计划到它的节点的pod。它将获得分配给它的节点的POD定义列表,确保它们以正确的配置运行,如果不运行start。
考虑到这一点,您描述的场景将具有预期的行为,不会调度POD,因为您没有可用于POD的容量的节点。
资源平衡主要在调度级别决定,一个很好的查看方法是当您向集群添加新节点时,如果没有待分配的 POD,则该节点将不会收到任何 Pod。在此 PR 上可以看到用于资源平衡的逻辑的简要说明
解决方案,
Kubernetes附带了一个默认的调度程序。如果默认的调度程序不符合您的需要,您可以实现自己的调度程序,如下所述。当集群具有容量但没有被很好地分配以分配新的负载时,该想法将被实现并扩展为调度器重新调度已经运行的pod。
另一种选择是使用为这样的场景创建的工具,Descheduler就是其中之一,它将监控集群并从节点中驱逐pod,以使调度程序以更好的平衡重新分配POD。这里有一篇很好的博客文章描述了这些场景。
PS:请记住,节点的总内存是不可分配的,具体取决于您使用的提供商,可分配的容量将远低于总容量,请看一下此 SO:无法创建请求超过 2Gi 内存的部署
在下面找到答案
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 和其他节点管理活动。