kubernetes – k8s – 调度程序如何分配节点

我很想知道k8s master / scheduler将如何处理这个问题.

让我们考虑我有一个带有2个节点的k8s主站.假设每个节点有8GB RAM,每个节点运行一个占用3GB RAM的pod.

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

现在我想安排另一个pod,比如pod C,需要6GB内存.

题:

> k8s主设备是否会将容器A或B转移到其他节点以容纳群集中的容器C,或者容器C是否处于挂起状态?
>如果pod C将处于挂起状态,如何使用k8s有效地使用资源?

不幸的是我无法用我的迷你管尝试这个.如果您知道k8s调度程序如何分配节点,请澄清.

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

顾名思义,调度程序将负责调度步骤.该过程可以简单地描述为“获取一个pod列表,如果没有调度到节点,则将其分配给一个具有运行pod的容量的节点” . Julia Evan here有一篇很好的博客文章解释了调度程序.

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

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

资源平衡主要在调度级别决定,一种很好的方式来查看它是在向集群添加新节点时,如果没有POD待处理分配,节点将不会接收任何pod.可以在this PR上看到用于资源平衡的逻辑简介

解决方案,

Kubernetes附带默认调度程序.如果默认调度程序不适合您的需求,您可以实现自己的调度程序,如here所述.当集群具有容量但分配不足以分配新负载时,调度程序的实现和扩展是已经运行的调度程序.

另一种选择是使用为此类场景创建的工具,Descheduler是一个,它将监视群集并从节点中逐出pod,以使调度程序以更好的平衡重新分配POD.有一篇很好的博客文章here描述了这些场景.

PS:
请记住,节点的总内存不可分配,具体取决于您使用的提供商,可分配的容量将远低于总数,请查看此SO:Cannot create a deployment that requests more than 2Gi memory

点赞