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.04quay.io/containerdisks/fedora:39quay.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é.