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

Поведение дисков при создании виртуальных машин зависит от свойства VolumeBindingMode для соответствующего StorageClass:

Если VolumeBindingMode = Immediate — диск создается сразу после создания ресурса (предполагается, что диск будет доступен для подключения к виртуальной машине на любом узле кластера).

Immediate

Если VolumeBindingMode = WaitForFirstConsumer — диск создается только после того как будет подключен к виртуальной машине и будет создан на том узле, на котором будет запущена виртуальная машина.

WaitForFirstConsumer

Поведение дисков в процессе эксплуатации зависит от режима доступа AccessMode:

  • ReadWriteMany (RWX) — множественный доступ к диску. Живая миграция виртуальных машин с такими дисками возможна.
  • ReadWriteOnce (RWO) — доступ к диску предоставляется только одному экземпляру виртуальной машины. Живая миграция виртуальных машин с такими дисками поддерживается только для платных редакций DVP. Живая миграция доступна только если все диски подключены статически через .spec.blockDeviceRefs. Диски, подключенные динамически через VirtualMachineBlockDeviceAttachments, необходимо статически переподключить, указав их в .spec.blockDeviceRefs.

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

Внимание: Создать диски из iso-образов - нельзя!

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

d8 k get storageclass

Пример вывода:

NAME                                 PROVISIONER                           RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
i-sds-replicated-thin-r1 (default)   replicated.csi.storage.deckhouse.io   Delete          Immediate              true                   48d
i-sds-replicated-thin-r2             replicated.csi.storage.deckhouse.io   Delete          Immediate              true                   48d
i-sds-replicated-thin-r3             replicated.csi.storage.deckhouse.io   Delete          Immediate              true                   48d
sds-replicated-thin-r1               replicated.csi.storage.deckhouse.io   Delete          WaitForFirstConsumer   true                   48d
sds-replicated-thin-r2               replicated.csi.storage.deckhouse.io   Delete          WaitForFirstConsumer   true                   48d
sds-replicated-thin-r3               replicated.csi.storage.deckhouse.io   Delete          WaitForFirstConsumer   true                   48d
nfs-4-1-wffc                         nfs.csi.k8s.io                        Delete          WaitForFirstConsumer   true                   30d

С полным описанием параметров конфигурации дисков можно ознакомиться в документации ресурса VirtualDisk.

Как узнать доступные варианты хранилищ веб-интерфейсе DVP:

  • Перейдите на вкладку «Система», далее в раздел «Хранилище» → «Классы хранилищ».

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

Пустые диски обычно используются для установки на них ОС, либо для хранения каких-либо данных.

Создайте диск:

d8 k apply -f - <<EOF
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualDisk
metadata:
  name: blank-disk
spec:
  # Настройки параметров хранения диска.
  persistentVolumeClaim:
    # Подставьте ваше название StorageClass.
    storageClassName: i-sds-replicated-thin-r2
    size: 100Mi
EOF

После создания ресурс VirtualDisk может находиться в следующих состояниях (фазах):

  • Pending — ожидание готовности всех зависимых ресурсов, требующихся для создания диска.
  • Provisioning — идет процесс создания диска.
  • Resizing — идет процесс изменения размера диска.
  • WaitForFirstConsumer — диск ожидает создания виртуальной машины, которая будет его использовать.
  • WaitForUserUpload — диск ожидает от пользователя загрузки образа (type: Upload).
  • Ready — диск создан и готов для использования.
  • Failed — произошла ошибка в процессе создания.
  • PVCLost — системная ошибка, PVC с данными утерян.
  • Terminating — идет процесс удаления диска. Диск может «зависнуть» в данном состоянии, если он еще подключен к виртуальной машине.

До тех пор, пока диск не перешёл в фазу Ready содержимое всего блока .spec допускается изменять. При изменении процесс создании диска запустится заново.

Диагностика проблем с ресурсом осуществляется путем анализа информации в блоке .status.conditions.

Если параметр .spec.persistentVolumeClaim.storageClassName не указан, то будет использован StorageClass по умолчанию на уровне кластера, либо для образов, если он указан в настройках модуля.

Проверьте состояние диска после создания командой:

d8 k get vd blank-disk

Пример вывода:

NAME       PHASE   CAPACITY   AGE
blank-disk   Ready   100Mi      1m2s

Как создать пустой диск в веб-интерфейсе (данный шаг можно пропустить и выполнить при создании ВМ):

  • Перейдите на вкладку «Проекты» и выберите нужный проект.
  • Перейдите в раздел «Виртуализация» → «Диски ВМ».
  • Нажмите «Создать диск».
  • В открывшейся форме в поле «Имя диска» введите blank-disk.
  • В поле «Размер» задайте размер с единицами измерений 100Mi.
  • В поле «Имя StorageClass» можно выбрать StorageClass или оставить выбранный по умолчанию.
  • Нажмите кнопку «Создать».
  • Статус диска отображается слева вверху, под именем диска.

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

Диск также можно создавать и заполнять данными из ранее созданных образов ClusterVirtualImage и VirtualImage.

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

На примере ранее созданного проектного образа VirtualImage, рассмотрим команду, позволяющую определить размер распакованного образа:

d8 k get cvi ubuntu-22-04 -o wide

Пример вывода:

NAME           PHASE   CDROM   PROGRESS   STOREDSIZE   UNPACKEDSIZE   REGISTRY URL                                                                       AGE
ubuntu-22-04   Ready   false   100%       285.9Mi      2.5Gi          dvcr.d8-virtualization.svc/cvi/ubuntu-22-04:eac95605-7e0b-4a32-bb50-cc7284fd89d0   122m

Искомый размер указан в колонке UNPACKEDSIZE и равен 2.5Gi.

Создадим диск из этого образа:

d8 k apply -f - <<EOF
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualDisk
metadata:
  name: linux-vm-root
spec:
  # Настройки параметров хранения диска.
  persistentVolumeClaim:
    # Укажем размер больше чем значение распакованного образа.
    size: 10Gi
    # Подставьте ваше название StorageClass.
    storageClassName: i-sds-replicated-thin-r2
  # Источник из которого создается диск.
  dataSource:
    type: ObjectRef
    objectRef:
      kind: VirtualImage
      name: ubuntu-22-04
EOF

А теперь создайте диск, без явного указания размера:

d8 k apply -f - <<EOF
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualDisk
metadata:
  name: linux-vm-root-2
spec:
  # Настройки параметров хранения диска.
  persistentVolumeClaim:
    # Подставьте ваше название StorageClass.
    storageClassName: i-sds-replicated-thin-r2
  # Источник из которого создается диск.
  dataSource:
    type: ObjectRef
    objectRef:
      kind: VirtualImage
      name: ubuntu-22-04
EOF

Проверьте состояние дисков после создания:

d8 k get vd

Пример вывода:

NAME           PHASE   CAPACITY   AGE
linux-vm-root    Ready   10Gi       7m52s
linux-vm-root-2  Ready   2590Mi     7m15s

Как создать диск из образа в веб-интерфейсе (данный шаг можно пропустить и выполнить при создании ВМ):

  • Перейдите на вкладку «Проекты» и выберите нужный проект.
  • Перейдите в раздел «Виртуализация» → «Диски ВМ».
  • Нажмите «Создать диск».
  • В открывшейся форме в поле «Имя диска» введите linux-vm-root.
  • В поле «Источник» убедитесь, что установлен чек-бокс «Проектные».
  • Из выпадающего списка выберите интересующий Вас образ.
  • В поле «Размер» можете изменить размер на больший или оставить выбранный по умолчанию.
  • В поле «Имя StorageClass» можно выбрать StorageClass или оставить выбранный по умолчанию.
  • Нажмите кнопку «Создать».
  • Статус диска отображается слева вверху, под именем диска.

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

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

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

d8 k get vd linux-vm-root

Пример вывода:

NAME          PHASE   CAPACITY   AGE
linux-vm-root   Ready   10Gi       10m

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

d8 k patch vd linux-vm-root --type merge -p '{"spec":{"persistentVolumeClaim":{"size":"11Gi"}}}'

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

d8 k get vd linux-vm-root

Пример вывода:

NAME          PHASE   CAPACITY   AGE
linux-vm-root   Ready   11Gi       12m

Как изменить размер диска в веб-интерфейсе:

Способ №1:

  • Перейдите на вкладку «Проекты» и выберите нужный проект.
  • Перейдите в раздел «Виртуализация» → «Диски ВМ».
  • Выберите нужный диск и нажмите на символ карандаша в колонке «Размер».
  • Во всплывающем окне можете изменить размер на больший.
  • Нажмите на кнопку «Применить».
  • Статус диска отображается в колонке «Статус».

Способ №2:

  • Перейдите на вкладку «Проекты» и выберите нужный проект.
  • Перейдите в раздел «Виртуализация» → «Диски ВМ».
  • Выберите нужный диск и нажмите на его имя.
  • В открывшейся форме на вкладке «Конфигурация» в поле «Размер» можете изменить размер на больший.
  • Нажмите на появившуюся кнопку «Сохранить».
  • Статус диска отображается слева вверху, под его именем.

Изменение класса хранения диска

В платных редакциях DVP можно изменить класс хранения для существующих дисков. Сейчас это поддерживается только для работающих ВМ (Phase должна быть Running).

Миграция класса хранения поддерживается только для дисков, статически подключенных через параметр .spec.blockDeviceRefs в конфигурации виртуальной машины.

Для миграции класса хранения дисков, подключенных через VirtualMachineBlockDeviceAttachments, необходимо переподключить их статически, указав имена дисков в .spec.blockDeviceRefs.

Пример:

d8 k patch vd disk --type=merge --patch '{"spec":{"persistentVolumeClaim":{"storageClassName":"new-storage-class-name"}}}'

После изменения конфигурации диска запустится живая миграция ВМ, в процессе которой диск ВМ будет мигрирован на новое хранилище.

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

d8 k patch vd disk1 --type=merge --patch '{"spec":{"persistentVolumeClaim":{"storageClassName":"new-storage-class-name"}}}'
d8 k patch vd disk2 --type=merge --patch '{"spec":{"persistentVolumeClaim":{"storageClassName":"new-storage-class-name"}}}'

При неуспешной миграции повторные попытки выполняются с увеличивающимися задержками (алгоритм экспоненциального backoff). Максимальная задержка — 300 секунд (5 минут). Задержки: 5 секунд (1-я попытка), 10 секунд (2-я), далее каждая задержка удваивается, достигая 300 секунд (7-я и последующие попытки). Первая попытка выполняется без задержки.

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