K3s dans WSL2¶
Installation de K3s dans la distribution WSL2 pour un cluster Kubernetes local, avec accès depuis Windows.
Rôle k3s¶
Ce rôle installe K3s dans WSL2 en utilisant la même approche que le tutoriel VDI Linux.
Variables par défaut¶
Créez roles/k3s/defaults/main.yml :
k3s_enabled: true
k3s_version: "v1.30"
k3s_wsl_distro: "Ubuntu"
k3s_wsl_user: "vdi-user"
k3s_test_namespace: "test-vdi"
Tâches principales¶
Créez roles/k3s/tasks/main.yml :
---
- name: Activer systemd dans WSL2
ansible.windows.win_shell: |
wsl -d {{ k3s_wsl_distro }} -u root -- bash -c '
echo "[boot]" > /etc/wsl.conf
echo "systemd=true" >> /etc/wsl.conf
'
- name: Redemarrer WSL2 pour activer systemd
ansible.windows.win_shell: |
wsl --shutdown
Start-Sleep -Seconds 5
wsl -d {{ k3s_wsl_distro }} -- echo "ready"
- name: Installer K3s dans WSL2
ansible.windows.win_shell: |
wsl -d {{ k3s_wsl_distro }} -u root -- bash -c '
curl -sfL https://get.k3s.io | INSTALL_K3S_CHANNEL="{{ k3s_version }}" sh -s - \
--write-kubeconfig-mode 644 \
--disable traefik
'
- name: Attendre que K3s soit pret
ansible.windows.win_shell: |
wsl -d {{ k3s_wsl_distro }} -- bash -c '
for i in $(seq 1 30); do
kubectl get nodes 2>/dev/null | grep -q " Ready" && exit 0
sleep 2
done
exit 1
'
- name: Copier le kubeconfig vers Windows
ansible.windows.win_shell: |
$kubedir = "$env:USERPROFILE\.kube"
New-Item -ItemType Directory -Path $kubedir -Force | Out-Null
wsl -d {{ k3s_wsl_distro }} -- cat /etc/rancher/k3s/k3s.yaml | Set-Content "$kubedir\config"
(Get-Content "$kubedir\config") -replace 'server: https://127.0.0.1:6443', 'server: https://localhost:6443' | Set-Content "$kubedir\config"
- name: Installer kubectl Windows
chocolatey.chocolatey.win_chocolatey:
name: kubernetes-cli
state: present
- name: Validation du role
ansible.builtin.include_tasks: validate.yml
tags: [validate]
Persistance K3s
Avec systemd=true dans /etc/wsl.conf, K3s démarré automatiquement avec WSL2. Si la VM est rebootee, il suffit de lancer WSL (wsl -d Ubuntu) pour que K3s revienne.
Accès réseau WSL2 → Windows¶
Le port forwarding entre WSL2 et Windows est automatique pour localhost. Un service expose sur le port 30080 dans K3s est accessible depuis Windows sur localhost:30080.
graph LR
Win["Windows<br>localhost:30080"] --> WSL["WSL2<br>Ubuntu"]
WSL --> K3s["K3s<br>NodePort 30080"]
K3s --> Pod["nginx Pod"] Assertions¶
Créez roles/k3s/tasks/validate.yml :
---
# --- Niveau 1 : technique ---
- name: "Assert : K3s actif dans WSL2"
ansible.windows.win_shell: |
wsl -d {{ k3s_wsl_distro }} -- systemctl is-active k3s
register: k3s_status
failed_when: "'active' not in k3s_status.stdout"
- name: "Assert : kubectl Windows fonctionne"
ansible.windows.win_command: kubectl version --client
changed_when: false
# --- Niveau 2 : cas d'usage ---
- name: "Assert : kubectl peut atteindre le cluster"
ansible.windows.win_command: kubectl get nodes
changed_when: false
- name: "Assert : Deployer un workload de test"
ansible.windows.win_shell: |
kubectl create namespace {{ k3s_test_namespace }} --dry-run=client -o yaml | kubectl apply -f -
kubectl -n {{ k3s_test_namespace }} run nginx-test --image=nginx --port=80
kubectl -n {{ k3s_test_namespace }} expose pod nginx-test --type=NodePort --port=80 --target-port=80
Start-Sleep -Seconds 10
$nodePort = kubectl -n {{ k3s_test_namespace }} get svc nginx-test -o jsonpath='{.spec.ports[0].nodePort}'
Invoke-WebRequest -Uri "http://localhost:$nodePort" -UseBasicParsing
kubectl delete namespace {{ k3s_test_namespace }}
changed_when: false
Limites¶
| Aspect | Statut |
|---|---|
| Dev / Test | Adapté |
| Production | Non recommande |
| Persistance des données | Via volumes WSL2 |
| Performances réseau | Overhead WSL2 (NAT) |
| GPU passthrough | Non supporte dans WSL2/K3s |