Skip to content

KubeVirt ​

https://kubevirt.io/

Quickstart ​

bash
# create image template
kubectl apply -f https://kubevirt.io/labs/manifests/vm.yaml
kubectl get vms

# start vm
virtctl start testvm # it would show up as `pod`
kubectl get vmis # running instances

# access vm
virtctl console testvm
virtctl ssh -i ~/.ssh/kubevirt-debian ubuntu@vmi/debian-vm -n vms # tty
virtctl vnc testvm # gui

# teardown
virtctl stop testvm
kubectl delete vm testvm

Example config ​

bash
---
apiVersion: v1
kind: Service
metadata:
  name: debian-vm-ssh
  namespace: vms
spec:
  type: NodePort
  selector:
    kubevirt.io/vm: debian-vm
  ports:
    - protocol: TCP
      port: 22
      targetPort: 22
      nodePort: 30200
---
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  name: debian-vm
  namespace: vms
spec:
  runStrategy: Halted
  template:
    spec:
    metadata:
      labels:
        kubevirt.io/vm: debian-vm
      architecture: amd64
      domain:
        devices:
          disks:
            - name: debian-boot-volume
              disk:
                bus: virtio
            - name: cloudinitdisk
              disk:
                bus: virtio
          interfaces:
            - name: default
              masquerade: {}
        resources:
          requests:
            memory: 512Mi
            cpu: 1
        cpu:
          cores: 2
      networks:
        - name: default
          pod: {}
      volumes:
        - name: debian-boot-volume
          dataVolume:
            name: debian-boot-volume
        - name: cloudinitdisk
          cloudInitNoCloud:
            userData: |
              #cloud-config
              hostname: debian-vm
              users:
              - name: debian
                sudo: ALL=(ALL) NOPASSWD:ALL
                shell: /bin/bash
                ssh_authorized_keys:
                - ssh-ed25519 xxx
              ssh_pwauth: true
              disable_root: false
              chpasswd:
                list: |
                  debian:debian
                expire: false
              package_update: true
              packages:
              - qemu-guest-agent
              runcmd:
              - systemctl enable ssh
              - systemctl start ssh
            networkData: |-
              network:
                version: 2
                ethernets:
                  enp1s0:
                    match:
                      name: e*
                    dhcp4: true
                    dhcp6: true
                    set-name: "enp1s0"
  dataVolumeTemplates:
    - metadata:
        name: debian-boot-volume
      spec:
        source:
          registry:
            url: "docker://quay.io/containerdisks/debian:latest"
            platform:
              architecture: amd64
        storage:
          resources:
            requests:
              storage: 8Gi
          accessModes:
            - ReadWriteOnce

Monitoring ​

https://github.com/kubevirt/monitoring

Cookbooks ​

Fix no internet on reboot ​

sudo vi /etc/netplan/50-cloud-init.yaml

yaml
network:
  version: 2
  ethernets:
    enp1s0:
      match:
        # macaddress: "xx:xx:xx:xx:xx:xx"
        name: e* # add this line
      dhcp4: true
      dhcp6: true
      set-name: "enp1s0"

Then sudo netplan apply

Use cloud-init image for data volume ​

yaml
spec:
  source:
    http:
      url: "https://cloud-images.ubuntu.com/releases/24.04/release/ubuntu-24.04-server-cloudimg-amd64.img"

Patch storageprofile for headlamp kubevirt gui wizard when on k3s ​

bash
kubectl patch storageprofile local-path --type=merge -p '{
  "spec": {
    "claimPropertySets": [
      {
        "accessModes": ["ReadWriteOnce"],
        "volumeMode": "Filesystem"
      }
    ]
  }
}'

References ​