Диски в виртуальных машинах используются для записи и хранения данных, что необходимо для работы операционных систем и приложений. Для этих целей можно использовать различные типы хранилищ.
Спецификация диска содержит два основных блока:
persistentVolumeClaim— параметры хранения диска (StorageClass и размер).dataSource— источник данных для создания диска (образ, другой диск, снимок).
Если dataSource не указан, создаётся пустой диск. Тогда в persistentVolumeClaim нужно указать как минимум размер и StorageClass.
Если dataSource указан, блок persistentVolumeClaim можно не задавать. Тогда:
- Размер диска определяется автоматически на основе источника.
- StorageClass определяется автоматически на основе источника. Если это невозможно, используется StorageClass по умолчанию на уровне кластера либо значение, заданное для дисков в настройках модуля.
В зависимости от выбранного типа хранилища, поведение дисков при создании виртуальных машин и в процессе эксплуатации может отличаться.
Поведение дисков при их создании зависит от параметра VolumeBindingMode, определяющего, когда именно создаётся диск и на каком узле:
- Тип тома: хранилище может поддерживать тома типа файловой системы (
FileSystem, например NFS) или блочные устройства (Block, например iSCSI, Ceph RBD). Для томов типаFileSystemдиск виртуальной машины создаётся в форматеqcow2. Некоторые хранилища поддерживают оба типа томов. - Режим привязки тома (
VolumeBindingMode):-
Immediate— диск создаётся сразу после создания ресурса (предполагается, что диск будет доступен для подключения к виртуальной машине на любом узле кластера).
-
WaitForFirstConsumer— диск создаётся только после подключения к виртуальной машине и размещается на том узле, на котором будет запущена виртуальная машина.
-
При создании диска все параметры (тип тома, формат диска, режим привязки тома и другие настройки) определяются автоматически в зависимости от возможностей выбранного StorageClass.
Создание дисков из 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
rv-thin-r1 (default) replicated.csi.storage.deckhouse.io Delete Immediate true 48d
rv-thin-r2 replicated.csi.storage.deckhouse.io Delete Immediate 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: rv-thin-r2
size: 100Mi
EOF
После создания ресурс VirtualDisk может находиться в следующих состояниях (фазах):
Pending— ожидание готовности всех зависимых ресурсов, требующихся для создания диска;Provisioning— идет процесс создания диска;Resizing— идет процесс изменения размера диска;WaitForFirstConsumer— диск ожидает создания виртуальной машины, которая будет его использовать;WaitForUserUpload— диск ожидает от пользователя загрузки образа (type: Upload);Ready— диск создан и готов для использования;Migrating— живая миграция диска;Exporting- идет процесс экспорта диска;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 vi ubuntu-24-04 -o wide
Пример вывода:
NAME PHASE CDROM PROGRESS STOREDSIZE UNPACKEDSIZE REGISTRY URL AGE
ubuntu-24-04 Ready false 100% 285.9Mi 2.5Gi dvcr.d8-virtualization.svc/cvi/ubuntu-24-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: rv-thin-r2
# Источник из которого создается диск.
dataSource:
type: ObjectRef
objectRef:
kind: VirtualImage
name: ubuntu-24-04
EOF
А теперь создайте диск, без явного указания размера:
d8 k apply -f - <<EOF
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualDisk
metadata:
name: linux-vm-root-2
spec:
# Настройки параметров хранения диска.
persistentVolumeClaim:
# Подставьте ваше название StorageClass.
storageClassName: rv-thin-r2
# Источник из которого создается диск.
dataSource:
type: ObjectRef
objectRef:
kind: VirtualImage
name: ubuntu-24-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 или оставить выбранный по умолчанию.
- Нажмите кнопку «Создать».
- Статус диска отображается слева вверху, под именем диска.
Загрузка диска из командной строки
Чтобы загрузить диск из командной строки, предварительно создайте ресурс, как представлено ниже на примере VirtualDisk:
d8 k apply -f - <<EOF
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualDisk
metadata:
name: uploaded-disk
spec:
dataSource:
type: Upload
EOF
После создания ресурс перейдет в фазу WaitForUserUpload, что означает, что он готов для загрузки диска.
Доступно два варианта загрузки: с узла кластера и с произвольного узла за пределами кластера:
d8 k get vd uploaded-disk -o jsonpath="{.status.imageUploadURLs}" | jq
Пример вывода:
{
"external": "https://virtualization.example.com/upload/<secret-url>",
"inCluster": "http://10.222.165.239/upload"
}
Выполните загрузку диска с использованием следующей команды:
curl https://virtualization.example.com/upload/<secret-url> --progress-bar -T <image.name> | cat
После завершения загрузки диск должен быть создан и перейти в фазу Ready:
d8 k get vd uploaded-disk
Пример вывода:
NAMESPACE NAME PHASE CAPACITY AGE
default uploaded-disk Ready 3Gi 7d23h
Изменение размера диска
Размер дисков можно увеличивать, даже если они уже подключены к работающей виртуальной машине. Для этого отредактируйте поле 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 edit vd linux-vm-root
Проверьте размер после изменения:
d8 k get vd linux-vm-root
Пример вывода:
NAME PHASE CAPACITY AGE
linux-vm-root Ready 11Gi 12m
Как изменить размер диска в веб-интерфейсе:
Способ №1:
- Перейдите на вкладку «Проекты» и выберите нужный проект.
- Перейдите в раздел «Виртуализация» → «Диски ВМ».
- Выберите нужный диск и нажмите на символ карандаша в колонке «Размер».
- Во всплывающем окне можете изменить размер на больший.
- Нажмите на кнопку «Применить».
- Статус диска отображается в колонке «Статус».
Способ №2:
- Перейдите на вкладку «Проекты» и выберите нужный проект.
- Перейдите в раздел «Виртуализация» → «Диски ВМ».
- Выберите нужный диск и нажмите на его имя.
- В открывшейся форме на вкладке «Конфигурация» в поле «Размер» можете изменить размер на больший.
- Нажмите на появившуюся кнопку «Сохранить».
- Статус диска отображается слева вверху, под его именем.
Миграция дисков на другие хранилища
В платных редакциях вы можете мигрировать (перенести) диск виртуальной машины на другое хранилище, изменив для него класс хранилища (StorageClass).
Миграция поддерживается как для статически подключённых дисков, так и для динамически подключённых (hotplug) дисков.
Ограничения миграции дисков между хранилищами:
- Миграция доступна только для виртуальных машин в состоянии
Running. - Миграция поддерживается только между дисками одного типа:
Block↔Block,FileSystem↔FileSystem; перевод между разными типами невозможен.
Пример миграции диска на класс хранения new-storage-class-name:
d8 k patch vd disk --type=merge --patch '{"spec":{"persistentVolumeClaim":{"storageClassName":"new-storage-class-name"}}}'
Или внесите аналогичные изменения, отредактировав ресурс:
d8 k edit vd disk
После изменения конфигурации диска запустится живая миграция ВМ, в процессе которой диск ВМ будет перемещён в новое хранилище.
Если к виртуальной машине подключены несколько дисков и требуется изменить класс хранения для нескольких дисков, эту операцию необходимо выполнить последовательно:
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-я и последующие попытки). Первая попытка выполняется без задержки.
Для отмены миграции пользователь должен вернуть класс хранения в спецификации на исходный.