Zurück zum Blog

Was ist KubeVirt? Virtuelle Maschinen auf Kubernetes betreiben wie Container

Christof Lüthi - tim&koko•

Container auf Kubernetes zu betreiben, ist heute Standard – viele Organisationen sind aber weiterhin auf kritische Workloads angewiesen, die in virtuellen Maschinen leben. Sie neu zu schreiben oder zu ersetzen, ist nicht immer realistisch. KubeVirt schliesst diese Lücke und erweitert Kubernetes so, dass du virtuelle Maschinen genau wie Container betreiben und verwalten kannst – mit denselben APIs, Tools und Automatisierungen, die du ohnehin schon nutzt.

Was ist KubeVirt

KubeVirt wurde 2016 von Red Hat initiiert und ist seit 2017 als Open-Source- Software verfügbar. Das Projekt gehört zur Cloud Native Computing Foundation (CNCF) und erreichte im April 2022 den Reifegrad «Incubating».

KubeVirt ist eine Kubernetes-Erweiterung auf Basis des Operator-Patterns. Damit können wir virtuelle Maschinen (VMs) neben Containern betreiben und verwalten – alles mit denselben APIs, Tools und Workflows.

Warum es KubeVirt gibt

Kubernetes hat revolutioniert, wie wir containerisierte Applikationen deployen und verwalten. Aber was ist mit den Workloads, die weiterhin als VMs laufen und sich nicht einfach containerisieren lassen? Sie neu zu schreiben oder zu refactoren, kann komplex und teuer oder schlicht unmöglich sein. Genau hier kommt KubeVirt ins Spiel.

Mit KubeVirt kannst du:

  • VMs innerhalb von Kubernetes betreiben, genau wie Pods.
  • Dieselben Kubernetes-Tools nutzen – kubectl, Helm, Argo CD usw.
  • Dieselben cloud-nativen Workflows nutzen – GitOps, Pipelines
  • Container und VMs über eine einzige Control Plane verwalten.

Bei KubeVirt geht es nicht darum, VMs zu ersetzen – es geht darum, zu vereinheitlichen, wie du sie baust und betreibst.

Kernkonzepte

KubeVirt-Ressource / -Tool Beschreibung Kubernetes-Analogie
VirtualMachine (VM) Definiert Konfiguration und Lebenszyklus einer VM Deployment
VirtualMachineInstance (VMI) Eine laufende Instanz einer VM; entsteht beim Starten einer VirtualMachine Pod
VirtualMachineInstanceReplicaSet (VMIRS) Stellt eine gewünschte Anzahl VM-Instanzen sicher (wie das Skalieren zustandsloser VMs) ReplicaSet
DataVolume (DV) Verwaltet Disk-Images – angetrieben vom Containerized Data Importer (CDI) PersistentVolumeClaim
PersistentVolumeClaim (PVC) Fordert Storage für VM-Disks an (Block oder File) PersistentVolumeClaim
VirtualMachineSnapshot Erfasst den Zustand einer VM und ihrer Disks für Backup oder Restore VolumeSnapshot
virtctl CLI Kommandozeilen-Tool zur Verwaltung von VMs kubectl für VMs
KubeVirt Operator (CR) Verwaltet den Lebenszyklus der KubeVirt-Komponenten im Cluster Operator

Wie es funktioniert

Unter der Haube:

  • KubeVirt nutzt den Linux-KVM-Hypervisor (Kernel-Based Virtual Machines)
  • KVM-VMs sind ganz normale Linux-Prozesse
  • KubeVirt/Kubernetes isoliert diesen Prozess mit Linux-Kernel-Features wie Control Groups (cgroups) und Kernel Namespaces – genau wie jeden anderen containerisierten Prozess.
  • Jeder KVM-Prozess läuft gekapselt in einem Pod. Kubernetes weiss nichts über VMs – es gibt nur Pods und Container.
  • Der Kubernetes-Scheduler entscheidet, wo der VM-Pod läuft
  • KubeVirt nutzt ein DaemonSet, um den VM-Pod vorzubereiten (Netzwerk, Devices, …)
  • VM-Pods führen Tooling aus, das mit dem KVM-Hypervisor (QEMU, libvirt) kommuniziert, um die virtuelle Maschine im VM-Pod zu starten
  • Networking und Storage nutzen dieselben CNI- und CSI-Plugins von Kubernetes

Starte deine erste VM

Voraussetzung, um virtuelle Maschinen auf deinem Kubernetes-Cluster zu starten, ist ein laufender KubeVirt-Operator. Du installierst den Operator so:

export V=$(curl -s https://storage.googleapis.com/kubevirt-prow/release/kubevirt/kubevirt/stable.txt)
kubectl create -f "https://github.com/kubevirt/kubevirt/releases/download/${V}/kubevirt-operator.yaml"
kubectl create -f "https://github.com/kubevirt/kubevirt/releases/download/${V}/kubevirt-cr.yaml"

Um mit der virtuellen Maschine zu interagieren, willst du höchstwahrscheinlich das Tool virtctl verwenden. Du kannst virtctl von der GitHub-Releases-Seite oder direkt in deiner Shell herunterladen:

ARCH=$(uname -s | tr A-Z a-z)-$(uname -m | sed 's/x86_64/amd64/') || windows-amd64.exe
curl -L -o virtctl https://github.com/kubevirt/kubevirt/releases/download/${V}/virtctl-${V}-${ARCH}
chmod +x virtctl

Jetzt ist es Zeit, deine erste VM zu starten. Erstelle eine Datei namens vm-cirros.yaml mit folgendem Inhalt:

kind: VirtualMachine
metadata:
  name: vm-cirros
spec:
  runStrategy: Always
  template:
    metadata:
      labels:
        kubevirt.io/size: small
        kubevirt.io/domain: vm-cirros
    spec:
      domain:
        devices:
          disks:
            - name: containerdisk
              disk:
                bus: virtio
          interfaces:
            - name: default
              masquerade: {}
        resources:
          requests:
            memory: 64M
      networks:
        - name: default
          pod: {}
      volumes:
        - name: containerdisk
          containerDisk:
            image: quay.io/kubevirt/cirros-container-disk-demo

Erstelle die neue VirtualMachine-Ressource mit folgendem Befehl in deinem Kubernetes-Cluster:

kubectl apply -f vm-cirros.yaml

Damit wird die Ressource der virtuellen Maschine im Cluster angelegt. Da wir runStrategy auf Always gesetzt haben, fordern wir KubeVirt auf, sicherzustellen, dass die VM immer läuft. Es ist daher zu erwarten, dass der KubeVirt-Operator die Ressource automatisch aufnimmt und eine laufende VM-Instanz erzeugt. Ein Pod, der eine virtuelle Maschine kapselt, heisst immer virt-launcher-<vm-name>-\*.

kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
virt-launcher-vm-cirros-k9dlb   3/3     Running   0          10m
...

Mit dem Befehl virtctl kannst du den Zustand deiner VM verwalten (starten, stoppen, …) und dich per Konsole, SSH oder VNC auf deine VM verbinden:

virtctl console vm-cirros
login as 'cirros' user. default password: 'gocubsgo'. use 'sudo' for root.
cirros login:

Gratuliere, du hast erfolgreich deine erste virtuelle Maschine auf Kubernetes gestartet.

Wann du KubeVirt einsetzen solltest

Setze KubeVirt ein, wenn du:

  • Legacy- oder Hersteller-Apps hast, die sich nicht containerisieren lassen: Betreibe sie als VMs in deiner Kubernetes-Plattform, neben modernen containerisierten Services.
  • Eine einheitliche Plattform für VMs und Container aufbaust: Eine Control Plane (Kubernetes) für Networking, Storage, Monitoring und Automatisierung.
  • Schrittweise modernisieren willst: Workloads zuerst per Lift-and-Shift als VMs übernehmen und sie dann im eigenen Tempo in Container überführen.
  • Durchgängiges CI/CD oder GitOps für alles brauchst: VM-Definitionen in Git verwalten und mit Argo CD deployen, genau wie Container.
  • Kurzlebige oder Test-VMs in Kubernetes-Clustern betreibst: Ideal für Entwicklung, Integrationstests oder kurzlebige Sandbox-Umgebungen.
  • und vieles mehr

Warum KubeVirt wichtig ist

KubeVirt ist wichtig, weil es die Verwaltung von virtuellen Maschinen und Containern unter einer einzigen Kubernetes-Control-Plane vereint. So können Teams in ihrem eigenen Tempo modernisieren – Legacy-Applikationen als VMs betreiben und gleichzeitig neue Services als Container bauen. Indem VMs als native Kubernetes-Ressourcen behandelt werden, ermöglicht KubeVirt durchgängige Automatisierung, Observability und GitOps-Workflows über alle Workloads hinweg. Es macht parallele Infrastrukturen überflüssig, reduziert die Betriebskomplexität und schlägt die Brücke zwischen klassischer Virtualisierung und Cloud-native Computing.