Kubeadm
| 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_uuiduniques 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
overlayetbr_netfilterchargés, avec les paramètressysctlassocié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,kubeadmetkubectlinstallés depuis le dépôt officielpkgs.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