При первом запуске виртуальной машины (ВМ) гостевая система настраивается сценарием начальной инициализации, а дальше Deckhouse Platform (DP) общается с ней через агента гостевой ОС.
Сценарии начальной инициализации ВМ
Сценарии начальной инициализации предназначены для первичной конфигурации виртуальной машины при её запуске.
В качестве сценариев начальной инициализации поддерживаются:
Cloud-Init
Cloud-Init — это инструмент для автоматической настройки виртуальных машин при первом запуске. Он позволяет выполнять широкий спектр задач конфигурации без ручного вмешательства.
Конфигурация Cloud-Init записывается в формате YAML и должна начинаться с заголовка #cloud-config в начале блока конфигурации. О других возможных заголовках и их назначении вы можете узнать в официальной документации по cloud-init.
Основные возможности Cloud-Init:
- создание пользователей, установка паролей, добавление SSH-ключей для доступа;
- автоматическая установка необходимого программного обеспечения при первом запуске;
- запуск произвольных команд и скриптов для настройки системы;
- автоматический запуск и включение системных сервисов (например,
qemu-guest-agent).
Ниже приведены типичные сценарии.
-
Добавление SSH-ключа для предустановленного пользователя, который уже может присутствовать в cloud-образе (например, пользователь
ubuntuв официальных образах Ubuntu). Имя такого пользователя зависит от образа. Уточните его в документации к вашему дистрибутиву.#cloud-config ssh_authorized_keys: - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD... your-public-key ... -
Создание пользователя с паролем и SSH-ключом:
#cloud-config users: - name: cloud passwd: <PASSWORD_HASH> lock_passwd: false sudo: ALL=(ALL) NOPASSWD:ALL shell: /bin/bash ssh-authorized-keys: - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD... your-public-key ... ssh_pwauth: TrueЗдесь
<PASSWORD_HASH>— хеш пароля в кавычках, полученный командойmkpasswd --method=SHA-512 --rounds=4096. -
Установка пакетов и сервисов:
#cloud-config package_update: true packages: - nginx - qemu-guest-agent runcmd: - systemctl daemon-reload - systemctl enable --now nginx.service - systemctl enable --now qemu-guest-agent.service
Ниже показано, как передать сценарий виртуальной машине:
- В командной строке
- В веб-интерфейсе
Сценарий Cloud-Init можно встраивать непосредственно в спецификацию виртуальной машины, но этот сценарий ограничен максимальной длиной в 2048 байт:
spec:
provisioning:
type: UserData
userData: |
#cloud-config
package_update: true
...
Если сценарий длинный или содержит приватные данные, создайте его в ресурсе Secret. Пример ресурса Secret со сценарием Cloud-Init приведён ниже:
apiVersion: v1
kind: Secret
metadata:
name: cloud-init-example
data:
userData: <base64 data>
type: provisioning.virtualization.deckhouse.io/cloud-init
Фрагмент конфигурации виртуальной машины при использовании скрипта начальной инициализации Cloud-Init, хранящегося в ресурсе Secret:
spec:
provisioning:
type: UserDataRef
userDataRef:
kind: Secret
name: cloud-init-example
Значение поля
.data.userDataдолжно быть закодировано в формате Base64. Для кодирования можно использовать командуbase64 -w 0илиecho -n "content" | base64.
- Перейдите на вкладку «Проекты» и выберите нужный проект.
- Перейдите в раздел «Виртуализация» → «Виртуальные машины».
- Создайте виртуальную машину или выберите существующую и нажмите на её имя.
- На вкладке «Конфигурация» прокрутите страницу вниз до переключателя «Cloud-init» и включите его.
- Выберите режим заполнения:
- «Базовая настройка» — заполните поля «Имя пользователя», «Пароль» и «Публичный SSH-ключ», при необходимости включите переключатель «Неограниченный sudo-доступ». Конфигурацию cloud-init DP сформирует сама;
- «Редактирование» — введите конфигурацию cloud-init вручную в поле «Параметры». Под полем отображается использованный объём (не более 2048 байт). В поле «Связанный секрет» можно выбрать существующий скрипт инициализации, и его содержимое загрузится в поле. Если секрет не привязан, конфигурация хранится в спецификации ВМ.
- Нажмите появившуюся кнопку «Сохранить» (при создании ВМ — кнопку «Создать»).
Сценарий можно хранить отдельным ресурсом и переиспользовать для нескольких ВМ. Чтобы создать такой ресурс:
- Перейдите на вкладку «Проекты» и выберите нужный проект.
- Перейдите в раздел «Виртуализация» → «Скрипты инициализации».
- Нажмите кнопку «Создать».
- В поле «Имя» введите имя скрипта, в поле «Тип» выберите
cloud-initилиsysprep. - В блоке «Файлы» в поле «Имя файла» задайте ключ (по умолчанию —
userData), а содержимое введите вручную, перетащите файл в поле или нажмите на него, чтобы загрузить файл. - Нажмите кнопку «Создать».
В разделе «Скрипты инициализации» отображаются секреты с типом provisioning.virtualization.deckhouse.io/*, для каждого показаны имя, тип (cloud-init или sysprep), список ключей и возраст ресурса. Чтобы виртуальная машина использовала такой скрипт, сошлитесь на него в параметре .spec.provisioning.userDataRef.
Sysprep
Для конфигурирования виртуальных машин под управлением ОС Windows с использованием Sysprep поддерживается только вариант с ресурсом Secret.
Пример ресурса Secret со сценарием Sysprep:
apiVersion: v1
kind: Secret
metadata:
name: sysprep-example
data:
unattend.xml: <base64 data>
type: provisioning.virtualization.deckhouse.io/sysprep
Значение поля .data.unattend.xml должно быть закодировано в формате Base64. Для кодирования можно использовать команду base64 -w 0 или echo -n "content" | base64.
Фрагмент конфигурации виртуальной машины с использованием скрипта начальной инициализации Sysprep в ресурсе Secret:
spec:
provisioning:
type: SysprepRef
sysprepRef:
kind: Secret
name: sysprep-example
Агент гостевой ОС
Установите в гостевую систему QEMU Guest Agent, чтобы DP мог взаимодействовать с операционной системой внутри ВМ. Агент нужен для трёх вещей:
- он позволяет создавать консистентные снимки дисков и ВМ;
- он сообщает сведения о работающей системе, и они попадают в блок
.status.guestOSInfo; - по нему видно, что операционная система действительно загрузилась, а не просто запустилась виртуальная машина.
DP работает с qemu-guest-agent версии 5.2.0 и выше. Проверить установленную версию можно командой:
qemu-guest-agent --version
Сведения о гостевой системе выглядят так:
status:
guestOSInfo:
id: fedora
kernelRelease: 6.11.4-301.fc41.x86_64
kernelVersion: "#1 SMP PREEMPT_DYNAMIC Sun Oct 20 15:02:33 UTC 2024"
machine: x86_64
name: Fedora Linux
prettyName: Fedora Linux 41 (Cloud Edition)
version: 41 (Cloud Edition)
versionId: "41"
Работает ли агент, показывает колонка AGENT:
d8 k get vm -o wide
Пример вывода:
NAME PHASE UPTIME CORES COREFRACTION MEMORY NEED RESTART AGENT MIGRATABLE NODE IPADDRESS AGE
fedora Running 5d21h 6 5% 8000Mi False True True virtlab-pt-1 10.66.10.1 5d21h
Установите агента командой для вашего дистрибутива и запустите службу:
# Debian и производные.
sudo apt install qemu-guest-agent
# CentOS и производные.
sudo yum install qemu-guest-agent
sudo systemctl enable --now qemu-guest-agent
Для Linux установку удобно автоматизировать сценарием начальной инициализации:
#cloud-config
package_update: true
packages:
- qemu-guest-agent
runcmd:
- systemctl enable --now qemu-guest-agent.service
Настраивать агента после установки не требуется. Если снимкам нужна согласованность данных приложения, положите скрипты подготовки в каталог /etc/qemu-ga/hooks.d/ на Debian и Ubuntu либо /etc/qemu/fsfreeze-hook.d/ на RHEL, CentOS и Fedora. Скрипты должны быть исполняемыми, агент запускает их до заморозки файловой системы и после её разморозки, поэтому сервисы приложения останавливать не приходится.