Installer Cilium sur WSL2
Benoît Garçon
Posted on July 20, 2024
Cilium est une solution de réseau et de sécurité native pour les environnements Kubernetes, utilisant eBPF pour des performances et une flexibilité accrues. Pour utiliser Cilium sur WSL2 (Windows Subsystem for Linux 2), il est nécessaire de compiler un noyau Linux personnalisé avec les modules requis. Ce guide vous conduira à travers les étapes nécessaires pour configurer un environnement WSL2 compatible avec Cilium.
Pré-requis
Avant de commencer, assurez-vous d'avoir les éléments suivants installés et configurés sur votre système :
- Docker
- WSL2 installé sur Windows 10 ou 11
- du temps
Étape 1 : Créer le script de build du noyau
Nous allons utiliser un conteneur Docker pour compiler le noyau Linux avec les modules nécessaires. Créez d'abord un script nommé noyau.build
avec le contenu suivant :
WSL_COMMIT_REF=linux-msft-wsl-5.15.146.1
apt update && apt install -y git build-essential flex bison libssl-dev libelf-dev bc dwarves python3
mkdir /src
cd /src
git init
git remote add origin https://github.com/microsoft/WSL2-Linux-Kernel.git
git config --local gc.auto 0
git -c protocol.version=2 fetch --no-tags --prune --progress --no-recurse-submodules --depth=1 origin +${WSL_COMMIT_REF}:refs/remotes/origin/build/linux-msft-wsl-5.15.y
git checkout --progress --force -B build/linux-msft-wsl-5.15.y refs/remotes/origin/build/linux-msft-wsl-5.15.y
# Ajout du support pour l'affinité de session basée sur clientIP
sed -i 's/# CONFIG_NETFILTER_XT_MATCH_RECENT is not set/CONFIG_NETFILTER_XT_MATCH_RECENT=y/' Microsoft/config-wsl
# Modules requis pour Cilium
sed -i 's/CONFIG_CRYPTO_AEAD=y/CONFIG_CRYPTO_AEAD=m/' Microsoft/config-wsl
sed -i 's/CONFIG_CRYPTO_AEAD2=y/CONFIG_CRYPTO_AEAD2=m/' Microsoft/config-wsl
sed -i 's/CONFIG_CRYPTO_AES=y/CONFIG_CRYPTO_AES=m/' Microsoft/config-wsl
sed -i 's/CONFIG_CRYPTO_CBC=y/CONFIG_CRYPTO_CBC=m/' Microsoft/config-wsl
sed -i 's/CONFIG_CRYPTO_GCM=y/CONFIG_CRYPTO_GCM=m/' Microsoft/config-wsl
sed -i 's/CONFIG_CRYPTO_HMAC=y/CONFIG_CRYPTO_HMAC=m/' Microsoft/config-wsl
sed -i 's/CONFIG_CRYPTO_SEQIV=y/CONFIG_CRYPTO_SEQIV=m/' Microsoft/config-wsl
sed -i 's/CONFIG_CRYPTO_SHA256=y/CONFIG_CRYPTO_SHA256=m/' Microsoft/config-wsl
echo 'CONFIG_INET_XFRM_MODE_TUNNEL=m' >> Microsoft/config-wsl
sed -i 's/CONFIG_INET_ESP=y/CONFIG_INET_ESP=m/' Microsoft/config-wsl
sed -i 's/# CONFIG_INET_IPCOMP is not set/CONFIG_INET_IPCOMP=m/' Microsoft/config-wsl
sed -i 's/# CONFIG_INET_XFRM_TUNNEL is not set/CONFIG_INET_XFRM_TUNNEL=m/' Microsoft/config-wsl
sed -i 's/# CONFIG_INET6_ESP is not set/CONFIG_INET6_ESP=m/' Microsoft/config-wsl
sed -i 's/# CONFIG_INET6_IPCOMP is not set/CONFIG_INET6_IPCOMP=m/' Microsoft/config-wsl
echo 'CONFIG_INET6_TUNNEL=m' >> Microsoft/config-wsl
echo 'CONFIG_INET6_XFRM_TUNNEL=m' >> Microsoft/config-wsl
sed -i 's/CONFIG_IP_SET_HASH_IP=y/CONFIG_IP_SET_HASH_IP=m/' Microsoft/config-wsl
sed -i 's/CONFIG_IP_SET=y/CONFIG_IP_SET=m/' Microsoft/config-wsl
sed -i 's/# CONFIG_NET_SCH_FQ is not set/CONFIG_NET_SCH_FQ=m/' Microsoft/config-wsl
sed -i 's/# CONFIG_NETFILTER_XT_MATCH_MARK is not set/CONFIG_NETFILTER_XT_MATCH_MARK=y/' Microsoft/config-wsl
sed -i 's/# CONFIG_NETFILTER_XT_MATCH_SOCKET is not set/CONFIG_NETFILTER_XT_MATCH_SOCKET=y/' Microsoft/config-wsl
sed -i 's/CONFIG_NETFILTER_XT_SET=y/CONFIG_NETFILTER_XT_SET=m/' Microsoft/config-wsl
sed -i 's/# CONFIG_NETFILTER_XT_TARGET_TPROXY is not set/CONFIG_NETFILTER_XT_TARGET_TPROXY=m/' Microsoft/config-wsl
sed -i 's/CONFIG_XFRM_ALGO=y/CONFIG_XFRM_ALGO=m/' Microsoft/config-wsl
echo 'CONFIG_XFRM_OFFLOAD=y' >> Microsoft/config-wsl
sed -i 's/# CONFIG_XFRM_STATISTICS is not set/CONFIG_XFRM_STATISTICS=y/' Microsoft/config-wsl
sed -i 's/CONFIG_XFRM_USER=y/CONFIG_XFRM_USER=m/' Microsoft/config-wsl
# Compiler le noyau
echo -ne '\n' | make -j$(nproc) KCONFIG_CONFIG=Microsoft/config-wsl
# Copier le noyau sur l'hôte
rm -rf .git
cp -r /src /output
Étape 2 : Compiler le noyau Linux de WSL2
Ensuite, exécutez la commande suivante pour lancer la compilation :
docker run --name wsl2-noyau-builder --rm -it -v $PWD/output/:/output/ -v $PWD/noyau.build:/noyau.build ubuntu:22.04 bash -c "./noyau.build"
Cette commande utilise Docker pour lancer un conteneur Ubuntu 22.04, installer les dépendances nécessaires et compiler le noyau Linux avec les modifications requises pour Cilium.
Étape 3 : Configurer Windows pour utiliser le nouveau noyau
Après avoir compilé le noyau, nous devons configurer WSL2 pour utiliser ce noyau personnalisé. Exécutez les commandes suivantes pour installer les modules et les en-têtes du noyau, puis copiez le noyau compilé dans un emplacement accessible par Windows :
cd output/src
sudo make modules_install headers_install
export WINUSER=<nom_d_utilisateur_windows>
mkdir /mnt/c/Users/${WINUSER}/noyau
cp arch/x86/boot/bzImage /mnt/c/Users/${WINUSER}/noyau/
cat <<EOT >> /mnt/c/Users/${WINUSER}/.wslconfig
[wsl2]
kernel=C:\\Users\\${WINUSER}\\noyau\\bzImage
EOT
Étape 4 : Redémarrer WSL2 pour appliquer les modifications
Pour appliquer les changements, redémarrez WSL2 :
powershell.exe -Command "wsl --shutdown"
Relancez ensuite WSL2 et vérifiez que le noyau chargé est celui que vous avez compilé :
uname -a
Étape 5 : Charger les modules nécessaires
Pour finaliser la configuration, assurez-vous que les modules nécessaires sont chargés :
awk '(NR>1) { print $2 }' /usr/lib/modules/$(uname -r)/modules.alias | sudo tee /etc/modules-load.d/cilium.conf
sed -i 's@ConditionVirtualization=!container@#ConditionVirtualization=!container@' /lib/systemd/system/systemd-modules-load.service
sed -i 's@ConditionDirectoryNotEmpty=|/lib/modules-load.d@#ConditionDirectoryNotEmpty=|/lib/modules-load.d@' /lib/systemd/system/systemd-modules-load.service
sed -i 's@ConditionDirectoryNotEmpty=|/usr/lib/modules-load.d@#ConditionDirectoryNotEmpty=|/usr/lib/modules-load.d@' /lib/systemd/system/systemd-modules-load.service
sed -i 's@ConditionDirectoryNotEmpty=|/usr/local/lib/modules-load.d@#ConditionDirectoryNotEmpty=|/usr/local/lib/modules-load.d@' /lib/systemd/system/systemd-modules-load.service
sed -i 's@ConditionDirectoryNotEmpty=|/etc/modules-load.d@#ConditionDirectoryNotEmpty=|/etc/modules-load.d@' /lib/systemd/system/systemd-modules-load.service
sed -i 's@ConditionDirectoryNotEmpty=|/run/modules-load.d@#ConditionDirectoryNotEmpty=|/run/modules-load.d@' /lib/systemd/system/systemd-modules-load.service
sed -i 's@ConditionKernelCommandLine=|modules-load@#ConditionKernelCommandLine=|modules-load@' /lib/systemd/system/systemd-modules-load.service
sed -i 's@ConditionKernelCommandLine=|rd.modules-load@#ConditionKernelCommandLine=|rd.modules-load@' /lib/systemd/system/systemd-modules-load.service
sudo systemctl daemon-reload
sudo systemctl restart systemd-modules-load
sudo lsmod
Étape 6 : Installer Cilium
A partir de cette étape il est possible d'installer Cilium
sur un cluster local sur le WSL2.
Guide complet
Pour connaître tous les détails, vous pouvez vous reporter à l'article Créer un cluster Kubernetes local avec Kind pour créer un cluster Kind
puis y déployer Cilium
.
Installation rapide
Pour installer Cilium
, nous allons passer par le chart Helm officiel dont voici la configuration requise.
cat <<EOT >> cilium-values.yaml
kubeProxyReplacement: strict
k8sServiceHost: lab-control-plane
k8sServicePort: 6443
hostServices:
enabled: false
externalIPs:
enabled: true
nodePort:
enabled: true
hostPort:
enabled: true
image:
pullPolicy: IfNotPresent
ipam:
mode: kubernetes
hubble:
enabled: true
relay:
enabled: true
EOT
Ensuite, nous pouvons installer le chart avec ces commandes.
helm repo add cilium https://helm.cilium.io/
docker pull quay.io/cilium/cilium:v1.15.4
kind load --name lab docker-image quay.io/cilium/cilium:v1.15.4
helm upgrade --install --namespace kube-system cilium cilium/cilium --version 1.15.4 --values cilium-values.yaml
Après un peu d'attente, vous devriez obtenir un résultat similaire en exécutant un kubectl get nodes
:
kubectl get nodes
NAME STATUS ROLES AGE VERSION
lab-control-plane Ready control-plane 9d v1.25.3
lab-worker Ready <none> 9d v1.25.3
lab-worker2 Ready <none> 9d v1.25.3
lab-worker3 Ready <none> 9d v1.25.3
lab-worker4 Ready <none> 9d v1.25.3
lab-worker5 Ready <none> 9d v1.25.3
Conclusion
En suivant ces étapes, vous aurez un noyau WSL2 personnalisé et prêt à utiliser avec Cilium. Cette configuration vous permettra de tirer parti des capacités avancées de mise en réseau et de sécurité de Cilium dans votre environnement WSL2.
Pour plus d'informations sur Cilium et son utilisation, consultez la documentation officielle de Cilium.
!!! quote "Sources"
- <https://gist.github.com/minatoaquaMK2/3ce3c8dfa302e2294a0810719fa2ac7b>
- <https://github.com/cilium/cilium/issues/29302#issuecomment-1879099471>
- <https://docs.cilium.io>
Posted on July 20, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.