Aller au contenu
CloudKubernetesCKSCKADCKA

Tutoriel : Installer un cluster k8s double nœud sous Windows avec Hyper-V

Apprenez à créer un cluster Kubernetes sous Windows avec Hyper-V et kubeadm. Un guide pratique pour maîtriser les fondamentaux de Kubernetes et préparer vos certifications, tout en développant dans un environnement proche de la production.

Kubernetes + Hyper-V

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.

Hyper-V, Virtual Box, VMWare, lequel choisir ?

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.

Activation de Hyper-V

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.

Créez une nouvelle machine virtuelle

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

Nommage de la 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

Choix du réseau

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.

Choix de l'image de démarrage

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é".

Désactivation du 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"):
Paramètres réseau

(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
Vérification de l'adresse IP

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).
Arrêt de la machine virtuelle

⚠️ 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"

Export d'une VM

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"

Type d'importation: copie

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.

Trouver la bonne VM...

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.

Dernier