一说到 Scheduling,话题就沉重了。它在计算机科学研究领域覆盖面很大、很全。
Scheduling 的需求一般是寻找正在等待的对象,以及制定为这些需求服务的计划。总体来说,就是希望使用最合适的资源来实现减少服务时间的目的。
Kubernetes 也是一样。Kubernetes 将 Pods(同组容器的组)调度到集群的节点上。这意味着 Kubernetes 头节点的核心组件之一是 Scheduler,它是 Kubernetes Master 的一个组件,通常与 API Server 和 Controller Manager 组件部署在一个节点,共同组成 Master 的三剑客。
一句话概括 Scheduler 的功能:将 PodSpec.NodeName 为空的 Pods 逐个地,经过预选(Predicates)和优选(Priorities)两个步骤,挑选最合适的 Node 作为该 Pod 的 Destination。
为了进一步神秘化调度过程,我们可以将其近似为 Kubernetes 需要查看集群中所有的节点,过滤出不是很好匹配的节点,以运行处于 Pending 状态的 Pod,然后选择一个。
用复杂一点的话来说,Scheduler 将运行一组 Predicates,然后运行一些优先功能。最终结果是可以运行一系列工作负载(即 Pod)的节点,Pod 结束于具有最高排名的节点。
这种过滤和排名并不是什么新鲜事,可以在 30 年的旧系统中找到。
具有非默认 Scheduler 的 pod
让我们深入了解并开启一个指定非默认 Scheduler 的 Pod。这可以使用 Pod Spec 中的 schedulerName 在 Pod 清单中完成。在下面的要点中,我们指定一个名为 foobar 的调度器。一旦你创建了这个 Pod,由于 Kubernetes 不知道这个 Scheduler,Pod 将保持在 Pending 状态,直到我们为分配一个节点到这个 Pod。
用 Python 写 Kubernetes Scheduler
我们可以运行一些非常先进的功能来确定可以提供 Pod 请求的可用节点列表,然后运行一些同样高级的功能来对可以提供 Pod 请求的节点进行排名,当然我们也可以随机选择一个节点。随机选择并不像听起来那么糟糕,在某些情况下可能是一个比较折中的办法,因为它计算成本很少。
要实现 Scheduler,我们会在 Pods 端点上运行 Watch。每当系统中的 Pods 集合发生变化时,我们就会收到通知。当 Pod 处于 Pending 状态并指定了我们的调度程序名称时,我们就呼叫随机 Scheduler。
要做随机调度,我们只需要在系统中构建可用节点的列表,然后随机选择一个。
要在随机节点上调度 Pod,我们要创建一个 Binding 对象。这说到底是一个附加描述目标节点对象的 POST。
感谢 Ian Lewis 的提示以及他的博客。
下面的要点使用 Kubernetes Python 客户端实现了简单的调度。
现在,将这个 Python 脚本粘贴在一个容器中,运行在一个 Pod 中,于是你就有了一个 Kubernetes 的自定义 Scheduler。
本文转载自才云 Caicloud 公众号。
原文链接:https://mp.weixin.qq.com/s/KiKALG5iO-Z5G-eLqx-VIA
评论