LOADING

Follow me

【转载】K8S 花式玩法 | 在 Python 语言环境中进行 Kubernetes Scheduling 功能
四月 21, 2017|DockerPaaS

【转载】K8S 花式玩法 | 在 Python 语言环境中进行 Kubernetes Scheduling 功能

【转载】K8S 花式玩法 | 在 Python 语言环境中进行 Kubernetes Scheduling 功能

一说到 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。

K8S 花式玩法 | 在 Python 语言环境中进行 Kubernetes Scheduling 功能

用 Python 写 Kubernetes Scheduler

我们可以运行一些非常先进的功能来确定可以提供 Pod 请求的可用节点列表,然后运行一些同样高级的功能来对可以提供 Pod 请求的节点进行排名,当然我们也可以随机选择一个节点。随机选择并不像听起来那么糟糕,在某些情况下可能是一个比较折中的办法,因为它计算成本很少。


要实现 Scheduler,我们会在 Pods 端点上运行 Watch。每当系统中的 Pods 集合发生变化时,我们就会收到通知。当 Pod 处于 Pending 状态并指定了我们的调度程序名称时,我们就呼叫随机 Scheduler。


要做随机调度,我们只需要在系统中构建可用节点的列表,然后随机选择一个。

要在随机节点上调度 Pod,我们要创建一个 Binding 对象。这说到底是一个附加描述目标节点对象的 POST。


感谢 Ian Lewis 的提示以及他的博客。


下面的要点使用 Kubernetes Python 客户端实现了简单的调度。


K8S 花式玩法 | 在 Python 语言环境中进行 Kubernetes Scheduling 功能


现在,将这个 Python 脚本粘贴在一个容器中,运行在一个 Pod 中,于是你就有了一个Kubernetes 的自定义 Scheduler。


本文由“才云 Caicloud”编辑翻译,如果转载请注明“转载自才云 Caicloud”,查看原文,请点击“阅读原文”。

K8S 花式玩法 | 在 Python 语言环境中进行 Kubernetes Scheduling 功能

no comments
Share

发表评论