-
Notifications
You must be signed in to change notification settings - Fork 11
/
scheduler-rawnode.py
73 lines (57 loc) · 2.29 KB
/
scheduler-rawnode.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#!/usr/bin/env python
import time
import random
import json
from kubernetes import client, config, watch
from sdcclient import SdcClient
config.load_kube_config()
v1 = client.CoreV1Api()
sdclient = SdcClient(<Your Sysdig API token>)
sysdig_metric = "net.http.request.time"
metrics = [{ "id": sysdig_metric, "aggregations": { "time": "timeAvg", "group": "avg" } }]
scheduler_name = "sysdigsched"
def get_request_time(hostname):
hostfilter = "host.hostName = '%s'" % hostname
start = -60
end = 0
sampling = 60
metricdata = sdclient.get_data(metrics, start, end, sampling, filter=hostfilter)
request_time = float(metricdata[1].get('data')[0].get('d')[0])
print hostname + " (" + sysdig_metric + "): " + str(request_time)
return request_time
def best_request_time(nodes):
if not nodes:
return []
node_times = [get_request_time(hostname) for hostname in nodes]
best_node = nodes[node_times.index(min(node_times))]
print "Best node: " + best_node
return best_node
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, namespace="default"):
body=client.V1Binding()
target=client.V1ObjectReference()
target.kind="Node"
target.apiVersion="v1"
target.name= node
meta=client.V1ObjectMeta()
meta.name=name
body.target=target
body.metadata=meta
return v1.create_namespaced_binding(namespace, body)
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.scheduler_name == scheduler_name:
try:
print "Scheduling " + event['object'].metadata.name
res = scheduler(event['object'].metadata.name, best_request_time(nodes_available()))
except client.rest.ApiException as e:
print json.loads(e.body)['message']
if __name__ == '__main__':
main() 76,1