Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import kubernetes as k8s
- import time
- import random
- schedulerName = "random-scheduler"
- class NewScheduler:
- clientset = k8s.client
- def schedule_pods(self):
- watch, err = k8s.watch.Watch()
- if err is not None:
- print("error when watching pods", err)
- return err
- for event in range(watch.stream(self.clientset.list_namespace, _request_timeout=60)):
- if event['type'] != "ADDED":
- continue
- p, ok = event['object']
- if not ok:
- print("unexpected type")
- continue
- print("found a pod to schedule:", p.Namespace, "/", p.Name)
- node, err = self.find_fit()
- if err is not None:
- print("cannot find node that fits pod", err)
- continue
- err = self.bindPod(p, node)
- if err is not None:
- print("failed to bind pod", err)
- continue
- message = "Placed pod [%s/%s] on %s\n" % p.Namespace, p.Name, node.Name
- err = self.emitEvent(p, message)
- if err is not None:
- print("failed to emit scheduled event", err)
- continue
- print(message)
- return None
- def find_fit(self):
- nodes, err = self.clientset.CoreV1().Nodes().List(k8s.client.api_client.ListOptions({}))
- if err is not None:
- return None, err
- return nodes.Items[random.randint(0,len(nodes.Items))], None
- def bindPod(self, p, node):
- return self.clientset.CoreV1().Pods(p['Namespace']).Bind(self.clientset.CoreV1().Binding({
- "ObjectMeta": {
- "Name": p['Name'],
- "Namespace": p['Namespace']
- },
- "Target": {
- "APIVersion": "v1",
- "Kind": "Node",
- "Name": node['Name']
- }
- }))
- def emitEvent(self, p, message):
- timestamp = time.time()
- _, err = self.clientset.CoreV1().Events(p['Namespace']).Create(self.clientset.CoreV1().Event({
- "Count": 1,
- "Message": message,
- "Reason": "Scheduled",
- "LastTimestamp": timestamp,
- "FirstTimestamp": timestamp,
- "Type": "Normal",
- "Source": self.clientset.CoreV1().EventSource({
- "Component": schedulerName,
- }),
- "InvolvedObject": self.clientset.CoreV1().ObjectReference({
- "Kind": "Pod",
- "Name": p['Name'],
- "Namespace": p['Namespace'],
- "UID": p['UID'],
- }),
- "ObjectMeta": self.clientset.CoreV1().ObjectMeta({
- "GenerateName": p['Name'] + "-",
- }),
- }))
- if err is not None:
- return err
- return None
- if __name__ == '__main__':
- print("I'm a scheduler!")
- random.seed(time.time())
- scheduler = NewScheduler()
- scheduler.schedule_pods()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement