Aller au contenu
Virtualisation medium

Installer KubeVirt sur un cluster de lab (sans /dev/kvm)

6 min de lecture

Logo Kubevirt

Installer KubeVirt se fait en deux temps : on déploie d'abord son opérateur, puis on crée la ressource KubeVirt qui déclenche l'installation des composants. Ce guide couvre le cas le plus courant en apprentissage : un cluster de lab (ici k3d) sur une machine sans /dev/kvm, grâce à l'émulation logicielle. Public : débutant à intermédiaire sur Kubernetes. Version : v1.8.

Vous allez déployer l'opérateur, activer l'émulation, vérifier que KubeVirt est prêt, installer virtctl, et valider le tout avec une VM qui démarre réellement.

  • Déployer l'opérateur KubeVirt et les composants.
  • Activer l'émulation logicielle pour un lab sans /dev/kvm.
  • Vérifier l'installation et installer virtctl.
  • Valider avec une première VM.
  • Un cluster Kubernetes de lab. Ici k3d ; minikube ou kind conviennent aussi.
  • kubectl configuré sur ce cluster.
  • Accès sortant pour tirer les images depuis quay.io et GitHub.

Un cluster k3d jetable suffit. KubeVirt a besoin de pods privilégiés, ce que k3d autorise par défaut.

Fenêtre de terminal
k3d cluster create kubevirt-lab --wait
kubectl config use-context k3d-kubevirt-lab
  1. Déployer l'opérateur. On épingle la dernière version stable, exposée par le projet.

    Fenêtre de terminal
    VER=$(curl -sL https://storage.googleapis.com/kubevirt-prow/release/kubevirt/kubevirt/stable.txt)
    echo "$VER" # v1.8.4
    kubectl apply -f "https://github.com/kubevirt/kubevirt/releases/download/${VER}/kubevirt-operator.yaml"
    kubectl -n kubevirt rollout status deploy/virt-operator --timeout=120s
    # deployment "virt-operator" successfully rolled out
  2. Activer KubeVirt avec l'émulation. La ressource KubeVirt pilote l'installation ; le champ useEmulation bascule en mode logiciel.

    kubevirt-cr.yaml
    apiVersion: kubevirt.io/v1
    kind: KubeVirt
    metadata:
    name: kubevirt
    namespace: kubevirt
    spec:
    configuration:
    developerConfiguration:
    useEmulation: true # lab sans /dev/kvm : QEMU en mode TCG
    Fenêtre de terminal
    kubectl apply -f kubevirt-cr.yaml
    kubectl -n kubevirt wait kv kubevirt --for=condition=Available --timeout=360s
    # kubevirt.kubevirt.io/kubevirt condition met

    Le déploiement tire plusieurs images ; comptez quelques minutes au premier lancement.

  3. Vérifier l'état. La phase passe à Deployed et les composants tournent.

    Fenêtre de terminal
    kubectl get kubevirt -n kubevirt
    # NAME AGE PHASE
    # kubevirt 2m52s Deployed
    kubectl get pods -n kubevirt
    # virt-api-... 1/1 Running
    # virt-controller-... 1/1 Running (x2)
    # virt-handler-... 1/1 Running (DaemonSet, 1 par nœud)
    # virt-operator-... 1/1 Running (x2)

    Chaque composant a un rôle : virt-api (API agrégée), virt-controller (cycle de vie des VM), virt-handler (agent par nœud qui pilote libvirt), virt-operator (installe et met à jour l'ensemble).

virtctl est la CLI compagnon pour piloter les VM (console, VNC, start/stop, migration). On installe le binaire de la même version.

Fenêtre de terminal
curl -sL -o virtctl \
"https://github.com/kubevirt/kubevirt/releases/download/${VER}/virtctl-${VER}-linux-amd64"
chmod +x virtctl && sudo mv virtctl /usr/local/bin/
virtctl version --client
# Client Version: ... GitVersion:"v1.8.4" ...

Elle s'installe aussi en plugin kubectl via krew (kubectl krew install virt), auquel cas on l'appelle avec kubectl virt ....

Le vrai test : une VM qui démarre. On utilise une image cirros minuscule, empaquetée en containerDisk (un disque livré dans une image de conteneur).

testvm.yaml
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
name: testvm
spec:
runStrategy: Always
template:
spec:
domain:
devices:
disks:
- name: containerdisk
disk:
bus: virtio
resources:
requests:
memory: 128Mi
volumes:
- name: containerdisk
containerDisk:
image: quay.io/kubevirt/cirros-container-disk-demo
Fenêtre de terminal
kubectl apply -f testvm.yaml
kubectl get vm,vmi
# virtualmachine.../testvm Running True
# virtualmachineinstance.../testvm Running 10.42.0.17 ... True

La VM atteint l'état Running et le VMI (l'instance en cours) reçoit une adresse IP dans le réseau de pods. En émulation, le boot est lent mais bien réel. Nettoyage : kubectl delete vm testvm.

  • La VMI reste en Scheduling/Pending : souvent l'émulation n'est pas activée alors que /dev/kvm est absent. Vérifiez useEmulation: true dans la CR, puis kubectl describe vmi testvm.
  • virt-handler en CrashLoopBackOff : le cluster n'autorise pas les pods privilégiés. Sur k3d/k3s c'est bon par défaut ; sur un cluster durci, il faut l'autoriser pour le namespace kubevirt.
  • Images non tirées : quay.io inaccessible. Vérifiez la sortie réseau du cluster.
  • Boot très lent : normal en TCG. Pour des perfs réelles, un nœud avec /dev/kvm et sans useEmulation.
  • KubeVirt s'installe en deux temps : opérateur puis ressource KubeVirt.
  • L'émulation logicielle (useEmulation: true) permet un lab sans virtualisation matérielle.
  • kubectl get kubevirt doit afficher Deployed et les pods virt-* Running.
  • virtctl est la CLI indispensable pour piloter les VM.
  • Une VM containerDisk cirros valide l'installation de bout en bout.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn