Crear scheduler

En kubernetes, el scheduler es el encargado de colocar los pods en los nodos, según la cpu y memoria de que dispongan los nodos, entre otras cosas.  Para poder crear el scheduler debemos seguir los siguientes pasos.

Si usamos como sistema operativo ubuntu18, debemos instalar go  y las build essentials:

wget https://dl.google.com/go/go1.13.6.linux-amd64.tar.gz
sudo tar -C /usr/local -xvzf go1.13.6.linux-amd64.tar.gz
sudo apt-get install build-essential

Después, clonamos el proyecto de kubernetes y lo empaquetamos:

git clone https://github.com/kubernetes/kubernetes.git
cd kubernetes
make

Una vez tenemos el paso anterior, debemos crear una imagen de docker. Para ello, creamos un dockerfile dentro de la carpeta kubernetes con el siguiente contenido:

FROM busybox
ADD ./_output/local/bin/linux/amd64/kube-scheduler /usr/local/bin/kube-scheduler

Ahora creamos la imagen y la subimos a nuestro repositorio:

docker build -t my-project/my-kube-scheduler:1.0 .
docker push my-project/my-kube-scheduler:1.0

Seguidamente creamos un service account, un cluster rol binding y un deployment para el schedule. Creamos el fichero my-scheduler.yaml con el siguiente contenido:

 

apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-scheduler
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: my-scheduler-as-kube-scheduler
subjects:
- kind: ServiceAccount
  name: my-scheduler
  namespace: kube-system
roleRef:
  kind: ClusterRole
  name: system:kube-scheduler
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    component: scheduler
    tier: control-plane
  name: my-scheduler
  namespace: kube-system
spec:
  selector:
    matchLabels:
      component: scheduler
      tier: control-plane
  replicas: 1
  template:
     metadata:
       labels:
       component: scheduler
       tier: control-plane
       version: second
     spec:
       serviceAccountName: my-scheduler
       containers:
       - command:
         - /usr/local/bin/kube-scheduler
         - --address=0.0.0.0
         - --leader-elect=false
         - --scheduler-name=my-scheduler
         image: my-project/my-kube-scheduler:1.0
        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: []

Aplicamos la configuración del fichero:

kubectl apply -f my-scheduler.yaml

Podemos ver si se ha creado correctamente viendo los pods del namespace kube-system:

kubectl get pods -n kube-system

Para comprobarlo, podemos crear un pod, indicando el nombre del scheduler creado. Creamos el fichero pod.yaml con el siguiente contenido:

apiVersion: v1
kind: Pod
metadata:
  name: annotation-second-scheduler
  labels:
    name: multischeduler-example
spec:
  schedulerName: my-scheduler
  containers:
  - name: pod-with-second-annotation-container
    image: k8s.gcr.io/pause:2.0

Creamos el pod anterior ejecutando:

kubectl apply -f pod.yaml

Was this article helpful?

Artículos relacionados