Advertisement
Guest User

Untitled

a guest
Jul 17th, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.99 KB | None | 0 0
  1. import kubernetes as k8s
  2. import time
  3. import random
  4.  
  5. schedulerName = "random-scheduler"
  6.  
  7. class NewScheduler:
  8. clientset = k8s.client
  9.  
  10. def schedule_pods(self):
  11. watch, err = k8s.watch.Watch()
  12. if err is not None:
  13. print("error when watching pods", err)
  14. return err
  15.  
  16. for event in range(watch.stream(self.clientset.list_namespace, _request_timeout=60)):
  17. if event['type'] != "ADDED":
  18. continue
  19. p, ok = event['object']
  20. if not ok:
  21. print("unexpected type")
  22. continue
  23.  
  24. print("found a pod to schedule:", p.Namespace, "/", p.Name)
  25.  
  26. node, err = self.find_fit()
  27. if err is not None:
  28. print("cannot find node that fits pod", err)
  29. continue
  30.  
  31. err = self.bindPod(p, node)
  32. if err is not None:
  33. print("failed to bind pod", err)
  34. continue
  35. message = "Placed pod [%s/%s] on %s\n" % p.Namespace, p.Name, node.Name
  36.  
  37. err = self.emitEvent(p, message)
  38. if err is not None:
  39. print("failed to emit scheduled event", err)
  40. continue
  41.  
  42. print(message)
  43. return None
  44.  
  45. def find_fit(self):
  46. nodes, err = self.clientset.CoreV1().Nodes().List(k8s.client.api_client.ListOptions({}))
  47. if err is not None:
  48. return None, err
  49. return nodes.Items[random.randint(0,len(nodes.Items))], None
  50.  
  51. def bindPod(self, p, node):
  52. return self.clientset.CoreV1().Pods(p['Namespace']).Bind(self.clientset.CoreV1().Binding({
  53. "ObjectMeta": {
  54. "Name": p['Name'],
  55. "Namespace": p['Namespace']
  56. },
  57. "Target": {
  58. "APIVersion": "v1",
  59. "Kind": "Node",
  60. "Name": node['Name']
  61. }
  62. }))
  63.  
  64. def emitEvent(self, p, message):
  65. timestamp = time.time()
  66. _, err = self.clientset.CoreV1().Events(p['Namespace']).Create(self.clientset.CoreV1().Event({
  67. "Count": 1,
  68. "Message": message,
  69. "Reason": "Scheduled",
  70. "LastTimestamp": timestamp,
  71. "FirstTimestamp": timestamp,
  72. "Type": "Normal",
  73. "Source": self.clientset.CoreV1().EventSource({
  74. "Component": schedulerName,
  75. }),
  76. "InvolvedObject": self.clientset.CoreV1().ObjectReference({
  77. "Kind": "Pod",
  78. "Name": p['Name'],
  79. "Namespace": p['Namespace'],
  80. "UID": p['UID'],
  81. }),
  82. "ObjectMeta": self.clientset.CoreV1().ObjectMeta({
  83. "GenerateName": p['Name'] + "-",
  84. }),
  85. }))
  86. if err is not None:
  87. return err
  88. return None
  89.  
  90.  
  91.  
  92. if __name__ == '__main__':
  93. print("I'm a scheduler!")
  94.  
  95. random.seed(time.time())
  96.  
  97. scheduler = NewScheduler()
  98. scheduler.schedule_pods()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement