Skip to content

Commit 23e230e

Browse files
add refs
1 parent f99a8b9 commit 23e230e

File tree

5 files changed

+103
-15
lines changed

5 files changed

+103
-15
lines changed

.github/workflows/main.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@ jobs:
88
build-image:
99
runs-on: ubuntu-latest
1010
steps:
11+
- name: Login to registry ${{ env.REGISTRY }}
12+
uses: docker/[email protected]
13+
with:
14+
registry: ${{ env.REGISTRY }}
15+
username: ${{ github.actor }}
16+
password: ${{ secrets.GITHUB_TOKEN }}
17+
logout: true
1118
- uses: actions/checkout@v4
1219
- name: Set up Docker Buildx
1320
uses: docker/setup-buildx-action@v3

deployment/rbac.yml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
apiVersion: rbac.authorization.k8s.io/v1
2+
kind: ClusterRole
3+
metadata:
4+
name: simple-python-scheduler
5+
rules:
6+
- apiGroups: ["*"]
7+
resources:
8+
- "pods"
9+
- "nodes"
10+
- "bindings"
11+
verbs: ["*"]
12+
---
13+
apiVersion: rbac.authorization.k8s.io/v1
14+
kind: ClusterRoleBinding
15+
metadata:
16+
name: simple-python-scheduler
17+
subjects:
18+
- kind: ServiceAccount
19+
name: default
20+
namespace: simple-python-scheduler
21+
roleRef:
22+
kind: ClusterRole
23+
name: simple-python-scheduler
24+
apiGroup: rbac.authorization.k8s.io

src/main.py

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66

77
from kubernetes import client, config, watch
88

9-
config.load_kube_config()
9+
config.load_incluster_config()
1010
v1 = client.CoreV1Api()
1111

12-
scheduler_name = "foobar"
12+
scheduler_name = "simple-python-scheduler"
13+
NAMESPACE = "test-ns"
1314

1415

1516
def nodes_available():
@@ -21,33 +22,56 @@ def nodes_available():
2122
return ready_nodes
2223

2324

24-
def scheduler(name, node, namespace="default"):
25-
body = client.V1Binding()
25+
def get_running_pods():
26+
pods = []
27+
for pod in v1.list_namespaced_pod(namespace=NAMESPACE).items:
28+
if pod.status.phase == "Running":
29+
pods.append(pod)
30+
return pods
2631

27-
target = client.V1ObjectReference()
28-
target.kind = "Node"
29-
target.apiVersion = "v1"
30-
target.name = node
3132

32-
meta = client.V1ObjectMeta()
33-
meta.name = name
33+
def preemption(priority):
34+
for pod in get_running_pods():
35+
try:
36+
pod_priority = pod.metadata.annotations["priority"]
37+
except:
38+
print(f"Preempting pod {pod.metadata.name}")
39+
return v1.delete_namespaced_pod(name=pod.metadata.name, namespace=NAMESPACE)
3440

35-
body.target = target
36-
body.metadata = meta
41+
if int(pod_priority) > int(priority):
42+
print(f"Preempting pod {pod.metadata.name}")
43+
return v1.delete_namespaced_pod(name=pod.metadata.name, namespace=NAMESPACE)
44+
return None
3745

38-
return v1.create_namespaced_binding_binding(name, namespace, body)
46+
47+
def scheduler(name, priority, node, namespace=NAMESPACE):
48+
while len(v1.list_node().items) <= len(get_running_pods()):
49+
preemption(priority)
50+
51+
target = client.V1ObjectReference(kind="Node", api_version="v1", name=node)
52+
meta = client.V1ObjectMeta(name=name)
53+
body = client.V1Binding(target=target, metadata=meta)
54+
return v1.create_namespaced_binding(
55+
namespace=namespace, body=body, _preload_content=False
56+
)
3957

4058

4159
def main():
4260
w = watch.Watch()
43-
for event in w.stream(v1.list_namespaced_pod, "default"):
61+
for event in w.stream(v1.list_namespaced_pod, NAMESPACE):
4462
if (
4563
event["object"].status.phase == "Pending"
4664
and event["object"].spec.scheduler_name == scheduler_name
4765
):
4866
try:
67+
try:
68+
priority = event["object"].metadata.annotations["priority"]
69+
except TypeError:
70+
priority = 1000
4971
res = scheduler(
50-
event["object"].metadata.name, random.choice(nodes_available())
72+
name=event["object"].metadata.name,
73+
priority=priority,
74+
node=random.choice(nodes_available()),
5175
)
5276
except client.rest.ApiException as e:
5377
print(json.loads(e.body)["message"])

src/resources/example-job.yaml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
apiVersion: batch/v1
2+
kind: Job
3+
metadata:
4+
name: pi
5+
namespace: test-ns
6+
spec:
7+
template:
8+
metadata:
9+
annotations:
10+
priority: "200"
11+
spec:
12+
schedulerName: simple-python-scheduler
13+
containers:
14+
- name: pi
15+
image: perl:5.34.0
16+
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
17+
restartPolicy: Never
18+
parallelism: 4
19+
backoffLimit: 4

src/resources/example-pod.yaml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
apiVersion: v1
2+
kind: Pod
3+
metadata:
4+
name: foobar-sched-2
5+
namespace: test-ns
6+
annotations:
7+
priority: "2"
8+
spec:
9+
schedulerName: simple-python-scheduler
10+
containers:
11+
- name: nginx
12+
image: nginx:latest
13+
ports:
14+
- containerPort: 80

0 commit comments

Comments
 (0)