Kubernetes容器云平台自动化运维工具——自定义调度器
在前面已建好的Kubernetes开发环境云平台上。在/root目录下,创建k8s_custom_scheduler.py文件,要求使用Python编写一个Kubernetes调度器,监听Pod的变化,当检测到有Pending或Running状态的Pod时,Kubernetes随机选择一个可用的节点,实现Pod与该命令空间的绑定,并以json格式输出Event、Pod信息。
上传nginx-pod00.yaml、nginx-pod02.yaml、nginx-pod03.yaml到root目录下,编写完成后,提交该云主机的用户名、密码和IP地址到答题框。
import random
from kubernetes import client, config, watch
try:
config.load_kube_config('kube_config')
k8s = client.CoreV1Api()
w = watch.Watch()
for event in w.stream(k8s.list_namespaced_pod, namespace='default', timeout_seconds=6000):
o = event['object']
# print(str(event))
# print(o.spec.node_name,o.status.phase)
# print(k8s.read_namespaced_pod(o.metadata.name, 'default'))
# print(o.status.phase, o.spec.node_name, type(o.status.phase), type(o.spec.node_name))
# print(o.status.phase == "Pending" or o.status.phase == "Running", o.spec.node_name is None)
if (o.status.phase == "Pending" or o.status.phase == "Running") and o.spec.node_name is None:
# print(o.status.phase, o.spec.node_name, type(o.status.phase), type(o.spec.node_name))
# print(o.status.phase == "Pending" or o.status.phase == "Running", o.spec.node_name is None)
# print(o.metadata.name)
nodes = []
for i in k8s.list_node().items:
for n in i.status.conditions:
if n.status == 'True' and n.type == 'Ready':
nodes.append(i.metadata.name)
nodes = random.choice(nodes)
# print(nodes)
t = client.V1Binding(
metadata=client.V1ObjectReference(name=o.metadata.name),
target=client.V1ObjectReference(kind='Node', api_version='v1', name=nodes)
)
try:
resp = k8s.create_namespaced_binding('default', body=t)
print(str(resp))
except:
pass
print(k8s.read_namespaced_pod(o.metadata.name,'default'))
except Exception as e:
print('err')
print(e)
print('end')
print('master')