Образ хранит содержимое диска, из которого вы создаёте диски виртуальных машин. Образ VirtualImage создаётся в проекте и доступен только в том проекте или неймспейсе, где он создан.
Чтобы один и тот же образ был доступен всем проектам кластера, нужен кластерный образ ClusterVirtualImage. Создать его может администратор, порядок описан в разделе «Кластерные образы виртуальных машин».
Виртуальная машина получает доступ к подключённому образу в режиме «только чтение».
Образ появляется в проекте в три шага:
- Вы создаёте ресурс VirtualImage и указываете в нём источник данных.
- Deckhouse Platform (DP) загружает образ из этого источника в хранилище, которым в зависимости от выбранного типа выступает DVCR или PVC.
- Загруженный образ становится доступен для создания дисков.
Источники и варианты хранения
Источником образа может быть HTTP-сервер с файлом образа, хранилище образов контейнеров или файл на вашем компьютере, который вы загружаете из командной строки. Кроме того, образ можно создать из другого образа, из диска виртуальной машины или из снимка диска.
Виды образов, поддерживаемые форматы файлов и алгоритмы сжатия описаны в разделе «Типы и форматы образов».
Загруженный образ хранится одним из двух способов, который задаёт параметр .spec.storage:
ContainerRegistry— вариант по умолчанию, образ хранится в DVCR.PersistentVolumeClaim— образ хранится в PVC. Этот вариант предпочтителен, если хранилище умеет быстро клонировать PVC, потому что диски из такого образа создаются быстрее.
Образ, сохранённый с параметром storage: PersistentVolumeClaim, годится для создания дисков только в том же классе хранения (StorageClass).
Ход создания образа показывает колонка PHASE в выводе d8 k get vi, её значения описаны в поле .status.phase. Следить за созданием в реальном времени помогает ключ -w, а если образ надолго остаётся не готов, причину подскажет блок .status.conditions и команда d8 k describe vi.
Пока образ не перешёл в фазу Ready, блок .spec можно менять, и после изменения загрузка начнётся заново. У готового образа блок .spec изменить уже нельзя. Все параметры образа описаны в VirtualImage.
Создание образа с HTTP-сервера
Проще всего создать образ, указав ссылку на файл, который лежит на HTTP-сервере.
- В командной строке
- В веб-интерфейсе
-
Создайте ресурс VirtualImage. В примере образ сохраняется в DVCR:
d8 k apply -f - <<EOF apiVersion: virtualization.deckhouse.io/v1alpha2 kind: VirtualImage metadata: name: ubuntu-24-04 spec: # Сохраняем образ в DVCR. storage: ContainerRegistry # Источник для создания образа. dataSource: type: HTTP http: url: https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img EOF -
Проверьте, что образ создан:
d8 k get virtualimage ubuntu-24-04 # Короткий вариант команды. d8 k get vi ubuntu-24-04Пример вывода:
NAME PHASE CDROM PROGRESS AGE ubuntu-24-04 Ready false 100% 23h
- Перейдите на вкладку «Проекты» и выберите нужный проект.
- Перейдите в раздел «Виртуализация» → «Образы».
- Нажмите кнопку «Создать».
- В блоке «Источник» выберите «По ссылке».
- В открывшейся форме в поле «Имя образа» введите имя образа.
- В блоке «Хранилище» в поле «Тип хранилища» выберите
ContainerRegistry. - В поле «URL» укажите ссылку на образ.
- Нажмите кнопку «Создать».
- Проверьте статус образа на его странице.
Проверка целостности загруженного образа
Блок checksum заставляет DP проверить то, что он скачал с HTTP-сервера. Образ перейдёт в фазу Ready, только если загруженный файл совпал со всеми указанными контрольными суммами, иначе ресурс окажется в фазе Failed:
d8 k apply -f - <<EOF
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualImage
metadata:
name: ubuntu-24-04
spec:
storage: ContainerRegistry
dataSource:
type: HTTP
http:
url: https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img
checksum:
sha256: 78be890d71dde316c412da2ce8332ba47b9ce7a29d573801d2777e01aa20b9b5
EOF
Возьмите контрольную сумму у зеркала, которое публикует образ, и укажите её в поле соответствующего алгоритма:
| Поле | Алгоритм | Скорость проверки |
|---|---|---|
sha1 |
SHA-1 | ~1,6 ГБ/с |
sha256 |
SHA-256 | ~1,5 ГБ/с |
md5 |
MD5 | ~700 МБ/с |
sha512 |
SHA-512 | ~570 МБ/с |
streebog256 |
ГОСТ Р 34.11-2012 («Стрибог»), 256 бит | ~17 МБ/с |
streebog512 |
ГОСТ Р 34.11-2012 («Стрибог»), 512 бит | ~17 МБ/с |
Скорости даны как порядок величины, а не как обещание. Они измерены на процессоре x86-64 с набором инструкций SHA, а процессор без него считает SHA-1 и SHA-256 в несколько раз медленнее. На любом процессоре сохраняется другое, а именно расстояние между строками. SHA-1 и SHA-256 вычисляются отдельными инструкциями, MD5 и SHA-512 написанным вручную ассемблером, и все четыре хешируют данные быстрее, чем те приходят по сети, поэтому их стоимость остаётся незаметной на фоне самой загрузки.
Алгоритмы «Стрибог» аппаратной поддержки не имеют нигде и медленнее примерно на два порядка. Для образа в 10 ГиБ это около десяти минут одного только хеширования, и создание образа упирается уже в процессор, а не в сеть. Указывайте их только тогда, когда контрольная сумма по ГОСТ действительно требуется. Обе длины стоят одинаково, потому что ГОСТ Р 34.11-2012 использует одну и ту же функцию сжатия и для 256, и для 512 бит, а короткий вариант отличается только начальным значением.
Контрольные суммы считаются за один проход по загружаемым данным, поэтому указание нескольких сумм сразу стоит суммы их времён. Незаполненные поля не стоят ничего.
Тот же блок доступен для источника Upload в параметре dataSource.upload.checksum и работает так же. Загружаемые данные проверяются по всем указанным контрольным суммам, а при несовпадении ресурс остаётся в фазе Failed.
Хранение образа в PVC
Чтобы диски создавались из образа быстрее, храните его в PVC. Тогда DP сможет клонировать том вместо повторной распаковки.
- В командной строке
- В веб-интерфейсе
-
Создайте ресурс VirtualImage с типом хранения
PersistentVolumeClaim:d8 k apply -f - <<EOF apiVersion: virtualization.deckhouse.io/v1alpha2 kind: VirtualImage metadata: name: ubuntu-24-04-pvc spec: # Настройки хранения проектного образа. storage: PersistentVolumeClaim persistentVolumeClaim: # Подставьте название своего StorageClass. storageClassName: rv-thin-r2 # Источник для создания образа. dataSource: type: HTTP http: url: https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img EOFЕсли параметр
.spec.persistentVolumeClaim.storageClassNameне указан, DP возьмёт StorageClass по умолчанию на уровне кластера либо класс, заданный для образов в настройках модуля. -
Проверьте, что образ создан:
d8 k get vi ubuntu-24-04-pvcПример вывода:
NAME PHASE CDROM PROGRESS AGE ubuntu-24-04-pvc Ready false 100% 23h
- Перейдите на вкладку «Проекты» и выберите нужный проект.
- Перейдите в раздел «Виртуализация» → «Образы».
- Нажмите кнопку «Создать».
- В блоке «Источник» выберите «По ссылке».
- В открывшейся форме в поле «Имя образа» введите имя образа.
- В блоке «Хранилище» в поле «Тип хранилища» выберите
PersistentVolumeClaim. - В поле «Класс хранилища» выберите StorageClass или оставьте вариант по умолчанию.
- В поле «URL» укажите ссылку на образ.
- Нажмите кнопку «Создать».
- Проверьте статус образа на его странице.
Создание образа из хранилища образов контейнеров
DP умеет забирать образ из внешнего хранилища образов контейнеров, но файл диска должен лежать в образе контейнера по пути /disk. Ниже показано, как подготовить такой образ контейнера и создать из него образ проекта.
- В командной строке
- В веб-интерфейсе
-
Скачайте файл образа на локальную машину:
curl -L https://cloud-images.ubuntu.com/minimal/releases/noble/release/ubuntu-24.04-minimal-cloudimg-amd64.img -o ubuntu2404.img -
Создайте
Dockerfileсо следующим содержимым:FROM scratch COPY ubuntu2404.img /disk/ubuntu2404.img -
Соберите образ контейнера. В примере используется хранилище docker.com, для работы с которым нужны учётная запись и настроенное окружение:
docker build -t docker.io/<USERNAME>/ubuntu2404:latestЗдесь
<USERNAME>— имя пользователя, указанное при регистрации в хранилище. -
Загрузите собранный образ контейнера в хранилище:
docker push docker.io/<USERNAME>/ubuntu2404:latest -
Создайте ресурс VirtualImage, указав путь к образу контейнера:
d8 k apply -f - <<EOF apiVersion: virtualization.deckhouse.io/v1alpha2 kind: VirtualImage metadata: name: ubuntu-2404 spec: storage: ContainerRegistry dataSource: type: ContainerImage containerImage: image: docker.io/<USERNAME>/ubuntu2404:latest EOF
DP работает только с теми хранилищами, где включён TLS. Если хранилище использует собственный центр сертификации, передайте цепочку сертификатов в параметре caBundle, а учётные данные для доступа к закрытому хранилищу возьмите из секрета, указанного в параметре imagePullSecret.
- Перейдите на вкладку «Проекты» и выберите нужный проект.
- Перейдите в раздел «Виртуализация» → «Образы».
- Нажмите кнопку «Создать».
- В блоке «Источник» выберите «Из реестра».
- В открывшейся форме в поле «Имя образа» введите имя образа.
- В блоке «Хранилище» в поле «Тип хранилища» выберите
ContainerRegistry. - В поле «Образ в реестре контейнеров» укажите путь к образу контейнера.
- Нажмите кнопку «Создать».
- Проверьте статус образа на его странице.
Загрузка образа из командной строки
Если файл образа лежит на вашем компьютере, загрузите его напрямую. DP создаёт для этого временную точку приёма данных и ждёт загрузки.
- В командной строке
- В веб-интерфейсе
-
Создайте ресурс VirtualImage с источником
Upload:d8 k apply -f - <<EOF apiVersion: virtualization.deckhouse.io/v1alpha2 kind: VirtualImage metadata: name: some-image spec: # Настройки хранения проектного образа. storage: ContainerRegistry # Настройки источника образа. dataSource: type: Upload EOFРесурс перейдёт в фазу
WaitForUserUploadи будет готов принять файл. Начните загрузку в течение 10 минут, иначе ресурс перейдёт в фазуFailedи его придётся создать заново. -
Получите адреса, по которым принимается файл:
d8 k get vi some-image -o jsonpath="{.status.imageUploadURLs}" | jqПример вывода:
{ "external": "https://virtualization.example.com/upload/<SECRET_URL>", "inCluster": "http://10.222.165.239/upload" }Адрес
inClusterиспользуйте, если загружаете файл с одного из узлов кластера, аexternal— во всех остальных случаях. -
Загрузите файл по выбранному адресу. В примере сначала скачивается образ 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/<SECRET_URL> --progress-bar -T cirros.img | catЗдесь
<SECRET_URL>— последняя часть адреса из предыдущего шага. -
Убедитесь, что образ перешёл в фазу
Ready:d8 k get vi some-imageПример вывода:
NAME PHASE CDROM PROGRESS AGE some-image Ready false 100% 1m
Загруженный файл тоже можно сверить с контрольной суммой, для этого задайте блок checksum в источнике данных. Суммы считаются по байтам, которые передаёт клиент, а при несовпадении ресурс остаётся в фазе Failed, и загрузку придётся повторить на пересозданном ресурсе.
- Перейдите на вкладку «Проекты» и выберите нужный проект.
- Перейдите в раздел «Виртуализация» → «Образы».
- Нажмите кнопку «Создать», затем в блоке «Источник» выберите «Загрузить».
- В поле «Имя образа» введите имя образа.
- В блоке «Загрузить файл» перетащите файл в выделенную область или нажмите «выберите на вашем компьютере».
- Выберите файл в открывшемся файловом менеджере.
- Нажмите кнопку «Создать».
- Дождитесь, когда образ перейдёт в состояние «Готов».
Создание образа из диска
Образ можно создать из диска, если диск не подключён ни к одной виртуальной машине либо машина, к которой он подключён, выключена.
- В командной строке
- В веб-интерфейсе
Создайте образ, указав источником нужный диск:
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. - В поле «Источник» выберите нужный диск из выпадающего списка.
- Нажмите кнопку «Создать».
- Проверьте статус образа на его странице.
Создание образа из снимка диска
Образ можно создать из снимка диска, если снимок находится в фазе Ready.
- В командной строке
- В веб-интерфейсе
Создайте образ, указав источником снимок диска:
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
- Перейдите на вкладку «Проекты» и выберите нужный проект.
- Перейдите в раздел «Виртуализация» → «Образы».
- Нажмите кнопку «Создать».
- В открывшейся форме в поле «Имя образа» введите имя образа.
- В блоке «Хранилище» в поле «Тип хранилища» выберите тип хранения образа.
- В блоке «Источник» выберите «Создать из».
- В поле «Источник» раскройте список и в группе «Снимки дисков» выберите нужный снимок.
- Нажмите кнопку «Создать».
- Проверьте статус образа на его странице.
Свойства образа удобно смотреть в веб-интерфейсе, в разделе «Виртуализация» → «Образы»:
- список показывает имя образа, статус, размер, формат в колонке «Тип» и область видимости в колонке «Доступность», а фильтры сужают его по статусу, образу и типу;
- на странице образа вкладка «Информация» собирает параметры создания в блоках «Хранилище» и «Источник», а в блоке «Состояние» показывает среднюю скорость загрузки, формат, распакованный размер, размер в хранилище, длительность создания, признак «CD-ROM» и путь к образу в DVCR;
- вкладки «Мета» и «YAML» показывают лейблы с аннотациями и полную спецификацию ресурса.