Kubeadm

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Outil officiel d'amorçage (bootstrap) de cluster Kubernetes
Sous-commandes clés init · join · upgrade · token
Ne fait pas Provisionnement d'infrastructure, installation du CNI
Voir aussi Kubernetes · Kubectl · Minikube

kubeadm est l'outil officiel du projet Kubernetes pour amorcer un cluster conforme aux bonnes pratiques, sans imposer de choix sur l'infrastructure sous-jacente (machines physiques, VM, cloud) ni sur le plugin réseau. Il s'utilise en deux temps : kubeadm init sur le nœud destiné à devenir control plane, puis kubeadm join sur chaque nœud worker.

Prérequis communs à tous les nœuds

Avant d'exécuter kubeadm, chaque nœud (control plane et workers) doit satisfaire :

  • un hostname, une adresse MAC et un product_uuid uniques sur le cluster (cat /sys/class/dmi/id/product_uuid) ;
  • le swap désactivé (swapoff, et retrait de l'entrée correspondante dans /etc/fstab) ;
  • les modules noyau overlay et br_netfilter chargés, avec les paramètres sysctl associés :
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF
sudo sysctl --system
  • un container runtime compatible CRI installé et configuré (containerd est le choix courant ; le pilote de cgroups du runtime doit correspondre à celui de kubelet, généralement systemd) ;
  • les paquets kubelet, kubeadm et kubectl installés depuis le dépôt officiel pkgs.k8s.io, en épinglant la version mineure voulue et en les protégeant des mises à jour automatiques :
# adapter le numéro de version mineure (ex. v1.31) selon la cible visée
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

sudo apt-get update && sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
sudo systemctl enable --now kubelet

Le dépôt pkgs.k8s.io est versionné par branche mineure (v1.27, v1.31, etc.) ; les instructions exactes et les URLs peuvent changer d'une version à l'autre du projet (à vérifier dans la documentation officielle au moment de l'installation).

Initialisation du control plane

Sur le nœud destiné à devenir control plane uniquement :

sudo kubeadm init --pod-network-cidr <CIDR_du_reseau_pods> --kubernetes-version <version>

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

kubectl get nodes

Le CIDR du réseau des Pods doit correspondre à celui attendu par le plugin CNI choisi. Un add-on réseau doit ensuite être installé pour que les Pods puissent communiquer entre eux ; Calico en est un exemple :

kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/<version>/manifests/calico.yaml

Tant que l'add-on réseau n'est pas déployé, les nœuds restent en état NotReady.

Ajout des nœuds workers

La commande de jonction est affichée à la fin de kubeadm init, et peut être régénérée à tout moment depuis le control plane :

kubeadm token create --print-join-command

La commande obtenue s'exécute en root sur chaque nœud worker :

sudo kubeadm join <control-plane-host>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>

Depuis le control plane, kubectl get nodes permet de vérifier que chaque worker rejoint bien le cluster et bascule à l'état Ready (cela peut prendre quelques instants).

Mise à niveau (upgrade) du cluster

kubeadm gère aussi la montée de version d'un cluster existant, nœud par nœud, en respectant un ordre strict : d'abord le control plane, puis chaque worker un par un. Les sous-versions de correctif ne sont généralement pas fixées dans les commandes kubeadm upgrade plan/apply (seul le triplet majeur.mineur.patch cible est indiqué) ; les exemples ci-dessous sont donc à adapter à la version réellement visée (à vérifier).

Upgrade du control plane

# purger le nœud (empêche l'ordonnancement de nouveaux Pods dessus)
kubectl drain k8s-control --ignore-daemonsets

# mettre à niveau le paquet kubeadm
sudo apt-get update
sudo apt-get install -y --allow-change-held-packages kubeadm=<version>
kubeadm version

# planifier puis appliquer l'upgrade du control plane
sudo kubeadm upgrade plan v<version>
sudo kubeadm upgrade apply v<version>

# mettre à niveau kubelet et kubectl sur ce nœud
sudo apt-get install -y --allow-change-held-packages kubelet=<version> kubectl=<version>
sudo systemctl daemon-reload
sudo systemctl restart kubelet

# remettre le nœud en service
kubectl uncordon k8s-control
kubectl get nodes

Upgrade des nœuds workers

À répéter pour chaque worker, l'un après l'autre :

# depuis le control plane : purger le worker ciblé
kubectl drain k8s-worker1 --ignore-daemonsets --force

# sur le worker : mettre à niveau kubeadm puis appliquer la config du nœud
sudo apt-get install -y --allow-change-held-packages kubeadm=<version>
sudo kubeadm upgrade node

# sur le worker : mettre à niveau kubelet et kubectl
sudo apt-get install -y --allow-change-held-packages kubelet=<version> kubectl=<version>
sudo systemctl daemon-reload
sudo systemctl restart kubelet

# depuis le control plane : remettre le worker en service
kubectl uncordon k8s-worker1
kubectl get nodes

Voir aussi