特稿 >

科技快讯 >

如何在Python语言环境中进行Kubernetes Scheduling功能

如何在Python语言环境中进行Kubernetes Scheduling功能

才云Caicloud 丨 科技快讯

18453
1387

2017-04-24

赵逸禅

Xtecher特稿作者

关注

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


640 (1).png


用Python 写Kubernetes Scheduler


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


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


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


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


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


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


640.jpg


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


原文链接:https://medium.com/@sebgoa/kubernetes-scheduling-in-python-3588f4928b13

打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮

账号登录

重置密码

还没有账号?立即注册>

账号注册

已有账号?立即登录>注册企业会员

重置密码

返回

绑定手机