Le développement d'applications conteneurisées sous Windows nécessite la mise en place d'un environnement Kubernetes local et plusieurs solutions s'offrent aux développeurs pour créer et gérer un cluster Kubernetes sur leur poste de travail.
D'un côté, des applications natives Windows comme Docker Desktop (soumis à licence), Rancher Desktop ou Podman Desktop permettent d'obtenir rapidement un environnement de développement complet.
D'autre part, pour ceux qui préfèrent travailler dans un environnement virtualisé, des distributions légères comme k0s, kind ou k3s peuvent être déployées au sein d'une machine virtuelle
Dans cet article, nous allons déployer un cluster pas à pas en nous basant sur l'utilitaire kubeadm.
Cette méthode permet non seulement de mieux comprendre les rouages internes de Kubernetes, mais aussi de disposer d'un environnement multi-nœud proche des conditions réelles, particulièrement utile pour se préparer aux certifications comme CKAD, CKA ou CKS.
Explorons cette approche manuelle qui, à l'aide de quelques scripts bien choisis, vous donnera un contrôle total sur votre environnement de développement.

Choix de l'hyperviseur
Pour héberger notre cluster Kubernetes sous Windows, plusieurs solutions de virtualisation s'offrent à nous. Les plus connues sont VirtualBox et VMware Player, qui présentent l'avantage d'une interface graphique intuitive et d'une prise en main rapide.
Cependant, pour ce projet, nous avons opté pour Hyper-V, l'hyperviseur natif de Windows, qui présente plusieurs avantages :
- En tant qu'hyperviseur de type 1 (ou "bare metal"), Hyper-V est directement intégré au système d'exploitation. Cette architecture lui permet d'offrir de meilleures performances par rapport aux solutions de type 2 comme VirtualBox ou VMware Player.
- Hyper-V est déjà inclus dans Windows 10/11 Professionnel et Entreprise : pas besoin d'installer de logiciel supplémentaire, il suffit simplement d'activer la fonctionnalité.
- La gestion du cycle de vie des machines virtuelles est particulièrement robuste : les VM démarrent automatiquement avec Windows et leur état est correctement préservé lors des redémarrages du système.
Il est maintenant temps d'entrer dans le vif du sujet, et d'installer notre cluster étape par étape, en commençant par l'activation de la fonctionnalité Hyper-V.
Etape 1: Activation d'Hyper-V
Dans la barre de recherche, entrez "Windows" comme mot clé, puis cliquez sur "Activer ou désactiver des fonctionnalités Windows". Cochez ensuite Hyper-V pour l'activer.

Attention: vous devez disposer de Windows Professionnel ou Entreprise pour activer Hyper-V.
Etape 2: Créer le réseau interne pour notre cluster
Afin que les nœuds du cluster puissent communiquer entre eux, ils doivent se connecter à un même réseau. Pour cela, nous allons utiliser les fonctionnalités VirtualSwitch et NetNat de Hyper-V.
Pour la procédure détaillée, et toutes les options disponibles, vous pouvez consulter la documentation.
Pour ce tutoriel, nous allons utiliser les paramètres réseau suivants :
- Bloc CIDR pour notre réseau: 192.168.3.0/24
- IP de la gateway: 192.168.3.1
Bien sûr, vous pouvez changer ces valeurs si elles sont en conflit avec une autre de vos interfaces connectées.
Pour les étapes suivantes, vous devrez lancer un terminal PowerShell en mode administrateur.
Création du switch interne
Entrez la commande suivante :
New-VMSwitch -SwitchName "k8s" -SwitchType Internal
Ensuite, trouvez l'indice du nouveau switch en entrant la commande Get-NetAdapter
PS C:\WINDOWS\system32> Get-NetAdapter Name InterfaceDescription ifIndex Status MacAddress LinkSpeed ---- -------------------- ------- ------ ---------- --------- vEthernet (Default Swi... Hyper-V Virtual Ethernet Adapter 35 Up 00-15-5D-54-C5-BC 10 Gbps vEthernet (k8s) Hyper-V Virtual Ethernet Adapter #3 69 Up 00-15-5D-02-01-04 10 Gbps
Ici, dans la colonne ifIndex pour notre nouveau switch k8s, nous avons le chiffre 69 (il sera probablement différent pour vous).
Affectation d'une plage d'adresse IP au switch
Maintenant, nous allons affecter une adresse IP au switch virtuel :
New-NetIPAddress -IPAddress 192.168.3.1 -PrefixLength 24 -InterfaceIndex 69
Pensez bien à ajuster les paramètres IPAddress et PrefixLength pour utiliser un autre bloc CIDR, et le paramètre InterfaceIndex doit correspondre au chiffre trouvé à l'étape précédente.
⚠️ Si vous avez une erreur indiquant que l'objet existe déjà, c'est peut être que l'IP choisie est en conflit avec une autre interface. Choisissez un autre bloc CIDR. Vous pouvez lister les IP déjà présentes sur votre système à l'aide de la commande
Get-NetIPAddress
Il nous reste encore à configurer le NAT sur notre switch, pour permettre par la suite aux VM qui y sont connectées de pouvoir accéder à l'extérieur.
Activation du NAT
Toujours dans votre session Powershell, entrez la commande suivante :
New-NetNat -Name k8s-nat -InternalIPInterfaceAddressPrefix 192.168.3.0/24
Le switch étant maintenant configuré, il est temps de passer à la création de nos VM, en commençant par le control plane.
Pour cette étape, j'ai choisi d'installer l'OS Ubuntu 24.02 à partir des ISO officiels. Je n'ai pas trouvé d'images au format VHDX (compatible Hyper-V). De plus, les images VMDK que j'ai trouvées contiennent les couches graphiques, ce qui ne nous est pas utile (sans compter qu'il nous faut un utilitaire pour la convertir).
Finalement, une installation à partir de l'ISO Ubuntu Server permet de customiser au mieux la VM et de n'activer que ce qui nous est nécessaire. Donc, c'est parti 🚀
Etape 3: Création de la VM pour le control plane
Nota: Pour avoir un environnement strictement identique à ceux utilisés pour les certifications CKA/CKAD/CKS, téléchargez Ubuntu Server 20.04.
Lancez le gestionnaire Hyper-V (tapez hyper-v dans la barre de recherche et sélectionnez "Gestionnaire Hyper-V").
Créer une nouvelle machine virtuelle
Cliquez avec le bouton droit sur le nom de votre host Hyper-V à gauche puis Nouveau / Ordinateur virtuel.

Entrez le nom "k8c-cp" pour la machine et éventuellement l'endroit où sont stockées vos VM.

À l'écran suivant, sélectionnez la Génération 2 pour la VM.
Ensuite, allouez de la mémoire à votre VM. 2Go sont largement suffisants pour le control plane.
Par la suite, vous devez définir comment est connecté votre VM. Ici, choisissez le switch virtuel créé précédemment: k8s

A l'écran suivant, définissez la taille et l'emplacement du disque virtuel. Choisissez 30 Go.
Ensuite, indiquez où se trouve l'ISO sur laquelle la VM doit démarrer. Choisir l'image Ubuntu Server précédemment téléchargée.

Finalement, vérifiez les paramètres dans le dernier écran "Résumé" et cliquez sur "Terminer" pour créer la VM.
Ajuster les paramètres de la machine virtuelle
Avant de démarrer la VM, vous devez paramétrer le démarrage sécurisé.
Cliquez avec le bouton de droite sur la ligne correspondant à votre machine, puis sélectionnez "Paramètres".
Dans la popup qui s'ouvre, choisissez Matériel / Sécurité puis décochez "Activer le démarrage sécurisé".

Finalement, démarrez la VM.
Installation de l'OS
Ce tutoriel retrace les principales étapes de l'installation. Pour avoir la procédure détaillée, ainsi que toutes les options disponibles, référez-vous à la documentation officielle.
Laissez-vous guider par l'assistant d'installation
- Sélection de la langue (l'anglais est conseillé pour éviter des traductions parfois énigmatiques 😄)
- Sélection du clavier
- A l'étape de la configuration réseau, paramétrez l'interface eth0 en statique de la manière suivante (naviguer sur "eth0" puis "edit IPv4"):

(Ici encore, pensez à adapter avec votre CIDR si vous en avez pris un autre).
Si vous préférez utiliser un DNS privé, vous pouvez le renseigner dans cette page. Toutefois, si vous utilisez un PC portable par exemple, assurez-vous que le DNS choisi sera toujours accessible quelque soit l'endroit d'où vous vous connectez (bureau / télétravail...).
- Passez la page de configuration du proxy, à moins que votre réseau ne le nécessite.
- L'assistant vous propose d'utiliser une nouvelle version de l'outil d'installation, vous pouvez continuer avec la version actuelle.
- Au niveau de l'écran de configuration des disques, laissez les options par défaut
- Renseignez vos noms d'utilisateur et de host, par exemple respectivement "kube" et "k8s-cp"

- A l'écran suivant, activez le serveur SSH (laissez l'installeur générer des nouvelles clés).
- Ensuite, une liste de packages supplémentaires est proposée. N'en choisissez aucun.
- L'installation se déroule ensuite automatiquement et prend quelques minutes, une fois effectuée, choisir "Reboot Now"
Premiers tests et installer les toutes dernières mises à jour
Après redémarrage, une invite de connexion s'affiche sur la console de votre VM. Connectez vous avec votre utilisateur "kube" et le mot de passe que vous avez choisi.
Vérifiez l'adresse IP à l'aide de la commande:
ip a show eth0

L'adresse doit correspondre à celle choisie pendant l'installation, ici: 192.168.3.100
Installez les toutes dernières mises à jour qui ne sont pas présentes dans l'ISO d'installation:
sudo apt update && sudo apt upgrade
Le système se met à jour, ce qui montre aussi que la connexion vers l'extérieur fonctionne.
Pour plus de confort, connectez-vous sur la VM en SSH pour avoir un meilleur terminal (copier/coller notamment).
ssh kube@192.168.3.100
Télécharger les scripts d'installation
Pour installer notre cluster, nous allons utiliser un script proposé par killer-sh (plateforme permettant de déployer des environnements éphémères). Bien qu'ils soient conçus pour déployer des clusters sur Google Cloud, ces scripts fonctionnent parfaitement sur notre environnement Hyper-V.
Clonez le répo contenant les scripts (ici):
git clone https://github.com/killer-sh/cks-course-environment.git
Avant d'installer les composants du control plane, nous allons d'abord créer la VM pour notre worker node. Afin d'éviter de réinstaller une seconde fois, nous allons dupliquer la VM du control plane pour en faire un worker (en modifiant son adresse IP et hostname).
Etape 4: Création de la VM pour le worker
Arrêter le control plane existant
Afin de pouvoir dupliquer la VM, il faut en premier lieu l'arrêter. Depuis votre session SSH, exécutez la commande
sudo halt
Ensuite, depuis la console Hyper-V, éteignez la machine
⚠️ Pour arrêter une VM procédez de cette manière :
- Arrêtez l'OS par la command halt
- Eteignez la VM via le bouton "éteindre" (power-off).

⚠️ Il arrive souvent que la fonction "Arrêter" de Hyper-V (bouton rouge) ne fonctionne pas correctement, ce qui amène des blocages.
Exporter la VM k8s-cp
Dans le menu contextuel de la VM, choisir "Exporter"

Choisir un répertoire pour votre export. A noter qu'un sous dossier "k8s-cp" sera automatiquement créé. Vous pouvez entrer par exemple :
C:\hyper-v\exports
La VM sera exportée dans le dossier
C:\hyper-v\exports\k8s-cp
Import de la VM k8s-worker
Dans la barre de menu générale Hyper-V, choisissez "Action / Importer un ordinateur virtuel".
Sélectionnez le répertoire d'export de la VM (se terminant par le nom).
Sur l'écran "Choisir le type d'installation", sélectionnez "Copier l'ordinateur virtuel"

Ensuite, renseigner les chemins pour les données de la VM.
⚠️Les chemins proposés par défaut sont pour k8s-cp, il faut créer un répertoire pour k8s-worker. Vous pouvez utiliser le même répertoire pour les 3 usages (configuration, points de contrôle, pagination).

Ensuite, choisissez le répertoire qui contiendra le disque virtuel pour votre nouvelle machine k8s-worker. Vous pouvez utiliser le même répertoire que précédemment.
A la fin de l'assistant, une nouvelle VM est créée, mais qui s'appelle aussi k8s-cp...
Localisez la nouvelle VM en se basant sur la date de création, puis ouvrez ces paramètres à l'aide du bouton droit + paramètres.

Dans la fenêtre des paramètres, modifiez le nom en "k8s-worker", ainsi que la quantité de mémoire.
Pour un worker node de test, prenez minimum 4 Go, ce qui sera suffisant pour préparer les certifications Kube. Vous pouvez bien sûr allouer plus de mémoire, ou même ajouter un troisième nœud à votre cluster par la suite.

Une fois ces ajustements réalisés, lancez la VM k8s-worker, puis connectez-vous à la console Hyper-V afin de modifier l'adresse IP et le hostname.
Changer l'adresse IP du worker
Editer le fichier de configuration du réseau et mettre à jour l'adresse IP en remplaçant 192.168.3.100 par 192.168.3.101
sudo vi /etc/netplan/50-cloud-init.yaml
Le contenu doit correspondre à ceci (modifier seulement l'adresse IP):
network:
version: 2
ethernets:
eth0:
addresses:
- "192.168.3.101/24"
nameservers:
addresses:
- 8.8.8.8
search: []
routes:
- to: "default"
via: "192.168.3.1"
Changer le hostname
Exécutez la commande suivante :
sudo hostnamectl hostname k8s-worker
Finalement, redémarrez la VM pour prendre en compte les changements :
sudo reboot
Finalement, démarrez la VM k8s-cp à l'aide du gestionnaire Hyper-V. Vous êtes maintenant prêts à installer les composants du cluster sur vos 2 nouvelles VM 🚀
Etape 5: Installer les composants du Control Plane
À l'aide de votre client SSH préféré, connectez-vous à k8s-cp
ssh kube@192.168.3.100
Avant de poursuivre, vous devez choisir une plage d'IP pour les pods et les services. Par défaut, le script utilise la plage réseau 192.168.0.0/16, ce qui entre en conflit avec la plage choisie pour notre routeur virtuel, et éventuellement avec d'autres interfaces présentes sur votre système.
Choisir un bloc CIDR pour le réseau interne du cluster
N'importe quel bloc CIDR respectant un plan d'adressage privé convient, par exemple, nous prendrons 172.25.0.0/16.
Exécutez les commandes suivantes :
sed -i s:192.168.0.0/16:172.25.0.0/16: cks-course-environment/cluster-setup/latest/install_master.sh
sed -i s:192.168.0.0/16:172.25.0.0/16: cks-course-environment/cluster-setup/calico.yaml
Mise à jour du fichier /etc/hosts
Déclarer les adresses de k8s-cp et k8s-worker dans le fichier hosts :
sudo sed -i 's:.* k8s-cp:192.168.3.100 k8s-cp:' /etc/hosts
echo "192.168.3.101 k8s-cp" | sudo tee -a /etc/hosts
Lancer l'installation du control plane
Exécutez la commande suivante :
sudo bash ./cks-course-environment/cluster-setup/latest/install_master.sh
Paramétrez kubectl
mkdir ~/.kube sudo cp /root/.kube/config ~/.kube sudo chown kube:kube ~/.kube/config
Vérifiez que kubectl accède bien à l'API Server:
kube@k8s-cp:~$ kubectl get no NAME STATUS ROLES AGE VERSION k8s-cp Ready control-plane 5m36s v1.31.1
Maintenant, il reste à ajouter un nœud worker à notre cluster. Dans la sortie du script d'installation du control plane, localisez la commande à exécuter sur le worker (dernière ligne du script), ou bien générez un nouveau token par la commande:
kubeadm token create --print-join-command
Notez le retour (kubeadm join...) qui sera à exécuter sur le worker node.
Etape 6: Installer le worker node
Connectez-vous au worker node à l'aide de votre client SSH
ssh kube@192.168.3.101
Installez les éléments du worker node :
sudo bash ./cks-course-environment/cluster-setup/latest/install_worker.sh
Note: le script d'installation doit déjà être présent, car il provient de réplication de l'image du control plane. Si vous avez effectué une installation à partir de zéro également pour le worker node, vous devrez cloner le répo à nouveau.
Ensuite, exécutez la commande notée à l'étape précédente sur le control plane, par exemple :
sudo kubeadm join 192.168.3.100:6443 --token aabbccdd.eeffgghhiikkllmmnn --discovery-token-ca-cert-hash sha256:5acc9ad7c6157dc2bd1b4d769a7de6470688f57d79967181158f8cc5c8a4447f
⚠️ Cette commande nécessite d'être exécutée avec sudo.
Finalement, revenez sur le control plane, et vérifiez que votre cluster a bien maintenant 2 nœuds :
kube@k8s-cp:~$ kubectl get no NAME STATUS ROLES AGE VERSION k8s-cp Ready control-plane 29m v1.31.1 k8s-worker Ready <none> 74s v1.31.1
Vous disposez désormais d'un cluster opérationnel pour développer ou préparer vos certifications Kube !
À tout moment, vous pouvez réinitialiser votre cluster en relançant les scripts install_master.sh et install_worker.sh.