Модуль находится в процессе активного развития. Функциональность может существенно измениться.

Как установить ОС в виртуальной машине из ISO-образа?

Рассмотрим установку ОС в виртуальной машине из ISO-образа на примере установки ОС Windows.

Для установки ОС нам потребуется ISO-образ ОС Windows. Необходимо его загрузить и опубликовать на каком-либо HTTP-сервисе, доступном из кластера.

Создадим пустой диск для установки ОС:

apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualMachineDisk
metadata:
  name: win-disk
  namespace: default
spec:
  persistentVolumeClaim:
    size: 100Gi
    storageClassName: local-path

Создадим ресурсы с ISO-образами ОС Windows и драйверами virtio:

apiVersion: virtualization.deckhouse.io/v1alpha2
kind: ClusterVirtualMachineImage
metadata:
  name: win-11-iso
spec:
  dataSource:
    type: HTTP
    http:
      url: "http://example.com/win11.iso"
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: ClusterVirtualMachineImage
metadata:
  name: win-virtio-iso
spec:
  dataSource:
    type: HTTP
    http:
      url: "https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso"

Создадим виртуальную машину:

apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualMachine
metadata:
  name: win-vm
  namespace: default
  labels:
    vm: win
spec:
  runPolicy: Manual
  osType: Windows
  bootloader: EFI
  cpu:
    cores: 6
    coreFraction: 50%
  memory:
    size: 8Gi
  enableParavirtualization: true
  blockDevices:
    - type: ClusterVirtualMachineImage
      clusterVirtualMachineImage:
        name: win-iso
    - type: ClusterVirtualMachineImage
      clusterVirtualMachineImage:
        name: win-virtio-iso
    - type: VirtualMachineDisk
      virtualMachineDisk:
        name: win-disk

После создания ресурса виртуальная машина будет запущена. К ней необходимо подключиться, с помощью графического установщика добавить драйверы virtio и выполнить установку ОС.

dvp vnc -n default win-vm

После окончания установки завершить работу виртуальной машины.

Далее необходимо модифицировать ресурс VirtualMachine и применить изменения:

spec:
  # ...
  runPolicy: AlwaysON
  # ...
  blockDevices:
    # Удалить из блока все ресурсы ClusterVirtualMachineImage с ISO-дисками.
    - type: VirtualMachineDisk
      virtualMachineDisk:
        name: win-disk

Как создать образ виртуальной машины для container registry

Образ диска виртуальной машины, хранящийся в container registry, должен быть сформирован специальным образом.

Пример Dockerfile для создания образа:

FROM scratch
COPY image-name.img /disk/image-name.img

Далее необходимо собрать образ и запушить его в container registry:

docker build -t docker.io/username/image:latest

docker push docker.io/username/image:latest

Как перенаправить трафик на виртуальную машину

Поскольку виртуальная машина функционирует в кластере Kubernetes, направление сетевого трафика на нее осуществляется аналогично направлению трафика на поды.

Для этого нужно всего лишь создать сервис с требуемыми настройками.

Допустим, у нас есть виртуальная машина с HTTP-сервисом, опубликованным на порте 80, и следующим набором меток:

apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualMachine
metadata:
  name: web
  labels:
    vm: web
spec: ...

Чтобы направить сетевой трафик на 80-й порт виртуальной машины, создадим сервис:

apiVersion: v1
kind: Service
metadata:
  name: svc-1
spec:
  ports:
    - name: http
      port: 8080
      protocol: TCP
      targetPort: 80
  selector:
    app: old

Настройки меток виртуальной машины мы можем менять «на лету», то есть изменение меток не требует рестарта виртуальной машины, а это значит, что мы можем конфигурировать перенаправление сетевого трафика с разных сервисов динамически.

Представим, что мы создали новый сервис и хотим перенаправить трафик на нашу виртуальную машину с него:

apiVersion: v1
kind: Service
metadata:
  name: svc-2
spec:
  ports:
    - name: http
      port: 8080
      protocol: TCP
      targetPort: 80
  selector:
    app: new

Изменив метки на виртуальной машине, мы перенаправим на нее сетевой трафик с сервиса svc-2:

metadata:
  labels:
    app: old

Как увеличить размер DVCR

Для увеличения размера нужно задать размер в конфигурации moduleconfig virtualization размер больший чем есть

Посмотреть текущий размер dvcr

kubectl get mc virtualization -o jsonpath='{.spec.settings.dvcr.storage.persistentVolumeClaim}'
#Output
{"size":"58G","storageClassName":"linstor-thick-data-r1"}

Задать размер

kubectl patch mc virtualization \
  --type merge -p '{"spec": {"settings": {"dvcr": {"storage": {"persistentVolumeClaim": {"size":"59G"}}}}}}'

#Output
moduleconfig.deckhouse.io/virtualization patched

Проверить изменение размера

kubectl get mc virtualization -o jsonpath='{.spec.settings.dvcr.storage.persistentVolumeClaim}'
#Output
{"size":"59G","storageClassName":"linstor-thick-data-r1"}

kubectl get pvc dvcr -n d8-virtualization
#Output
NAME   STATUS   VOLUME                                     CAPACITY     ACCESS MODES   STORAGECLASS            AGE
dvcr   Bound    pvc-6a6cedb8-1292-4440-b789-5cc9d15bbc6b   57617188Ki   RWO            linstor-thick-data-r1   7d