Aller au contenu principal

Guide Complet pour Déployer un Cluster Kubernetes Non HA avec Kubeadm, Docker et cri-dockerd : Stratégies, Étapes et Meilleures Pratiques pour une Installation Efficace

Introduction Dans cet article, nous allons deployer un cluster Kubernetes en utilisant Kubeadm et Docker. Cette configuration simple avec un seul master est idéale pour les environnements de…

coolibra08 juil. 2026982 vues

 

Introduction

Dans cet article, nous allons deployer un cluster Kubernetes en utilisant Kubeadm et Docker. Cette configuration simple avec un seul master est idéale pour les environnements de développement ou pour ceux qui débutent avec Kubernetes. Nous détaillerons chaque étape, des prérequis à l'installation, en passant par la configuration et le déploiement d'une application simple. Pour le deploiement avec la haute disponibilité de l'apiserver, nous allons l'aborder dans un autre article.

Prérequis

  1. Système d'exploitation: Ubuntu 22.04 ou une distribution Linux similaire.
  2. Matériel: Au moins 2 Go de RAM et 2 CPUs pour chaque node; pour être à l'aise.
  3. Logiciels:
    • Docker Engine, cri-dockerd
    • Kubeadm, Kubelet, et kubectl
    • Droits admin sur les nodes
    • Definir un hostname unique et ajouter le dns dans /etc/hosts et /etc/hostname

 

 

Étape 1: Installation des pérequis

  • Installer vim, pgp, curl, wget et git
sudo apt install -y vim sudo gpg curl wget git
sudo apt update && sudo apt -y full-upgrade
sudo apt-get update && sudo apt-get install -y apt-transport-https curl

 

  • Installer kubectl, kubeadm et kubelet
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/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.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
apt list -a kubelet

KUBE_VERSION=1.29.0-1.1
sudo apt-get install kubelet=$KUBE_VERSION kubeadm=$KUBE_VERSION kubectl=$KUBE_VERSION

 

  • Désactiver le swap et gele kubelet, kubeadm et kubectl pour eviter les mises à jour accidentelles en prod
sudo apt-mark hold kubelet kubeadm kubectl
kubectl version --client && kubeadm version
sudo vim /etc/fstab # /swap.img none swap sw	0 0
sudo modprobe overlay
sudo modprobe br_netfilter

 

    • sudo apt-mark hold kubelet kubeadm kubectl - Empêche les mises à jour automatiques des paquets kubelet, kubeadm et kubectl pour maintenir la stabilité de votre configuration Kubernetes.
    • kubectl version --client && kubeadm version - Affiche les versions actuelles du client kubectl et de kubeadm pour vérifier leurs installations.
    • sudo vim /etc/fstab # /swap.img none swap sw 0 0 - Ouvre le fichier fstab avec l'éditeur vim pour désactiver manuellement le swap, recommandé pour Kubernetes, en commentant ou supprimant l'entrée de swap.
    • sudo modprobe overlay - Charge le module noyau overlay, nécessaire pour que Docker et containerd supportent les systèmes de fichiers en superposition utilisés dans la conteneurisation.
    • sudo modprobe br_netfilter - Charge le module br_netfilter qui permet le filtrage du réseau nécessaire pour que Kubernetes gère le trafic réseau entre les conteneurs.

 

  • Parametrage reseau et reload system
sudo tee /etc/sysctl.d/kubernetes.conf<<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

sudo sysctl --system
    • La première commande crée ou modifie le fichier kubernetes.conf dans le répertoire /etc/sysctl.d/, et y inscrit des paramètres réseau essentiels pour le fonctionnement correct des conteneurs et de la communication réseau :

      • net.bridge.bridge-nf-call-ip6tables = 1 : Permet à iptables de filtrer le trafic IPv6 transitant par les ponts réseau.
      • net.bridge.bridge-nf-call-iptables = 1 : Active le filtrage iptables pour le trafic IPv4 transitant par les ponts réseau.
      • net.ipv4.ip_forward = 1 : Autorise le transfert IP, permettant à la machine de router le trafic entre différents réseaux.
    • La deuxième commande, sudo sysctl --system, applique ces paramètres et tous les autres changements de configuration systèmes définis dans /etc/sysctl.d/ et d'autres fichiers de configuration systèmes, assurant que les modifications prennent effet immédiatement sans redémarrer la machine.

 

Étape 2:  Installation de docker

  •  
  • Ajoutez la clé GPG officielle de Docker :
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

 

  • Configurez le dépôt Docker stable dans les sources apt:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update

 

  • Installez une version spécifique de Docker :
 # List the available versions:
apt-cache madison docker-ce | awk '{ print $3 }'

VERSION_STRING=5:27.0.3-1~ubuntu.24.04~noble
sudo apt-get install docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io docker-buildx-plugin docker-compose-plugin

 

  • configurer docker
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo tee /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker
sudo systemctl status docker

 

sudo groupadd docker
sudo usermod -aG docker $USER
sudo systemctl start docker.service
exit
connect to vm
docker --version
docker ps

 

  • Installer cri-dockerd as docker engine
VER=$(curl -s https://api.github.com/repos/Mirantis/cri-dockerd/releases/latest|grep tag_name | cut -d '"' -f 4|sed 's/v//g')
echo $VER
### For Intel 64-bit CPU ###
wget https://github.com/Mirantis/cri-dockerd/releases/download/v${VER}/cri-dockerd-${VER}.amd64.tgz
tar xvf cri-dockerd-${VER}.amd64.tgz
sudo mv cri-dockerd/cri-dockerd /usr/local/bin/
cri-dockerd --version
wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.service
wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.socket
sudo mv cri-docker.socket cri-docker.service /etc/systemd/system/
sudo sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service
sudo systemctl daemon-reload
sudo systemctl enable cri-docker.service
sudo systemctl enable --now cri-docker.socket
systemctl status cri-docker.socket
lsmod | grep br_netfilter

 

Étape 2: Provisonning du cluster single master

 

  • Configuration du cluster kubeadm-conf.yml
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
clusterName: techledger-k8s-dev
networking:
  podSubnet: "10.11.0.0/16"
  dnsDomain: cluster.local
  serviceSubnet: "10.10.0.0/16"
kubernetesVersion: 1.29.0

# optional autorise les composant du controlpalne à ecouter sur toutes les ip 
controllerManager:
  extraArgs:
    bind-address: "0.0.0.0"
scheduler:
  extraArgs:
    bind-address: "0.0.0.0"
etcd:
  local:
    extraArgs:
        listen-metrics-urls: http://0.0.0.0:2381

---

apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
nodeRegistration:
  criSocket: unix:///run/cri-dockerd.sock

 

 Il faut dupliquer la vm 3 fois en la clonant pour avoir les 3 nodes; fixer les ip. 1 sera le master et les 2 autres seront les workers.

 

 

  • Initiation du cluster

Connexion sur le kubeadm-master-01 pour lancer la commande suivante.

sudo kubeadm init --config=kubeadm-conf.yml --upload-certs

 

 

 

 

    • Executer les trois commandes du point 1: Celà permet de cofigurer le kubeconfig et executer des commandes kubectl

 

    • commandes:
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 no

kubectl get no -o wide

 

On voit bien que le node master est provisonner mais est encore à l'état NotReady. Il faut maintenant copier la commande du point 2 et l'executer sur les autres nodes. Ainsi ils vont joindre le cluster en tant que worker. Ajouter l'option --cri-socket unix:///run/cri-dockerd.sock à la commande comme ceci.

 

  • Ajout des workers
sudo kubeadm join 192.168.122.101:6443 --token yfgqky.s1ncmbotsdsio1nv \
	--discovery-token-ca-cert-hash sha256:4e3d24dafa331cb9afed5a6576afdcc08fdc7431e80d65dd967f6f1bb1452c5f --cri-socket unix:///run/cri-dockerd.sock

 

 

 

Après avoir executé la commande sur les 2 autres nodes, il faut lancer : kubectl get no -o wide sur le master à nouveau. On doit voir les 3 nodes. Mais toujours en état NotReady.

 

 

Les nodes sont à l'état NotReady parce qu'on a pas encore de Container Network Interface (CNI) deployé.

 

  • Installer le CNI calico

Sur le master, executer les commandes suivantes.

curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml
curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml
kubectl create -f tigera-operator.yaml
sed -ie 's/192.168.0.0/10.11.0.0/g' custom-resources.yaml
kubectl create -f custom-resources.yaml
kubectl get pods --all-namespaces

kubectl cluster-info

 

On voit maintenant que les cluster est up et les node sont bien ready.

 

  • Installer metric server

 

Metrics Server est le tool qui expose les métriques dans Kubernetes.  Ensuite les outils comme prometheus à l'aide d'exporters recupère les metriques et aggregeà des fins d'exploitation.

 

    • Executer sur le master
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

 

Executer la commande kubectl logs metrics-server-6d94bc8694-j9msw -n kube-system si une erreur tls est affichée, corriger comme ceci:

kubectl edit -n kube-system deploy/metrics-server

# Ajouter cette ligne
- --kubelet-insecure-tls

 

 

On peut voir maintenant la consommation des nodes.

 

 

  • Pour avoir une classe de stockage, on install local-path-provisionner
kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.30/deploy/local-path-storage.yaml

 

 

 


N'hésitez pas à laisser des commentaires si vous avez des questions ou des suggestions !


 

Commentaires

Connectez-vous pour rejoindre la discussion.

Aucun commentaire pour le moment.