DEV Community

Cover image for Installer Cilium sur WSL2
Benoît Garçon for La Formule Nuagique

Posted on • Originally published at formulenuagique.com

Installer Cilium sur WSL2

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
Enter fullscreen mode Exit fullscreen mode

É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"
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Étape 4 : Redémarrer WSL2 pour appliquer les modifications

Pour appliquer les changements, redémarrez WSL2 :

powershell.exe -Command "wsl --shutdown"
Enter fullscreen mode Exit fullscreen mode

Relancez ensuite WSL2 et vérifiez que le noyau chargé est celui que vous avez compilé :

uname -a
Enter fullscreen mode Exit fullscreen mode

É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
Enter fullscreen mode Exit fullscreen mode

É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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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>
Enter fullscreen mode Exit fullscreen mode

Top comments (0)