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
Te recordamos que en Occentus Network somos Kubernetes Certified Service Provider (KCSP) y que gracias a esta certificación ofrecemos servicio de seguridad de Kubernetes, así como consultoría y formación a empresas que eligen Kubernetes.