Функциональность модуля может измениться, но основные возможности сохранятся. Совместимость с будущими версиями обеспечивается, но может потребовать дополнительных действий по миграции.

С детальным описанием параметров настройки ресурсов приведенных в данном документе вы можете ознакомится в разделе Custom Resources

Быстрый старт

Пример создания виртуальной машины с Ubuntu 22.04.

  1. Создайте namespace для виртуальных машин с помощью команды:
  kubectl create ns vms
  1. Создайте образ виртуальной машины из внешнего источника. Пример:
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualImage
metadata:
  name: ubuntu
  namespace: vms
spec:
  storage: ContainerRegistry
  dataSource:
    type: HTTP
    http:
      url: "https://cloud-images.ubuntu.com/minimal/releases/jammy/release-20230615/ubuntu-22.04-minimal-cloudimg-amd64.img"
  1. Создайте диск виртуальной машины из созданного образа. Пример:
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualDisk
metadata:
  name: linux-disk
  namespace: vms
spec:
  persistentVolumeClaim:
    size: 10Gi
    storageClassName: linstor-thin-r2 # Подставьте ваше название SC `kubectl get storageclass`.
  dataSource:
    type: ObjectRef
    objectRef:
      kind: VirtualImage
      name: ubuntu

После создания VirtualDisk в namespace vms, запустится pod с именем vd-importer-*, который осуществит загрузку заданного образа.

  1. Посмотрите текущий статус ресурса с помощью команды:
kubectl -n vms get virtualdisk -o wide

# NAME         PHASE   CAPACITY   PROGRESS   STORAGECLASS        TARGETPVC                                            AGE
# linux-disk   Ready   10Gi       100%       linstor-thin-r2   vd-linux-disk-2ee8a41a-a0ed-4a65-8718-c18c74026f3c   5m59s
  1. Создайте виртуальную машину из следующей спецификации:
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualMachine
metadata:
  name: linux-vm
  namespace: vms
  labels:
    vm: linux
spec:
  virtualMachineClassName: generic # Класс виртуальный машины, который определяет тп vCPU, политику размера ресурсов и размещение виртуальной машины на узлах кластера.
  runPolicy: AlwaysOn # Виртуальная машина должна быть всегда включена.
  enableParavirtualization: true # Использовать паравиртуализацию (virtio).
  osType: Generic
  bootloader: BIOS
  cpu:
    cores: 1
    coreFraction: 10% # Запросить 10% процессорного времени одного ядра.
  memory:
    size: 1Gi
  provisioning: # Пример cloud-init-сценария для создания пользователя cloud с паролем cloud.
    type: UserData
    userData: |
      #cloud-config
      users:
      - name: cloud
        passwd: $6$rounds=4096$vln/.aPHBOI7BMYR$bBMkqQvuGs5Gyd/1H5DP4m9HjQSy.kgrxpaGEHwkX7KEFV8BS.HZWPitAtZ2Vd8ZqIZRqmlykRCagTgPejt1i.
        shell: /bin/bash
        sudo: ALL=(ALL) NOPASSWD:ALL
        chpasswd: { expire: False }
        lock_passwd: false
        ssh_authorized_keys:
          - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDTXjTmx3hq2EPDQHWSJN7By1VNFZ8colI5tEeZDBVYAe9Oxq4FZsKCb1aGIskDaiAHTxrbd2efoJTcPQLBSBM79dcELtqfKj9dtjy4S1W0mydvWb2oWLnvOaZX/H6pqjz8jrJAKXwXj2pWCOzXerwk9oSI4fCE7VbqsfT4bBfv27FN4/Vqa6iWiCc71oJopL9DldtuIYDVUgOZOa+t2J4hPCCSqEJK/r+ToHQbOWxbC5/OAufXDw2W1vkVeaZUur5xwwAxIb3wM3WoS3BbwNlDYg9UB2D8+EZgNz1CCCpSy1ELIn7q8RnrTp0+H8V9LoWHSgh3VCWeW8C/MnTW90IR      
  blockDeviceRefs:
    - kind: VirtualDisk
      name: linux-disk
  1. Проверьте с помощью команды, что виртуальная машина создана и запущена:
kubectl -n vms get virtualmachine -o wide

# NAME       PHASE     CORES   COREFRACTION   MEMORY   NODE           IPADDRESS    AGE
# linux-vm   Running   1       10%            1Gi      virtlab-pt-1   10.66.10.2   61s
  1. Подключитесь с помощью консоли к виртуальной машине (для выхода из консоли необходимо нажать Ctrl+]):
d8 v console -n vms linux-vm

# Successfully connected to linux-vm console. The escape sequence is ^]
#
# linux-vm login: cloud
# Password: cloud
# ...
# cloud@linux-vm:~$

Проектные образы

VirtualImage используются для хранения образов виртуальных машин.

Образы могут быть следующих видов:

  • Образ диска виртуальной машины, который предназначен для тиражирования идентичных дисков виртуальных машин.
  • ISO-образ, содержащий файлы для установки ОС. Этот тип образа подключается к виртуальной машине как cdrom.

Ресурс VirtualImage доступен только в том пространстве имен, в котором был создан.

Образы могут быть получены из различных источников, таких как HTTP-серверы, на которых расположены файлы образов, или контейнерные реестры (container registries), где образы сохраняются и становятся доступны для скачивания. Также существует возможность загрузить образы напрямую из командной строки, используя утилиту curl.

Создание и использование образа c HTTP-ресурса

  1. Создайте VirtualImage:
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualImage
metadata:
  name: ubuntu-img
  namespace: vms
spec:
  storage: ContainerRegistry
  dataSource:
    type: HTTP
    http:
      url: "https://cloud-images.ubuntu.com/minimal/releases/jammy/release-20230615/ubuntu-22.04-minimal-cloudimg-amd64.img"
  1. Проверьте результат с помощью команды:
kubectl -n vms get virtualimage -o wide

# NAME         PHASE   CDROM   PROGRESS   STOREDSIZE   UNPACKEDSIZE   REGISTRY URL                                   AGE
# ubuntu-img   Ready   false   100%       285.9Mi      2.2Gi          dvcr.d8-virtualization.svc/vi/vms/ubuntu-img   29s

Создание и использование образа из container registry

Cформируйте образ для хранения в container registry.

Ниже представлен пример создания образа c диском Ubuntu 22.04.

  • Загрузите образ локально:
curl -L https://cloud-images.ubuntu.com/minimal/releases/jammy/release-20230615/ubuntu-22.04-minimal-cloudimg-amd64.img -o ubuntu2204.img
  • Создайте Dockerfile со следующим содержимым:
FROM scratch
COPY ubuntu2204.img /disk/ubuntu2204.img
  • Соберите образ и загрузите его в container registry. В качестве container registry в примере ниже использован docker.io. для выполнения вам необходимо иметь учетную запись сервиса и настроенное окружение.
docker build -t docker.io/username/ubuntu2204:latest

где username — имя пользователя, указанное при регистрации в docker.io.

  • Загрузите созданный образ в container registry с помощью команды:
docker push docker.io/username/ubuntu2204:latest
  • Чтобы использовать этот образ, создайте в качестве примера ресурс VirtualImage:
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualImage
metadata:
  name: ubuntu-2204
spec:
  storage: ContainerRegistry
  dataSource:
    type: ContainerImage
    containerImage:
      image: docker.io/username/ubuntu2204:latest
  • Чтобы посмотреть ресурс и его статус, выполните команду:
kubectl get virtualimage

Загрузка образа из командной строки

  1. Чтобы загрузить образ из командной строки, предварительно создайте следующий ресурс, как представлено ниже на примере VirtualImage:
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualImage
metadata:
  name: some-image
spec:
  storage: ContainerRegistry
  dataSource:
    type: Upload
  1. После того как ресурс будет создан, проверьте его статус с помощью команды:
kubectl get virtualimages some-image -o json | jq .status.uploadCommand -r

> uploadCommand: curl https://virtualization.example.com/upload/dSJSQW0fSOerjH5ziJo4PEWbnZ4q6ffc -T example.iso

VirtualImage с типом Upload ожидает начала загрузки образа 15 минут после создания. По истечении этого срока ресурс перейдет в состояние Failed.

  1. Загрузите образ Cirros (представлено в качестве примера):
curl -L http://download.cirros-cloud.net/0.5.1/cirros-0.5.1-x86_64-disk.img -o cirros.img
  1. Выполните загрузку образа:
curl https://virtualization.example.com/upload/dSJSQW0fSOerjH5ziJo4PEWbnZ4q6ffc -T cirros.img

После завершения работы команды curl образ должен быть создан.

  1. Проверьте, что статус созданного образа Ready:
kubectl get virtualimages -o wide

# NAME          PHASE   CDROM   PROGRESS   STOREDSIZE   UNPACKEDSIZE   REGISTRY URL                                 AGE
# some-image    Ready   false   100%       285.9Mi      2.2Gi          dvcr.d8-virtualization.svc/vi/vms/some-image    2m21s

Диски

Диски в виртуальных машинах необходимы для записи и хранения данных, обеспечивая полноценное функционирование приложений и операционных систем. Под “капотом” этих дисков используется хранилище, предоставляемое платформой.

Чтобы узнать доступные варианты хранилищ на платформе, выполните следующую команду:

kubectl get storageclass

# NAME                  PROVISIONER                           RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
# ceph-pool-r2-csi-rbd  rbd.csi.ceph.com                      Delete          Immediate              true                   85d
# i-linstor-thin-r1     replicated.csi.storage.deckhouse.io   Delete          Immediate              true                   19d
# i-linstor-thin-r2     replicated.csi.storage.deckhouse.io   Delete          Immediate              true                   19d
# i-linstor-thin-r3     replicated.csi.storage.deckhouse.io   Delete          Immediate              true                   19d
# linstor-thin-r1       replicated.csi.storage.deckhouse.io   Delete          WaitForFirstConsumer   true                   19d
# linstor-thin-r2       replicated.csi.storage.deckhouse.io   Delete          WaitForFirstConsumer   true                   19d
# linstor-thin-r3       replicated.csi.storage.deckhouse.io   Delete          WaitForFirstConsumer   true                   19d
# nfs-4-1-wffc          nfs.csi.k8s.io                        Delete          WaitForFirstConsumer   true                   24h

Создание пустого диска

Существует возможность создания пустых дисков.

  1. Создайте диск:
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualDisk
metadata:
  name: vd-blank
  namespace: vms
spec:
  persistentVolumeClaim:
    storageClassName: linstor-thin-r2 # Подставьте ваше название SC `kubectl get storageclass`.
    size: 100M

Созданный диск можно использовать для подключения к виртуальной машине.

  1. Проверьте состояние созданного ресурса с помощью команды:
kubectl -n vms  get virtualdisk -o wide

#NAME         PHASE   CAPACITY   PROGRESS   STORAGECLASS        TARGETPVC                                            AGE
#vd-blank     Ready   97657Ki    100%       linstor-thin-r1     vd-vd-blank-f2284d86-a3fc-40e4-b319-cfebfefea778     46s

Создание диска из образа

Можно создать диски из существующих дисковых образов, а также из внешних ресурсов, таких как образы.

При создании ресурса диска можно указать желаемый размер. Если размер не указан, то будет создан диск с размером, соответствующим исходному образу диска, который хранится в ресурсе VirtualImage или ClusterVirtualImage. Если необходимо создать диск большего размера, укажите необходимый размер.

В качестве примера рассмотрен ранее созданный ClusterVirtualImage с именем ubuntu-2204:

apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualDisk
metadata:
  name: ubuntu-root
  namespace: vms
spec:
  persistentVolumeClaim:
    size: 10Gi
    storageClassName: linstor-thin-r2 # Подставьте ваше название SC `kubectl get storageclass`.
  dataSource:
    type: ObjectRef
    objectRef:
      kind: ClusterVirtualImage
      name: ubuntu-img

Изменение размера диска

Размер дисков можно изменить только в сторону увеличения, даже если они подключены к виртуальной машине. Для этого отредактируйте поле spec.persistentVolumeClaim.size:

Проверим размер до изменения:

kubectl -n vms  get virtualdisk ubuntu-root -o wide

# NAME          PHASE   CAPACITY   PROGRESS   STORAGECLASS      TARGETPVC                                             AGE
# ubuntu-root   Ready   10Gi       100%       linstor-thin-r2   vd-ubuntu-root-bef82abc-469d-4b31-b6c4-0a9b2850b956   2m25s

Применим изменения:

kubectl -n vms patch virtualdisk ubuntu-root --type merge -p '{"spec":{"persistentVolumeClaim":{"size":"11Gi"}}}'

Проверим размер после изменения:

kubectl -n vms get virtualdisk ubuntu-root -o wide

# NAME          PHASE   CAPACITY   PROGRESS   STORAGECLASS      TARGETPVC                                             AGE
# ubuntu-root   Ready   11Gi       100%       linstor-thin-r2   vd-ubuntu-root-bef82abc-469d-4b31-b6c4-0a9b2850b956   4m13s

Подключение дисков к запущенным виртуальным машинам

Диски могут быть подключены в работающей виртуальной машине с использованием VirtualMachineBlockDeviceAttachment ресурса:

apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualMachineBlockDeviceAttachment
metadata:
  name: vd-blank-attachment
  namespace: vms
spec:
  virtualMachineName: linux-vm # Имя виртуальной машины, к которой будет подключен диск.
  blockDeviceRef:
    kind: VirtualDisk
    name: vd-blank # Имя подключаемого диска.

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

Чтобы посмотреть список подключенных дисков в работающей виртуальной машине, выполните команду:

kubectl -n vms get virtualmachineblockdeviceattachments

# NAME                       PHASE
# vd-blank-attachment       Attached

Виртуальные машины

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

  • ресурсы, требуемые для работы виртуальной машины (процессор, память, диски и образы);
  • правила размещения виртуальной машины на узлах кластера;
  • настройки загрузчика и оптимальные параметры для гостевой ОС;
  • политику запуска виртуальной машины и политику применения изменений;
  • сценарии начальной конфигурации (cloud-init).

Создание диска для виртуальной машины

Создайте диск с установленной ОС для виртуальной машины:

apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualDisk
metadata:
  name: ubuntu-2204-root
  namespace: vms
spec:
  persistentVolumeClaim:
    size: 10Gi
  dataSource:
    type: HTTP
    http:
      url: "https://cloud-images.ubuntu.com/minimal/releases/jammy/release-20230615/ubuntu-22.04-minimal-cloudimg-amd64.img"

Создание виртуальной машины

Ниже представлен пример простой конфигурации виртуальной машины, запускающей ОС Ubuntu 22.04. В примере используется сценарий первичной инициализации виртуальной машины (cloud-init), который устанавливает пакет nginx и создает пользователя cloud с паролем cloud:

apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualMachine
metadata:
  name: linux-vm
  namespace: vms
  labels:
    vm: linux
spec:
  virtualMachineClassName: generic
  runPolicy: AlwaysOn
  provisioning:
    type: UserData
    userData: |
      #cloud-config
      package_update: true
      packages:
        - nginx
      run_cmd:
        - systemctl daemon-relaod
        - systemctl enable --now nginx
      users:
      - name: cloud
        # password: cloud
        passwd: $6$rounds=4096$vln/.aPHBOI7BMYR$bBMkqQvuGs5Gyd/1H5DP4m9HjQSy.kgrxpaGEHwkX7KEFV8BS.HZWPitAtZ2Vd8ZqIZRqmlykRCagTgPejt1i.
        shell: /bin/bash
        sudo: ALL=(ALL) NOPASSWD:ALL
        chpasswd: { expire: False }
        lock_passwd: false      
  cpu:
    cores: 1
  memory:
    size: 2Gi
  blockDeviceRefs:
    # Порядок дисков и образов в данном блоке определяет приоритет загрузки.
    - kind: VirtualDisk
      name: ubuntu-2204-root

При наличии приватных данных, сценарий начальной инициализации виртуальной машины может быть создан в Secret’е. Пример Secret’а приведен ниже:

apiVersion: v1
kind: Secret
metadata:
  name: linux-vm-cloud-init
  namespace: vms
data:
  userData: # Тут cloud-init-конфиг в Base64.
type: Opaque

Спецификация виртуальной машины будет выглядеть следующим образом:

spec:
  provisioning:
    type: UserDataRef
    userDataRef:
      kind: Secret
      name: linux-vm-cloud-init
  1. Создайте виртуальную машину из манифеста представленного выше.

    После запуска виртуальная машина должна иметь статус Ready.

    kubectl -n vms get virtualmachine
    
    # NAME       PHASE     NODE          IPADDRESS     AGE
    # linux-vm   Running   node-name-x   10.66.10.1    5m
    

После создания виртуальная машина автоматически получит IP-адрес из диапазона, указанного в настройках модуля (блок virtualMachineCIDRs).

  1. Чтобы зафиксировать IP-адрес виртуальной машины перед ее запуском, выполните следующие шаги:

    • Создайте ресурс VirtualMachineIPAddress, в котором зафиксирован желаемый IP-адрес виртуальной машины. Запрашиваемый адрес должен быть из диапазона адресов, указанных в настройках модуля kubectl get mc virtualization -o jsonpath="{.spec.settings.virtualMachineCIDRs}".

      apiVersion: virtualization.deckhouse.io/v1alpha2
      kind: VirtualMachineIPAddress
      metadata:
        name: <ip-address-name>
        namespace: <namespace>
      spec:
        type: Static
        staticIP: "W.X.Y.Z"
      
    • Зафиксируйте изменения в спецификации виртуальной машины:

      spec:
        virtualMachineIPAddressName: <ip-address-name>
      

Настройка правил размещения виртуальной машины

  1. Для того, чтобы виртуальная машина запускалась на заданном наборе узлов, например, на группе узлов system, используйте следующий фрагмент конфигурации:

    spec:
      tolerations:
        - key: "node-role.kubernetes.io/system"
          operator: Exists
          effect: NoSchedule
      nodeSelector:
        node-role.kubernetes.io/system: ""
    
  2. Внесите изменения в ранее созданную спецификацию виртуальной машины.

Настройка порядка применения изменений

Внесенные изменения в конфигурацию виртуальной машины не отобразятся, так как по умолчанию применяется политика изменений Manual. Для применения изменений виртуальную машину требуется перезагрузить.

  1. Чтобы проверить статус виртуальной машины, введите командую:

    kubectl -n vms get linux-vm -o jsonpath='{.status}'
    

    В поле .status.restartAwaitingChanges отобразятся изменения, которые требуют подтверждения.

  2. Создайте и примените ресурс, который отвечает за декларативный способ управления состоянием виртуальной машины, как представлено на примере ниже:

    cat <<EOF | kubectl apply -f -
    apiVersion: virtualization.deckhouse.io/v1alpha2
    kind: VirtualMachineOperation
    metadata:
      name: restart-linux-vm
      namespace: vms
    spec:
      virtualMachineName: linux-vm
      type: Restart
    EOF
    
  3. Проверьте состояние созданного ресурса:

    kubectl -n vms get virtualmachineoperations restart-linux-vm
    
    # NAME                PHASE       VM         AGE
    # restart-linux-vm    Completed   linux-vm   1m
    

    Если созданный ресурс находится в состоянии Completed - перезагрузка виртуальной машины завершилась и новые параметры конфигурации виртуальной машины применены.

    Чтобы изменения в конфигурации виртуальной машины применялись автоматически при ее перезапуске, настройте политику применения изменений следующим образом (пример ниже):

    spec:
      disruptions:
        approvalMode: Automatic
    

Политика запуска виртуальной машины

  1. Подключитесь к виртуальной машине с использованием серийной консоли с помощью команды:

    d8 v console -n vms linux-vm
    
  2. Завершите работу виртуальной машины с помощью команды:

    cloud@linux-vm$ sudo poweroff
    

Далее посмотрим на статус виртуальной машины с помощью команды:

kubectl -n vms get virtualmachine

# NAME       PHASE     NODE           IPADDRESS   AGE
# linux-vm   Running   node-name-x    10.66.10.1  5m

Даже несмотря на то, что виртуальная машина была выключена, она снова запустилась. Причина перезапуска:

В отличие от традиционных систем виртуализации, мы используем политику запуска для определения состояния виртуальной машины, которая определяет требуемое состояние виртуальной машины в любое время.

При создании виртуальной машины используется параметр runPolicy: AlwaysOn. Это означает, что виртуальная машина будет запущена, даже если по каким-либо причинам произошло ее отключение, перезапуск или сбой, вызвавший прекращение ее работы.

Для выключения виртуальной машины, поменяйте значение политики на AlwaysOff. После чего произойдет корректное завершение работы виртуальной машины.