Kubernetes – Single-Node Cluster

1 novembre 2025

Voici comment installer un amas Kubernetes avec un seul serveur (contrôleur/noeud) sous Ubuntu.

1 – Charger le modules du noyau Linux requis:

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf 
overlay 
br_netfilter 
EOF 
sudo modprobe overlay 
sudo modprobe br_netfilter

2 – Ajuster la configuration réseau requise pour K8S:

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
# Recharger la nouvelle configuration
sudo sysctl --system

3 – Installer containerd:

Note: Containerd est un moteur de conteneurs standard de l’industrie qui gère le cycle de vie complet des conteneurs, de la création à la supervision. C’est un projet de la CNCF (Cloud Native Computing Foundation) qui sert de composant clé pour des plateformes comme Docker et est largement utilisé par Kubernetes pour exécuter des conteneurs, grâce à son efficacité et sa robustesse. 

sudo apt-get update
sudo apt-get install -y containerd

4 – Renseigner les droits de groupe requis pour le fonctionnement de containerd:

sudo mkdir -p /etc/containerd
# Créer le fichier de configuration
sudo containerd config default | sudo tee /etc/containerd/config.toml
# Ajouter le processus à Cgroup
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml

5 – Redémarrer et activer containerd:

sudo systemctl restart containerd
# La commande suivante assure que containerd est lancé au redémarrage du serveur
sudo systemctl enable containerd

Étape 2: Installer Kubernetes

6 – Désactiver le fichier d’échange de la mémoire virtuelle:

sudo swapoff -a
# Mettre en commentaire l'activation de la mémoire virtuelle de façon permanente.
# Attention, la commande suivante ne semble pas fonctionner correctement!
# Il est préférable d'éditer le fichier manuellement.
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

7 – Ajouter le dépôt Kubernetes à la commande ‘apt’:

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
sudo mkdir -p -m 755 /etc/apt/keyrings
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

8 – Installer les applications K8S et bloquer les mises à jours (M-A-J au besoin):

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

Step 3: Réaliser la configuration d’un amas K8s d’un seul noeud (sur le contrôleur)

9 – Initialiser le contrôleur:

 sudo kubeadm init --pod-network-cidr=10.244.0.0/16

10 – Préparer l’environnement de gestion pour l’utilisateur actuel:

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

11- Retirer la contrainte qui empêche le contrôleur de rouler des déploiements localement :

kubectl taint nodes --all node-role.kubernetes.io/control-plane-

12 – Installer une couche réseau, utilisée par les déploiements (Flannel CNI plugin):

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

13 – Vérifier le fonctionnement de l’amas (cluster K8s):

kubectl get nodes
kubectl get pods -n kube-system

Tester un déploiement

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.24.0
        ports:
        - containerPort: 80
kubectl apply -f deployment.yaml

kubectl get pods -o wide

# tester un des serveurs NGINX dans un fureteur local.
# Oui bien, $ curl adresseIPduPod

Gestion des erreurs

Si au redémarrage du serveur, kubectl affiche le message suivant:

alain@kubectl:~$ kubectl get nodes
The connection to the server 192.168.2.155:6443 was refused - did you specify the right host or port?

systemctl status kubelet


# Il faudra afficher le journal de l'application:
journalctl -fu kubelet

Une cause possible: 

Nov 01 17:12:10 kubectl kubelet[7023]: E1101 17:12:10.263490    7023 run.go:74] "command failed" err="failed to run Kubelet: running with swap on is not supported, please disable swap! or set --fail-swap-on flag to false. /proc/swaps contained: [Filename\t\t\t\tType\t\tSize\t\tUsed\t\tPriority /swap.img                               file\t\t4009980\t\t0\t\t-2]"
Nov 01 17:12:10 kubectl systemd[1]: kubelet.service: Main process exited, code=exited, status=1/FAILURE

La cause ici est le fichier d’échange de la mémoire qui est activé. Il faudra désactiver la mémoire virtuelle.

sudo swapoff -a
# Ou bien, placer en commentaire la ligne 'swap' du fichier /etc/fstab:
sudo nano /etc/fstab
#/swap.img      none    swap    sw      0       0

# Redémarrer le service kubelet
sudo systemctl start kubelet

# La commande suivante devrait à nouveau fonctionner:
kubectl get nodes

NAME      STATUS   ROLES           AGE   VERSION
kubectl   Ready    control-plane   75m   v1.29.15

NOTE: Voir les alias K8s dans la section copier/coller


Document préparé par Alain Boudreault – Novembre 2025