Scheduling est le process qui permet d'associer un pod à un noeud afin que le kubelet le fasse fonctionner.
Scheduler est le composant sur le Control Plane qui gère le Scheduling
Le scheduler sélectionne le noeud approprié pour chaque pod. Il prend en compte les choses comme :
La sélection de noeud (nodeSelector) permet de limiter un pod à un ou plusieurs noeuds sur lequel il peut tourner.
Les nodeSelectore utilisent les labels afin de filtrer sur le/les noeud approprié :
$ kubectl label nodes <node name> special=true
# Soit
$ kubectl label nodes k8s-worker1 special=true
On va maintenant assigner un pod à ce noeud :
apiVersion: v1
kind: Pod
metadata:
name: nodeselector-pod
spec:
containers:
- name: nginx
image: nginx:1.19.1
nodeSelector:
special: "true" # On que "true" soit sous forme de string. On met les apostrophes sinon YAML pensera que c'est un booléen
On peut aussi filtrer sur le nom du noeud (nodeName).
apiVersion: v1
kind: Pod
metadata:
name: nodename-pod
spec:
containers:
- name: nginx
image: nginx:1.19.1
nodeName: <nom noeud>
Un DaemonSets permet de copier un pod sur chaque noeud. Un pod sera automatiquement rajouté si on rajoute un noeud.
Cependant le DaemonSet respecte les labels, taints, tolérances. Si un pod ne devrait pas être sur ce noeud, le DaemonSet ne créera pas de copie du pod sur ce noeud.
La configuration se fait de la façon suivante :
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: my-daemonset
spec:
selector: # Selector obligatoire
matchLabels:
app: my-daemonset # Match les pods ayant ce label
template:
metadata:
labels:
app: my-daemonset # Ajoute le label app=my-daemonset au pod
spec:
containers:
- name: nginx
image: nginx:1.19.1
Un pod statique (static pod) est un pod qui est géré directement par le kubelet d'un noeud et non pas par l'API du control plane. Il suffit de kubelet pour lancer un pod statique.
Kubelet créé automatiquement un pod statique depuis un fichier YAML localisé dans un chemin spécifique du noeud.
Le Kubelet va créer un pod mirroir (mirror pod) pour chaque pod statique. Les pods mirroirs permettent de voir le statut d'un pod statique via l'API k8s, mais on ne peut pas ni changer ni gérer les pods statiques via cette API.
On va donc créer un pod sur un des worker :
sudo vim /etc/kubernetes/manifests/my-static-pod.yml
apiVersion: v1
kind: Pod
metadata:
name: my-static-pod
spec:
containers:
- name: nginx
image: nginx:1.19.1
Il faut redémarrer kubelet pour démarrer le pod statique :
$ sudo systemctl restart kubelet
En se connectant sur le master on peut voir le statut du pod :
$ kubectl get pods
On peut aussi essayer de le supprimer, cependant vu que c'est un pod miroir que l'on voit. Celui-ci sera recrée automatiquement.