kubevirt

Erstellen Ihrer ersten virtuellen Maschine mit KubeVirt

Abubakar Siddiq Ango
Abubakar Siddiq Ango Senior Developer Advocate
27. April 2026 3 Min. Lesezeit Anfänger
Erste Schritte Virtualisierung virtctl

Voraussetzungen

  • Sie haben KubeVirt auf Ihrem Cluster installiert
  • kubectl und virtctl auf Ihrem Rechner
  • Grundlegende Kenntnisse in der Anwendung von Kubernetes-Manifesten

A Virtuelle Maschine ist ein Kubernetes-Objekt. Man schreibt es als YAML und wendet es mit kubectl apply -f, und es erscheint unter kubectl get vm wie jede andere Ressource – mit Namespace, RBAC-fähig, überwachbar und durch Labels verwaltet. Dieses Tutorial setzt diese Idee in etwa fünfzehn Minuten in eine laufende Linux-VM um.

Warum ein containerDisk?

Der schnellste Weg zu einer funktionsfähigen VM besteht darin, den Import des Images ganz zu überspringen. Das Projekt „kubevirt/containerdisks“ veröffentlicht Cloud-Images für Ubuntu, Fedora, Debian, openSUSE und CentOS Stream, die in Container-Images verpackt sind, unter quay.io/containerdisks/*. Ihr Cluster ruft diesen genauso ab wie jeden anderen Container – ohne CDI, ohne PVC und ohne Wartezeit für den Download einer 600-MB-qcow2-Datei. Container-Festplatten sind schreibgeschützt und kurzlebig, was zum Kennenlernen der API völlig ausreicht. Persistenter storage in einem späteren Tutorial storage .

Das Manifest

Als speichern vm.yaml:

apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  name: testvm
spec:
  runStrategy: Halted
  template:
    metadata:
      labels:
        kubevirt.io/size: small
        kubevirt.io/domain: testvm
    spec:
      domain:
        devices:
          disks:
            - name: containerdisk
              disk:
                bus: virtio
            - name: cloudinitdisk
              disk:
                bus: virtio
          interfaces:
            - name: default
              masquerade: {}
        resources:
          requests:
            memory: 1Gi
            cpu: "1"
      networks:
        - name: default
          pod: {}
      volumes:
        - name: containerdisk
          containerDisk:
            image: quay.io/containerdisks/ubuntu:22.04
        - name: cloudinitdisk
          cloudInitNoCloud:
            userData: |
              #cloud-config
              password: ubuntu
              chpasswd: { expire: False }
              ssh_pwauth: True

Ausführungsstrategie: Angehalten ist die sichere Standardeinstellung. Sie teilt KubeVirt mit: Erstellen Sie das VM-Objekt, starten Sie es jedoch nicht. Man wendet das Manifest an, überprüft das Ergebnis und startet die VM dann explizit. Diese Trennung ist sinnvoll – sie verhindert, dass man versehentlich Workloads startet, während man einen YAML-Fehler behebt.

Die cloudInitNoCloud blockiert die Erststartkonfiguration des Gastes. Hier wird die Ubuntu das Passwort des Benutzers in Ubuntu und ermöglicht die Anmeldung über die serielle Konsole mittels Passwort. Im nächsten Tutorial wird dies durch die Authentifizierung per SSH-Schlüssel ersetzt.

Anwenden, starten, anhängen

Erstellen Sie einen Namespace für das Projekt und wenden Sie das Manifest an:

export NS=kubev-lab-$(whoami)
kubectl create namespace $NS
kubectl config set-context --current--namespace=$NS
kubectl apply -f vm.yaml
kubectl get vm testvm

Sie sollten die VM als Angehalten, Bereit: Falsch. Das Objekt existiert, aber noch kein VMI – genau das, was Ausführungsstrategie: Angehalten Versprechen.

Los geht's:

virtctl start testvm
kubectl get vmi testvm --watch

Sehen Sie sich das Virtuelle Maschineninstanz Durchgang TerminplanungGeplantLaufen. Drücken Sie Strg+C, sobald das Programm läuft. Im Hintergrund hat KubeVirt eine virt-launcher Pod auf einem Worker-Knoten – der QEMU/KVM-Prozess, der ist Ihre VM:

kubectl get pods -l kubevirt.io/domain=testvm

Öffnen Sie nun die serielle Konsole:

virtctl console testvm

Warten Sie beim ersten Start 30 bis 60 Sekunden, bis cloud-init abgeschlossen ist. Anschließend gelangen Sie zur Ubuntu-Anmeldeaufforderung. Melden Sie sich an als Ubuntu / Ubuntu und ein bisschen stöbern:

uname -a
cat /etc/os-release
ip addr

Trennen mit Strg+] (Strg + eckige Klammer schließen). Bitte nicht tippen Beenden — wodurch man sich vom Gast abmeldet, virtctl jedoch weiterhin verbunden bleibt, was den nächsten Nutzer überrascht.

Drei Ebenen, eine VM

Das mentale Modell, das alles andere verständlich macht: Eine laufende KubeVirt-VM besteht aus drei übereinander gestapelten Kubernetes-Objekten.

kubectl get vm,vmi,pods -l kubevirt.io/domain=testvm

Du wirst einen sehen Virtuelle Maschine (die seit langem bestehende Spezifikation), eine Virtuelle Maschineninstanz (die laufende Instanz, die beim Beenden gelöscht wird) und eine virt-launcher-* pod (der eigentliche Hypervisor-Prozess). Wenn Sie die VM mit virtctl stop… verschwinden das VMI und der Pod; das VM-Objekt bleibt bestehen. Startet man es erneut, werden ein neues VMI und ein neuer Pod erstellt. Das ist dasselbe Abgleichmuster, das Kubernetes für Deployments und Pods verwendet – es läuft lediglich auf einem Hypervisor ab.

Wie geht es weiter?

Gehen testvm läuft. Das nächste Tutorial knüpft hier an und führt durch die vier Lebenszyklus-Operationen (Start, Stopp, Pause, Wiedergabe fortsetzen) und ersetzt das Passwort durch einen SSH-Schlüssel, sodass du eine Verbindung herstellen kannst mit virtctl ssh anstelle der seriellen Konsole.