Déployer un cluster Kubernetes hautement disponible avec kubeadm et MetalLB

Publié le 24 juin 2025

Infrastructure
Cloud
Kubernetes

Kubernetes est la référence pour l'orchestration de conteneurs. Ce guide vous montre comment déployer un cluster Kubernetes hautement disponible avec kubeadm, intégrer MetalLB pour la gestion des IP flottantes, configurer un stockage persistant, et surtout garantir un quorum etcd résilient.

Prérequis

  • Minimum 3 nœuds masters pour le control-plane (impair recommandé pour le quorum) et 2 nœuds workers
  • Distribution Linux (Debian, Ubuntu, Rocky, AlmaLinux)
  • Accès root ou sudo
  • Un réseau local stable
  • Ports etcd (2379, 2380) ouverts entre les masters

Gestion du quorum

Un quorum survient quand la majorité des membres sont disponibles :

  • Avec 3 nœuds, quorum = 2 nœuds actifs
  • Avec 5 nœuds, quorum = 3 nœuds actifs
  • Perdre plus de la moitié des nœuds etcd entraîne l’indisponibilité du cluster
  • Vérifiez l’état du quorum :
    kubectl exec -n kube-system etcd-<node> -- etcdctl endpoint status --write-out=table
    

1. Installation des prérequis

Sur tous les nœuds :

sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl
curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

Désactivez le swap :

sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab

2. Initialiser le premier master

kubeadm init --control-plane-endpoint "lb.k8s.local:6443" --upload-certs

Configurez kubectl :

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

3. Ajouter d'autres masters

Utilisez la commande join générée avec l’option --control-plane :

kubeadm join lb.k8s.local:6443 --token <token>   --discovery-token-ca-cert-hash sha256:<hash>   --control-plane --certificate-key <key>

4. Ajouter les workers

kubeadm join lb.k8s.local:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>

5. Installer le réseau (Calico)

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

6. Déployer MetalLB

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.10/config/manifests/metallb-native.yaml

Configurez un pool IP :

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.1.240-192.168.1.250
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: l2adv
  namespace: metallb-system
kubectl apply -f metallb-config.yaml

7. Stockage persistant

Exemple NFS :

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 100Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /srv/nfs/kubedata
    server: 192.168.1.100

Vérification

kubectl get nodes
kubectl get pods -A
kubectl get etcd -n kube-system

Conclusion

Vous avez mis en place un cluster Kubernetes robuste, hautement disponible, avec un quorum etcd résilient, MetalLB pour le load balancing et un stockage persistant. Parfait pour la production on-premise.

Besoin d'aide sur ce sujet ?

Notre équipe d'experts est là pour vous accompagner dans vos projets.

Contactez-nous

Articles similaires qui pourraient vous intéresser