KubeVirt : des VMs dans Kubernetes


Un des trucs qui me manquait de Proxmox, c’était les VMs. Oui, les containers c’est bien, mais parfois t’as besoin d’une vraie machine virtuelle. C’est là qu’intervient KubeVirt.

C’est quoi KubeVirt ?

KubeVirt c’est un add-on pour Kubernetes qui permet de gérer des VMs comme des ressources Kubernetes. Tu définis ta VM en YAML, tu fais kubectl apply, et t’as une VM.

En dessous, ça utilise QEMU/KVM. Donc c’est de la vraie virtualisation hardware, pas de l’émulation.

Prérequis

Le plus important : VT-x (ou AMD-V) doit être activé dans le BIOS. Sans ça, pas de virtualisation hardware, et KubeVirt refuse de démarrer.

Sur mon R430, c’était déjà activé. On peut vérifier :

talosctl -n 192.168.1.100 read /proc/cpuinfo | grep vmx

Si t’as des lignes avec “vmx”, c’est bon.

Installation

# L'opérateur
kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/v1.1.2/kubevirt-operator.yaml

# KubeVirt lui-même
kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/v1.1.2/kubevirt-cr.yaml

# Attendre que tout soit prêt
kubectl wait --for=condition=ready pod -n kubevirt -l kubevirt.io=virt-handler --timeout=300s

Créer une VM

apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  name: ubuntu-vm
spec:
  running: true
  template:
    spec:
      domain:
        devices:
          disks:
            - name: rootdisk
              disk:
                bus: virtio
            - name: cloudinitdisk
              disk:
                bus: virtio
        resources:
          requests:
            memory: 4Gi
            cpu: 2
      volumes:
        - name: rootdisk
          containerDisk:
            image: quay.io/containerdisks/ubuntu:22.04
        - name: cloudinitdisk
          cloudInitNoCloud:
            userData: |
              #cloud-config
              users:
                - name: ubuntu
                  sudo: ALL=(ALL) NOPASSWD:ALL
              chpasswd:
                list: |
                  ubuntu:ubuntu
                expire: False
              ssh_pwauth: True
kubectl apply -f ubuntu-vm.yaml
kubectl get vms

Cloud-init

Le cloudInitNoCloud c’est ce qui configure la VM au premier boot. Tu peux :

  • Créer des utilisateurs
  • Définir des mots de passe
  • Ajouter des clés SSH
  • Installer des packages
  • Exécuter des scripts

C’est comme le cloud-init qu’on utilise sur AWS/GCP.

Accéder à la VM

Console

# Installer virtctl
VERSION=v1.1.2
curl -L -o virtctl https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/virtctl-${VERSION}-darwin-amd64
chmod +x virtctl && sudo mv virtctl /usr/local/bin/

# Console série
virtctl console ubuntu-vm

SSH

Pour SSH, faut exposer le port 22. J’ai créé un Service LoadBalancer :

apiVersion: v1
kind: Service
metadata:
  name: ubuntu-ssh
spec:
  type: LoadBalancer
  selector:
    kubevirt.io/vm: ubuntu-vm
  ports:
    - port: 22
      targetPort: 22

MetalLB attribue une IP, et je peux SSH :

ssh ubuntu@192.168.1.205

Les ContainerDisks

Les containerDisk c’est des images de disque packagées dans des containers. Quay.io en propose pour les principales distros :

  • quay.io/containerdisks/ubuntu:22.04
  • quay.io/containerdisks/fedora:39
  • quay.io/containerdisks/debian:12

L’avantage : pas besoin de télécharger des ISO ou de gérer du storage pour les images de base.

L’inconvénient : les données sont perdues à l’arrêt. Pour persister, faut utiliser un PVC.

VM avec stockage persistant

volumes:
  - name: rootdisk
    persistentVolumeClaim:
      claimName: ubuntu-disk

Avec un PVC :

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ubuntu-disk
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi

Ce que j’utilise les VMs pour

  • Kali Linux pour du pentesting (isolé du reste)
  • Windows quand j’ai vraiment besoin
  • Tests qui nécessitent un environnement propre

Pour le reste, les containers suffisent.

KubeVirt + Agent IA

Plus tard, j’ai ajouté des tools à mon agent IA pour créer des VMs :

"Crée une VM Ubuntu avec 8GB de RAM"

Et l’agent génère le YAML, l’applique, configure le SSH, et me donne les credentials.

Mais ça c’est l’histoire d’un autre article.


Prochain article : KubeSphere, l’échec - quand j’ai voulu une console et que ça a pas marché.