
Une fois KubeVirt installé, une machine virtuelle est une ressource Kubernetes comme une autre : on la décrit dans un manifeste VirtualMachine, on contrôle son démarrage avec runStrategy, et on la pilote avec virtctl. Ce guide crée une VM, l'initialise avec cloud-init et s'y connecte. Public : débutant à intermédiaire. Version : v1.8.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Écrire un manifeste
VirtualMachineminimal. - Contrôler le cycle de vie avec
runStrategyetvirtctl. - Injecter identifiants et configuration avec cloud-init.
- Accéder à la VM en console et en SSH.
Prérequis
Section intitulée « Prérequis »- Un cluster avec KubeVirt installé et
virtctldisponible (voir le guide d'installation). - En lab sans
/dev/kvm, l'émulation activée (le boot est plus lent).
Le manifeste d'une VM
Section intitulée « Le manifeste d'une VM »Une VM se compose d'un domaine (le matériel virtuel : disques, mémoire, interfaces) et de volumes (les sources de disques). Voici une VM cirros avec un disque système et un disque cloud-init.
apiVersion: kubevirt.io/v1kind: VirtualMachinemetadata: name: demospec: runStrategy: Manual # on pilote start/stop explicitement template: metadata: labels: kubevirt.io/vm: demo spec: domain: devices: disks: - name: os disk: { bus: virtio } - name: cloudinit disk: { bus: virtio } resources: requests: { memory: 256Mi } volumes: - name: os containerDisk: image: quay.io/kubevirt/cirros-container-disk-demo - name: cloudinit cloudInitNoCloud: userData: | #cloud-config password: kubevirt chpasswd: { expire: False }Deux objets se ressemblent mais ne jouent pas le même rôle : la VirtualMachine est la définition stable (elle survit aux redémarrages), et la VirtualMachineInstance (VMI) est l'instance en cours d'exécution, créée quand la VM démarre.
Contrôler le démarrage avec runStrategy
Section intitulée « Contrôler le démarrage avec runStrategy »Le champ runStrategy décide quand la VM doit tourner. Il remplace l'ancien spec.running booléen.
| runStrategy | Comportement |
|---|---|
Always | La VM tourne en permanence ; redémarrée si elle s'arrête |
RerunOnFailure | Relancée seulement après un échec, pas après un arrêt propre |
Manual | Démarrage et arrêt pilotés à la main (via virtctl) |
Halted | Toujours arrêtée |
Once | Démarrée une fois, non relancée ensuite |
Avec Manual, la VM créée reste arrêtée tant qu'on ne la démarre pas :
kubectl apply -f demo-vm.yamlkubectl get vm demo# NAME AGE STATUS READY# demo 0s Stopped FalsePiloter le cycle de vie avec virtctl
Section intitulée « Piloter le cycle de vie avec virtctl »virtctl déclenche les transitions. Au démarrage, une VMI apparaît et reçoit une IP dans le réseau de pods.
virtctl start demo# VM demo was scheduled to startkubectl get vmi demo# NAME PHASE IP NODENAME READY# demo Running 10.42.0.18 k3d-kubevirt-lab-server-0 True
virtctl stop demo# VM demo was scheduled to stopkubectl get vm demo# NAME STATUS READY# demo Stopped Falsevirtctl restart demo combine les deux, et virtctl pause/unpause gèlent l'exécution sans détruire la VMI.
Injecter de la configuration avec cloud-init
Section intitulée « Injecter de la configuration avec cloud-init »Le volume cloudInitNoCloud fournit à la VM un cloud-init au premier boot : mot de passe, clés SSH, paquets, scripts. Dans le manifeste ci-dessus, on fixe le mot de passe du compte par défaut.
Accéder à la VM
Section intitulée « Accéder à la VM »Trois accès, selon le besoin.
virtctl console demo # console série (quitter : Ctrl+])virtctl vnc demo # console graphique (nécessite un client VNC local)virtctl ssh cirros@demo # SSH via le tunnel virtctl, sans exposer la VMSur cette image cirros, le compte par défaut est cirros et le mot de passe est celui posé par cloud-init (kubevirt). Exposer la VM sur le réseau (Service, NodePort) relève du guide réseau.
Dépannage
Section intitulée « Dépannage »- La VM reste
StoppedavecrunStrategy: Manual: c'est attendu, lancezvirtctl start. - La VMI reste
Scheduling: ressources insuffisantes ou émulation non activée en lab. Voirkubectl describe vmi demo. - cloud-init ignoré : le volume
cloudInitNoClouddoit être attaché comme disque (entrée dansdomain.devices.disks), sinon la VM ne le lit pas. - Console qui ne répond pas : le boot en émulation est lent ; patientez avant
virtctl console.
À retenir
Section intitulée « À retenir »- Une VM se décrit dans un manifeste
VirtualMachine; l'exécution est portée par la VMI. runStrategycontrôle le démarrage ;Manuallaisse la main àvirtctl.virtctl start/stop/restartpilote le cycle de vie ; la VMI reçoit une IP de pod.- cloud-init (
cloudInitNoCloud) initialise identifiants, clés SSH et configuration au premier boot. - L'accès se fait en console, VNC ou SSH via
virtctl, sans exposer la VM.