kubernetes的组件在之前的blog都已经阐述,其中scheduler负责pod的调度,确定pod所在的宿主机节点,由于scheduler通过kubernetes的api调度pod,那么我们当然也可以自己的编写一个scheduler,完成和kubernetes对接。先看下面代码:
# -*- coding:utf-8 -*-
import random
import json
from kubernetes import client,config,watch
schedule_name = "tim"
client.Configuration().host="http://10.39.0.6:8080"
v1=client.CoreV1Api()
def nodes_available():
ready_nodes = []
for n in v1.list_node().items:
for status in n.status.conditions:
if status.status == "True" and status.type == "Ready":
ready_nodes.append(n.metadata.name)
return ready_nodes
def scheduler(name,node,namespces="default"):
print "+++++++++++++++++++++++++++++++++"+node
body = client.V1Binding()
tagert = client.V1ObjectReference()
tagert.kind = "Node"
tagert.apiVersion = "v1"
tagert.name = node
meta =client.V1ObjectMeta()
meta.name=name
body.target = tagert
body.metadata = meta
return v1.create_namespaced_binding(body,namespces)
def main():
w = watch.Watch()
for event in w.stream(v1.list_namespaced_pod,"default"):
if event['object'].status.phase == "Pending" and event['object'].spec.node_name == None:
try:
print event['object'].metadata.name
res = scheduler(event['object'].metadata.name,random.choice(nodes_available()))
except client.rest.ApiException as e:
print json.load(e.body)["message"]
if __name__ == '__main__':
main()
代码非常简单,先是创建一个api调用的client,然后通过stream监听pod变化,这个和k8s里面的listwatch是一回事。获取到有Pending的pod没有调度,就可以通过scheduler方法调度了,scheduler方法就是随机选择一个可用的节点,通过create_namespaced_binding方法调用api绑定pod和主机,这个和kube-scheduler里面的bind方法效果相同。
其中有两个细节需要注意,第一是我这边通过http,你写可以通过kubeconfig的方式通过https,第二,event[‘object’].spec.node_name == None这个调度没有绑定主机的pod。