Ресурс VirtualImage предназначен для загрузки образов виртуальных машин и их последующего использования для создания дисков виртуальных машин. Данный ресурс доступен только в пространстве имён или проекте в котором он был создан.

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

Процесс создания образа включает следующие шаги:

  1. Пользователь создаёт ресурс VirtualImage.
  2. После создания образ автоматически загружается из указанного в спецификации источника в хранилище (DVCR).
  3. После завершения загрузки ресурс становится доступным для создания дисков.

Существуют различные типы образов:

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

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

Дистрибутив Пользователь по умолчанию
AlmaLinux almalinux
AlpineLinux alpine
AltLinux altlinux
AstraLinux astra
CentOS cloud-user
Debian debian
Rocky rocky
Ubuntu ubuntu

Поддерживаются следующие форматы образов с предустановленной системой:

  • qcow2
  • raw
  • vmdk
  • vdi

Также файлы образов могут быть сжаты одним из следующих алгоритмов сжатия: gz, xz.

После создания ресурса тип и размер образа определяются автоматически. Эта информация отражается в статусе ресурса.

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

Образы могут быть созданы из других образов и дисков виртуальных машин.

Проектный образ поддерживает два типа хранения:

  • ContainerRegistry — тип по умолчанию, при котором образ хранится в DVCR.
  • PersistentVolumeClaim — тип, при котором в качестве хранилища для образа используется PVC. Этот вариант предпочтителен, если используется хранилище с поддержкой быстрого клонирования PVC, что позволяет быстрее создавать диски из образов.

Использование образа с параметром storage: PersistentVolumeClaim поддерживается только для создания дисков в том же классе хранения (StorageClass).

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

Создание образа с HTTP-сервера

Рассмотрим вариант создания образа с вариантом хранения в DVCR.

  1. Выполните следующую команду для создания VirtualImage:

    d8 k apply -f - <<EOF
    apiVersion: virtualization.deckhouse.io/v1alpha2
    kind: VirtualImage
    metadata:
      name: ubuntu-22-04
    spec:
      # Сохраним образ в DVCR.
      storage: ContainerRegistry
      # Источник для создания образа.
      dataSource:
        type: HTTP
        http:
          url: https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img
    EOF
    
  2. Проверьте результат создания VirtualImage:

    d8 k get virtualimage ubuntu-22-04
    # или более короткий вариант
    d8 k get vi ubuntu-22-04
    

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

    NAME           PHASE   CDROM   PROGRESS   AGE
    ubuntu-22-04   Ready   false   100%       23h
    

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

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

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

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

Отследить процесс создания образа можно путем добавления ключа -w к предыдущей команде:

d8 k get vi ubuntu-22-04 -w

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

NAME           PHASE          CDROM   PROGRESS   AGE
ubuntu-22-04   Provisioning   false              4s
ubuntu-22-04   Provisioning   false   0.0%       4s
ubuntu-22-04   Provisioning   false   28.2%      6s
ubuntu-22-04   Provisioning   false   66.5%      8s
ubuntu-22-04   Provisioning   false   100.0%     10s
ubuntu-22-04   Provisioning   false   100.0%     16s
ubuntu-22-04   Ready          false   100%       18s

В описание ресурса VirtualImage можно получить дополнительную информацию о скачанном образе:

d8 k describe vi ubuntu-22-04

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

  • Перейдите на вкладку «Проекты» и выберите нужный проект.
  • Перейдите в раздел «Виртуализация» → «Образы дисков».
  • Нажмите «Создать образ».
  • Из списка выберите «Загрузить данные по ссылке (HTTP)».
  • В открывшейся форме в поле «Имя образа» введите имя образа.
  • В поле «Хранилище» выберите ContainerRegistry.
  • В поле «URL» укажите ссылку на образ.
  • Нажмите кнопку «Создать».
  • Статус образа отображается слева вверху, под именем образа.

Теперь рассмотрим пример создания образа с хранением его в PVC:

d8 k apply -f - <<EOF
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualImage
metadata:
  name: ubuntu-22-04-pvc
spec:
  # Настройки хранения проектного образа.
  storage: PersistentVolumeClaim
  persistentVolumeClaim:
    # Подставьте ваше название StorageClass.
    storageClassName: i-sds-replicated-thin-r2
  # Источник для создания образа.
  dataSource:
    type: HTTP
    http:
      url: https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img
EOF

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

d8 k get vi ubuntu-22-04-pvc

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

NAME              PHASE   CDROM   PROGRESS   AGE
ubuntu-22-04-pvc  Ready   false   100%       23h

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

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

  • Перейдите на вкладку «Проекты» и выберите нужный проект.
  • Перейдите в раздел «Виртуализация» → «Образы дисков».
  • Нажмите «Создать образ».
  • Из списка выберите «Загрузить данные по ссылке (HTTP)».
  • В открывшейся форме в поле «Имя образа» введите имя образа.
  • В поле «Хранилище» выберите PersistentVolumeClaim.
  • В поле «Класс хранилища» можно выбрать StorageClass или оставить выбранный по умолчанию.
  • В поле «URL» укажите ссылку на образ.
  • Нажмите кнопку «Создать».
  • Статус образа отображается слева вверху, под именем образа.

Создание образа из container registry

Образ, хранящийся в container registry имеет определенный формат. Рассмотрим на примере:

  1. Загрузите образ локально:

    curl -L https://cloud-images.ubuntu.com/minimal/releases/jammy/release/ubuntu-22.04-minimal-cloudimg-amd64.img -o ubuntu2204.img
    
  2. Создайте Dockerfile со следующим содержимым:

    FROM scratch
    COPY ubuntu2204.img /disk/ubuntu2204.img
    
  3. Соберите образ и загрузите его в container registry. В качестве container registry в примере ниже использован docker.io. Для выполнения необходимо иметь учетную запись сервиса и настроенное окружение.

    docker build -t docker.io/<username>/ubuntu2204:latest
    

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

  4. Загрузите созданный образ в container registry:

    docker push docker.io/<username>/ubuntu2204:latest
    
  5. Чтобы использовать этот образ, создайте в качестве примера ресурс:

    d8 k apply -f - <<EOF
    apiVersion: virtualization.deckhouse.io/v1alpha2
    kind: VirtualImage
    metadata:
      name: ubuntu-2204
    spec:
      storage: ContainerRegistry
      dataSource:
        type: ContainerImage
        containerImage:
          image: docker.io/<username>/ubuntu2204:latest
    EOF
    

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

  • Перейдите на вкладку «Проекты» и выберите нужный проект.
  • Перейдите в раздел «Виртуализация» → «Образы дисков».
  • Нажмите «Создать образ».
  • Из списка выберите «Загрузить данные из образа контейнера».
  • В открывшейся форме в поле «Имя образа» введите имя образа.
  • В поле «Хранилище» выберите ContainerRegistry.
  • В поле «Образ в реестре контейнеров» укажите docker.io/<username>/ubuntu2204:latest.
  • Нажмите кнопку «Создать».
  • Статус образа отображается слева вверху, под именем образа.

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

Чтобы загрузить образ из командной строки, предварительно создайте ресурс, как представлено ниже на примере VirtualImage:

d8 k apply -f - <<EOF
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualImage
metadata:
  name: some-image
spec:
  # Настройки хранения проектного образа.
  storage: ContainerRegistry
  # Настройки источника образа.
  dataSource:
    type: Upload
EOF

После создания, ресурс перейдет в фазу WaitForUserUpload, а это значит, что он готов для загрузки образа.

Доступно два варианта загрузки с узла кластера и с произвольного узла за пределами кластера:

d8 k get vi some-image -o jsonpath="{.status.imageUploadURLs}"  | jq

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

{
  "external": "https://virtualization.example.com/upload/g2OuLgRhdAWqlJsCMyNvcdt4o5ERIwmm",
  "inCluster": "http://10.222.165.239/upload"
}

В качестве примера загрузите образ Cirros:

curl -L http://download.cirros-cloud.net/0.5.1/cirros-0.5.1-x86_64-disk.img -o cirros.img

Выполните загрузку образа с использование следующей команды

curl https://virtualization.example.com/upload/g2OuLgRhdAWqlJsCMyNvcdt4o5ERIwmm --progress-bar -T cirros.img | cat

После завершения загрузки образ должен быть создан и перейти в фазу Ready

d8 k get vi some-image

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

NAME         PHASE   CDROM   PROGRESS   AGE
some-image   Ready   false   100%       1m

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

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

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

Существует возможность создать образ из диска. Для этого необходимо выполнить одно из следующих условий:

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

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

d8 k apply -f - <<EOF
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualImage
metadata:
  name: linux-vm-root
spec:
  storage: ContainerRegistry
  dataSource:
    type: ObjectRef
    objectRef:
      kind: VirtualDisk
      name: linux-vm-root
EOF

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

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

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

Можно создать образ из снимка. Для этого необходимо чтобы снимок диска находился в фазе готовности.

Пример создания образа из моментального снимка диска:

d8 k apply -f - <<EOF
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualImage
metadata:
  name: linux-vm-root
spec:
  storage: ContainerRegistry
  dataSource:
    type: ObjectRef
    objectRef:
      kind: VirtualDiskSnapshot
      name: linux-vm-root-snapshot
EOF