Диск хранит данные виртуальной машины (ВМ), включая операционную систему и файлы приложений. Описывает диск ресурс VirtualDisk, а его спецификация состоит из двух блоков:

  • persistentVolumeClaim — параметры хранения, то есть StorageClass и размер;
  • dataSource — источник данных, которым может быть образ, другой диск или снимок.

Без блока dataSource создаётся пустой диск, и тогда в persistentVolumeClaim нужно указать хотя бы размер. Если источник задан, блок persistentVolumeClaim можно опустить, тогда размер Deckhouse Platform (DP) возьмёт из источника, а класс хранения подберёт по нему же. Когда подобрать класс не удаётся, DP использует StorageClass по умолчанию на уровне кластера либо класс, заданный для дисков в настройках модуля.

Ход создания диска показывает колонка PHASE в выводе d8 k get vd, её значения описаны в поле .status.phase. Если диск надолго остаётся не готов, причину подскажет блок .status.conditions.

Пока диск не перешёл в фазу Ready, менять можно любые поля блока .spec, и после изменения создание начнётся заново. У готового диска остаются изменяемыми только размер и класс хранения в параметрах .spec.persistentVolumeClaim.size и .spec.persistentVolumeClaim.storageClassName.

Создать диск из ISO-образа нельзя.

Влияние хранилища на диск

Поведение диска зависит от того, какое хранилище стоит за выбранным StorageClass. Различия проявляются в двух свойствах.

Тип тома определяет формат, в котором DP создаёт диск. На томах файловой системы (FileSystem, например NFS) диск создаётся в формате qcow2, на блочных устройствах (Block, например iSCSI или Ceph RBD) данные пишутся напрямую. Некоторые хранилища поддерживают оба типа.

Режим привязки тома определяет момент создания диска:

  • Immediate — диск создаётся сразу, независимо от виртуальных машин, и подключить его можно к машине на любом узле кластера.

    VolumeBindingMode: Immediate

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

    VolumeBindingMode: WaitForFirstConsumer

Остальные параметры, включая формат диска, DP определяет сам по возможностям выбранного StorageClass.

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

d8 k get storageclass

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

NAME                   PROVISIONER                           RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
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

В веб-интерфейсе тот же список доступен на вкладке «Система» в разделе «Хранилище» → «Классы хранилищ».

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

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

  • В командной строке
  • В веб-интерфейсе
  1. Создайте ресурс VirtualDisk, указав размер и класс хранения:

    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
    
  2. Проверьте, что диск создан:

    d8 k get vd blank-disk
    

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

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

Шаг можно пропустить и создать диск сразу при создании ВМ.

  1. Перейдите на вкладку «Проекты» и выберите нужный проект.
  2. Перейдите в раздел «Виртуализация» → «Диски».
  3. Нажмите кнопку «Создать».
  4. В открывшейся форме в поле «Имя диска» введите blank-disk.
  5. В поле «Размер» задайте размер с единицами измерения, например 100Mi.
  6. В поле «Класс хранения» выберите StorageClass или оставьте вариант по умолчанию.
  7. Нажмите кнопку «Создать».
  8. Проверьте статус диска на его странице.

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

Диск можно заполнить данными из образа, созданного ранее, будь то проектный VirtualImage или кластерный ClusterVirtualImage.

Размер диска указывать необязательно. Если вы его не задали, DP создаст диск ровно по распакованному размеру образа, а если задали, размер должен быть не меньше распакованного.

  • В командной строке
  • В веб-интерфейсе
  1. Посмотрите распакованный размер образа в колонке UNPACKEDSIZE:

    d8 k get vi ubuntu-24-04 -o wide
    

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

    NAME           PHASE   CDROM   PROGRESS   STOREDSIZE   UNPACKEDSIZE   REGISTRY URL                                                                              TARGETPVC   AGE
    ubuntu-24-04   Ready   false   100%       285.9Mi      2.5Gi          dvcr.d8-virtualization.svc/vi/default/ubuntu-24-04:eac95605-7e0b-4a32-bb50-cc7284fd89d0               122m
    
  2. Создайте диск, задав размер больше распакованного:

    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
    
  3. Создайте второй диск, не указывая размер:

    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
    
  4. Сравните размеры созданных дисков:

    d8 k get vd
    

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

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

    Первый диск получил заданные 10 ГиБ, второй — распакованный размер образа.

Шаг можно пропустить и создать диск сразу при создании ВМ.

  1. Перейдите на вкладку «Проекты» и выберите нужный проект.
  2. Перейдите в раздел «Виртуализация» → «Диски».
  3. Нажмите кнопку «Создать».
  4. В открывшейся форме в поле «Имя диска» введите linux-vm-root.
  5. В поле «Источник» из выпадающего списка выберите нужный образ.
  6. При необходимости в поле «Размер» укажите больший размер или оставьте значение по умолчанию.
  7. В поле «Класс хранения» выберите StorageClass или оставьте вариант по умолчанию.
  8. Нажмите кнопку «Создать».
  9. Проверьте статус диска на его странице.

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

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

  • В командной строке
  • В веб-интерфейсе
  1. Создайте ресурс VirtualDisk с источником Upload:

    d8 k apply -f - <<EOF
    apiVersion: virtualization.deckhouse.io/v1alpha2
    kind: VirtualDisk
    metadata:
      name: uploaded-disk
    spec:
      dataSource:
        type: Upload
    EOF
    

    Ресурс перейдёт в фазу WaitForUserUpload и будет готов принять файл. Начните загрузку в течение 10 минут, иначе ресурс перейдёт в фазу Failed и его придётся создать заново.

  2. Получите адреса, по которым принимается файл:

    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"
    }
    

    Адрес inCluster используйте, если загружаете файл с одного из узлов кластера, а external — во всех остальных случаях.

  3. Загрузите файл по выбранному адресу:

    curl https://virtualization.example.com/upload/<SECRET_URL> --progress-bar -T <IMAGE_FILE> | cat
    

    Здесь <SECRET_URL> — адрес из предыдущего шага, а <IMAGE_FILE> — путь к файлу образа на вашем компьютере.

  4. Убедитесь, что диск перешёл в фазу Ready:

    d8 k get vd uploaded-disk
    

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

    NAME            PHASE   CAPACITY   VIRTUALMACHINE   AGE
    uploaded-disk   Ready   3Gi                         7d23h
    
  1. Перейдите на вкладку «Проекты» и выберите нужный проект.
  2. Перейдите в раздел «Виртуализация» → «Диски».
  3. Нажмите кнопку «Создать».
  4. В открывшейся форме в поле «Имя диска» введите имя диска.
  5. В блоке «Диск» в поле «Источник данных» выберите «Загрузить».
  6. Перетащите файл в выделенную область или нажмите на неё и выберите файл на компьютере.
  7. В поле «Размер» укажите размер диска, а в поле «Класс хранения» — StorageClass.
  8. Нажмите кнопку «Создать».

Если у выбранного класса хранения режим привязки тома WaitForFirstConsumer, вариант «Загрузить» недоступен. Без потребителя диск не создаётся, и загружать файл некуда, поэтому выберите класс хранения с режимом Immediate либо загрузите данные как образ.

По этой же причине пустой диск, созданный заранее с таким классом хранения, остаётся в статусе «ОЖИДАНИЕ ВМ» и не предлагается в окне «Диски / Образы» при подключении к виртуальной машине, ведь выбрать можно только готовый диск. Создавайте такие диски прямо из формы виртуальной машины вариантами «Пустой» или «Создать из».

Свойства диска удобно смотреть в веб-интерфейсе, в разделе «Виртуализация» → «Диски»:

  • список показывает имя диска, статус, размер, класс хранения в колонке «Класс», использующую диск виртуальную машину в колонке «Используется» и возраст ресурса;
  • на странице диска вкладка «Конфигурация» показывает источник данных, размер, класс хранения и список ВМ в строке «Используется в»;
  • вкладка «Диагностика» показывает имя PVC, его фазу, размер, класс хранения, имя PV и возраст, а также длительность этапов создания диска в блоке «Сводка диагностики».

Дополнительные ресурсы