Aller au contenu

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