From 5c099bba2364a2a726ba94ef0790a6e626ab5092 Mon Sep 17 00:00:00 2001 From: Simon Ehrenstein <simon.ehrenstein@gmail.com> Date: Thu, 26 Nov 2020 19:18:44 +0100 Subject: [PATCH] Add custom random-scheduler --- .gitlab-ci.yml | 2 +- execution/random-scheduler/Dockerfile | 14 ++++ execution/random-scheduler/deployment.yaml | 76 +++------------------- execution/random-scheduler/rbac.yaml | 21 ++++++ execution/random-scheduler/schedule.sh | 29 +++++++++ execution/random-scheduler/test.yaml | 20 ++++++ 6 files changed, 94 insertions(+), 68 deletions(-) create mode 100644 execution/random-scheduler/Dockerfile create mode 100644 execution/random-scheduler/rbac.yaml create mode 100755 execution/random-scheduler/schedule.sh create mode 100644 execution/random-scheduler/test.yaml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 05ea0e7d9..ba2bba99b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -241,4 +241,4 @@ deploy-uc4-workload-generator: when: always - if: "$DOCKERHUB_ORG && $DOCKERHUB_ID && $DOCKERHUB_PW && $IMAGE_NAME && $JAVA_PROJECT_NAME" when: manual - allow_failure: true + allow_failure: true \ No newline at end of file diff --git a/execution/random-scheduler/Dockerfile b/execution/random-scheduler/Dockerfile new file mode 100644 index 000000000..4c78f6a20 --- /dev/null +++ b/execution/random-scheduler/Dockerfile @@ -0,0 +1,14 @@ +FROM ubuntu:bionic + +RUN apt-get update +RUN apt-get install -y curl jq + +RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl + +RUN chmod +x ./kubectl + +RUN mv ./kubectl /usr/local/bin/kubectl + +ADD schedule.sh /bin/schedule + +CMD /bin/schedule \ No newline at end of file diff --git a/execution/random-scheduler/deployment.yaml b/execution/random-scheduler/deployment.yaml index d42b57c30..1bbc60a1c 100644 --- a/execution/random-scheduler/deployment.yaml +++ b/execution/random-scheduler/deployment.yaml @@ -1,80 +1,22 @@ -apiVersion: v1 -kind: ServiceAccount -metadata: - name: random-scheduler - namespace: kube-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: random-scheduler-as-kube-scheduler -subjects: -- kind: ServiceAccount - name: random-scheduler - namespace: kube-system -roleRef: - kind: ClusterRole - name: system:kube-scheduler - apiGroup: rbac.authorization.k8s.io ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: random-scheduler-as-volume-scheduler -subjects: -- kind: ServiceAccount - name: random-scheduler - namespace: kube-system -roleRef: - kind: ClusterRole - name: system:volume-scheduler - apiGroup: rbac.authorization.k8s.io ---- apiVersion: apps/v1 kind: Deployment metadata: - labels: - component: scheduler - tier: control-plane name: random-scheduler + labels: + app: random-scheduler namespace: kube-system spec: + replicas: 1 selector: matchLabels: - component: scheduler - tier: control-plane - replicas: 1 + app: random-scheduler template: metadata: labels: - component: scheduler - tier: control-plane - version: second + app: random-scheduler spec: - serviceAccountName: random-scheduler + serviceAccount: random-scheduler containers: - - command: - - /usr/local/bin/kube-scheduler - - --address=0.0.0.0 - - --leader-elect=false - - --scheduler-name=random-scheduler # use correct config - image: gcr.io/my-gcp-project/my-kube-scheduler:1.0 # use correct image - livenessProbe: - httpGet: - path: /healthz - port: 10251 - initialDelaySeconds: 15 - name: kube-second-scheduler - readinessProbe: - httpGet: - path: /healthz - port: 10251 - resources: - requests: - cpu: '0.1' - securityContext: - privileged: false - volumeMounts: [] - hostNetwork: false - hostPID: false - volumes: [] \ No newline at end of file + - name: random-scheduler + image: sehrenstein/random-scheduler:latest + imagePullPolicy: Always diff --git a/execution/random-scheduler/rbac.yaml b/execution/random-scheduler/rbac.yaml new file mode 100644 index 000000000..ba463cc54 --- /dev/null +++ b/execution/random-scheduler/rbac.yaml @@ -0,0 +1,21 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + namespace: kube-system + name: random-scheduler + labels: + app: random-scheduler + component: random-scheduler +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: random-scheduler +subjects: +- kind: ServiceAccount + name: random-scheduler + namespace: kube-system +roleRef: + kind: ClusterRole + apiGroup: rbac.authorization.k8s.io + name: system:kube-scheduler \ No newline at end of file diff --git a/execution/random-scheduler/schedule.sh b/execution/random-scheduler/schedule.sh new file mode 100755 index 000000000..0cec94ef6 --- /dev/null +++ b/execution/random-scheduler/schedule.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +SERVER=($(kubectl config view -o json | jq '.clusters[0].cluster.server')) + +while true; + +do + + echo "$(kubectl get pods -n default)" + for PODNAME in $(kubectl get pods -n default -o json | jq '.items[] | select(.spec.schedulerName == "random-scheduler") | select(.spec.nodeName == null) | .metadata.name' | tr -d '"'); + + do + + NODES=($(kubectl get nodes -o json | jq '.items[].metadata.name' | tr -d '"')) + + + NUMNODES=${#NODES[@]} + + CHOSEN=${NODES[$[$RANDOM % $NUMNODES]]} + + curl --header "Content-Type:application/json" --request POST --data '{"apiVersion":"v1", "kind": "Binding", "metadata": {"name": "'$PODNAME'"}, "target": {"apiVersion": "v1", "kind": "Node", "name": "'$CHOSEN'"}}' $SERVER/api/v1/namespaces/default/pods/$PODNAME/binding/ + + echo "Assigned $PODNAME to $CHOSEN" + + done + + sleep 1 + +done \ No newline at end of file diff --git a/execution/random-scheduler/test.yaml b/execution/random-scheduler/test.yaml new file mode 100644 index 000000000..9104a0968 --- /dev/null +++ b/execution/random-scheduler/test.yaml @@ -0,0 +1,20 @@ +apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2 +kind: Deployment +metadata: + name: nginx-deployment +spec: + selector: + matchLabels: + app: nginx + replicas: 2 # tells deployment to run 2 pods matching the template + template: + metadata: + labels: + app: nginx + spec: + schedulerName: random-scheduler + containers: + - name: nginx + image: nginx:1.14.2 + ports: + - containerPort: 80 \ No newline at end of file -- GitLab