На странице представлены часто задаваемые вопросы по настройке и использованию Deckhouse Virtualization Platform.
Управление платформой
Как увеличить размер DVCR?
Размер тома DVCR задаётся в ModuleConfig модуля virtualization (spec.settings.dvcr.storage.persistentVolumeClaim.size). Новое значение должно быть больше текущего.
-
Проверьте текущий размер DVCR:
d8 k get mc virtualization -o jsonpath='{.spec.settings.dvcr.storage.persistentVolumeClaim}'Пример вывода:
{"size":"58G","storageClass":"linstor-thick-data-r1"} -
Увеличьте
sizeчерезpatch(подставьте нужное значение):d8 k patch mc virtualization \ --type merge -p '{"spec": {"settings": {"dvcr": {"storage": {"persistentVolumeClaim": {"size":"59G"}}}}}}'Пример вывода:
moduleconfig.deckhouse.io/virtualization patched -
Убедитесь, что в ModuleConfig отображается новый размер:
d8 k get mc virtualization -o jsonpath='{.spec.settings.dvcr.storage.persistentVolumeClaim}'Пример вывода:
{"size":"59G","storageClass":"linstor-thick-data-r1"} -
Проверьте текущее состояние DVCR:
d8 k get pvc dvcr -n d8-virtualizationПример вывода:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE dvcr Bound pvc-6a6cedb8-1292-4440-b789-5cc9d15bbc6b 57617188Ki RWO linstor-thick-data-r1 7d
Как восстановить кластер, если после смены лицензии образы из registry.deckhouse.io не загружаются?
После смены лицензии на кластере с containerd v1 и удаления устаревшей лицензии образы из registry.deckhouse.io могут перестать загружаться. При этом на узлах остаётся устаревший файл конфигурации /etc/containerd/conf.d/dvcr.toml, который не удаляется автоматически. Из-за него не запускается модуль registry, без которого не работает DVCR.
Манифест NodeGroupConfiguration (NGC) после применения удалит файл на узлах. После запуска модуля registry манифест нужно удалить, так как это разовое исправление.
-
Сохраните манифест в файл (например,
containerd-dvcr-remove-old-config.yaml):apiVersion: deckhouse.io/v1alpha1 kind: NodeGroupConfiguration metadata: name: containerd-dvcr-remove-old-config.sh spec: weight: 32 # Должен быть в диапазоне 32–90 nodeGroups: ["*"] bundles: ["*"] content: | # Copyright 2023 Flant JSC # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. rm -f /etc/containerd/conf.d/dvcr.toml -
Примените сохранённый манифест:
d8 k apply -f containerd-dvcr-remove-old-config.yaml -
Проверьте, что модуль
registryзапущен:d8 k -n d8-system -o yaml get secret registry-state | yq -C -P '.data | del .state | map_values(@base64d) | .conditions = (.conditions | from_yaml)'Пример вывода при успешном запуске:
conditions: # ... - lastTransitionTime: "..." message: "" reason: "" status: "True" type: Ready -
Удалите разовый манифест NodeGroupConfiguration:
d8 k delete -f containerd-dvcr-remove-old-config.yaml
Подробнее о миграции см. в статье Миграция container runtime на containerd v2.
Конфигурирование виртуальных машин
Как автоматически сгенерировать inventory для Ansible?
Для использования команды d8 v ansible-inventory требуется версия d8 v0.27.0 или выше.
Команда работает только для виртуальных машин, у которых подключена основная сеть кластера (Main).
Вместо ручного создания inventory-файла можно использовать команду d8 v ansible-inventory, которая автоматически генерирует инвентарь Ansible из виртуальных машин в указанном неймспейсе. Команда совместима с интерфейсом ansible inventory script.
Команда включает в инвентарь только виртуальные машины с назначенными IP-адресами в состоянии Running. Имена хостов формируются в формате <vmname>.<namespace> (например, frontend.demo-app).
-
При необходимости задайте переменные хоста через аннотации (например, пользователя для SSH):
d8 k -n demo-app annotate vm frontend provisioning.virtualization.deckhouse.io/ansible_user="cloud" -
Запустите Ansible с динамически сформированным инвентарём:
ANSIBLE_INVENTORY_ENABLED=yaml ansible -m shell -a "uptime" all -i <(d8 v ansible-inventory -n demo-app -o yaml)Конструкция
<(...)необходима, потому что Ansible ожидает файл или скрипт в качестве источника списка хостов. Простое указание команды в кавычках не сработает — Ansible попытается выполнить строку как скрипт. Конструкция<(...)передаёт вывод команды как файл, который Ansible может прочитать. -
Либо сохраните инвентарь в файл и выполните проверку:
d8 v ansible-inventory --list -o yaml -n demo-app > inventory.yaml ansible -m shell -a "uptime" -i inventory.yaml all
Как использовать Ansible для конфигурирования виртуальных машин?
Ansible — это инструмент автоматизации, который позволяет выполнять задачи на удаленных серверах с использованием протокола SSH. В данном примере мы рассмотрим, как использовать Ansible для управления виртуальными машинами расположенными в проекте demo-app.
В рамках примера предполагается, что:
- в неймспейсе
demo-appесть ВМfrontend; - в ВМ есть пользователь
cloudс доступом по SSH; - на машине, где запускается Ansible, приватный SSH-ключ хранится в файле
/home/user/.ssh/id_rsa.
-
Создайте файл
inventory.yaml:--- all: vars: ansible_ssh_common_args: '-o ProxyCommand="d8 v port-forward --stdio=true %h %p"' # Пользователь по умолчанию, для доступа по SSH. ansible_user: cloud # Путь к приватному ключу. ansible_ssh_private_key_file: /home/user/.ssh/id_rsa hosts: # Название узла в формате <название ВМ>.<название проекта>. frontend.demo-app: -
Проверьте значение
uptimeвиртуальной машины:ansible -m shell -a "uptime" -i inventory.yaml all # frontend.demo-app | CHANGED | rc=0 >> # 12:01:20 up 2 days, 4:59, 0 users, load average: 0.00, 0.00, 0.00
Если вы не хотите использовать файл inventory, передайте все параметры прямо в командной строке:
ansible -m shell -a "uptime" \
-i "frontend.demo-app," \
-e "ansible_ssh_common_args='-o ProxyCommand=\"d8 v port-forward --stdio=true %h %p\"'" \
-e "ansible_user=cloud" \
-e "ansible_ssh_private_key_file=/home/user/.ssh/id_rsa" \
all
Как использовать cloud-init для конфигурирования виртуальных машин?
Cloud-init применяется для первичной настройки гостевой ОС при первом запуске. Конфигурация задаётся в YAML и начинается с директивы #cloud-config.
Для образов, рассчитанных на cloud-init (в том числе официальных cloud-образов дистрибутивов), конфигурацию cloud-init нужно передать явно: иначе на части дистрибутивов не поднимается сеть, и ВМ оказывается недоступна по сети даже при подключении основной сети (Main).
Кроме того, в cloud-образах по умолчанию отключена возможность входа в систему — необходимо добавить SSH-ключи для пользователя по умолчанию либо создать нового пользователя с SSH-доступом, иначе доступ к виртуальной машине будет невозможен.
Обновление и установка пакетов
Пример cloud-config для обновления системы и установки пакетов из списка:
#cloud-config
# Обновить списки пакетов
package_update: true
# Обновить установленные пакеты до последних версий
package_upgrade: true
# Список пакетов для установки
packages:
- nginx
- curl
- htop
# Команды для выполнения после установки пакетов
runcmd:
- systemctl enable --now nginx.service
Создание пользователя
Пример cloud-config для создания локального пользователя с паролем и SSH-ключом:
#cloud-config
# Список пользователей для создания
users:
- name: cloud # Имя пользователя
passwd: "$6$rounds=4096$saltsalt$..." # Хеш пароля (SHA-512)
lock_passwd: false # Не блокировать учётную запись
sudo: ALL=(ALL) NOPASSWD:ALL # Права sudo без запроса пароля
shell: /bin/bash # Оболочка по умолчанию
ssh-authorized-keys: # SSH-ключи для доступа
- ssh-ed25519 AAAAC3NzaC... your-public-key ...
# Разрешить аутентификацию по паролю через SSH
ssh_pwauth: true
Чтобы получить хеш пароля для поля passwd, выполните команду:
mkpasswd --method=SHA-512 --rounds=4096
Создание файла с нужными правами
Пример cloud-config для создания файла с заданными правами доступа:
#cloud-config
# Список файлов для создания
write_files:
- path: /opt/scripts/start.sh # Путь к файлу
content: | # Содержимое файла
#!/bin/bash
echo "Starting application"
owner: cloud:cloud # Владелец файла (пользователь:группа)
permissions: '0755' # Права доступа (восьмеричный формат)
Настройка диска и файловой системы
Пример cloud-config для разметки диска, создания файловой системы и монтирования:
#cloud-config
# Настройка разметки диска
disk_setup:
/dev/sdb: # Устройство диска
table_type: gpt # Тип таблицы разделов (gpt или mbr)
layout: true # Автоматически создать разделы
overwrite: false # Не перезаписывать существующие разделы
# Настройка файловых систем
fs_setup:
- label: data # Метка файловой системы
filesystem: ext4 # Тип файловой системы
device: /dev/sdb1 # Устройство раздела
partition: auto # Автоматически определить раздел
# Монтирование файловых систем
mounts:
# [устройство, точка_монтирования, тип_ФС, опции, dump, pass]
- ["/dev/sdb1", "/mnt/data", "ext4", "defaults", "0", "2"]
Настройка сетевых интерфейсов для дополнительных сетей
Настройки, описанные в этом разделе, применяются только для дополнительных сетей. Основная сеть (Main) настраивается автоматически через cloud-init и не требует ручной конфигурации.
Если к виртуальной машине подключены дополнительные сети, их необходимо настроить вручную через cloud-init: конфигурационные файлы создаются в write_files, применение настроек — в runcmd.
Подробнее о подключении дополнительных сетей к виртуальной машине см. в разделе Дополнительные сетевые интерфейсы.
Для systemd-networkd
Пример cloud-config для дистрибутивов, использующих systemd-networkd (Debian, CoreOS и др.):
#cloud-config
write_files:
- path: /etc/systemd/network/10-eth1.network
content: |
[Match]
Name=eth1
[Network]
Address=192.168.1.10/24
Gateway=192.168.1.1
DNS=8.8.8.8
runcmd:
- systemctl restart systemd-networkd
Для Netplan (Ubuntu)
Пример cloud-config для Ubuntu и других систем, использующих Netplan:
#cloud-config
write_files:
- path: /etc/netplan/99-custom.yaml
content: |
network:
version: 2
ethernets:
eth1:
addresses:
- 10.0.0.5/24
gateway4: 10.0.0.1
nameservers:
addresses: [8.8.8.8]
eth2:
dhcp4: true
runcmd:
- netplan apply
Для ifcfg (RHEL/CentOS)
Пример cloud-config для RHEL-совместимых дистрибутивов, использующих схему ifcfg и NetworkManager:
#cloud-config
write_files:
- path: /etc/sysconfig/network-scripts/ifcfg-eth1
content: |
DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
IPADDR=192.168.1.10
PREFIX=24
GATEWAY=192.168.1.1
DNS1=8.8.8.8
runcmd:
- nmcli connection reload
- nmcli connection up eth1
Для Alpine Linux
Пример cloud-config для дистрибутивов, использующих традиционный формат /etc/network/interfaces (Alpine и аналоги):
#cloud-config
write_files:
- path: /etc/network/interfaces
append: true
content: |
auto eth1
iface eth1 inet static
address 192.168.1.10
netmask 255.255.255.0
gateway 192.168.1.1
runcmd:
- /etc/init.d/networking restart
Как перенаправить трафик на виртуальную машину?
Виртуальная машина функционирует в кластере Kubernetes, поэтому сетевой трафик направляется к ней по аналогии с направлением трафика к подам. Для маршрутизации сетевого трафика на виртуальную машину применяется стандартный механизм Kubernetes — ресурс Service, который выбирает целевые объекты по лейблам (label selector).
-
Создайте сервис с требуемыми настройками.
В качестве примера приведена виртуальная машина с меткой
vm: frontend-0, HTTP-сервисом, опубликованным на портах 80 и 443, и открытым SSH на порту 22:apiVersion: virtualization.deckhouse.io/v1alpha2 kind: VirtualMachine metadata: name: frontend-0 namespace: dev labels: vm: frontend-0 spec: ... -
Чтобы направить сетевой трафик на порты виртуальной машины, создайте сервис:
Следующий сервис обеспечивает доступ к виртуальной машине: он слушает порты 80 и 443 и перенаправляет трафик на соответствующие порты целевой виртуальной машины. SSH-доступ извне предоставляется по порту 2211:
apiVersion: v1 kind: Service metadata: name: frontend-0-svc namespace: dev spec: type: LoadBalancer ports: - name: ssh port: 2211 protocol: TCP targetPort: 22 - name: http port: 80 protocol: TCP targetPort: 80 - name: https port: 443 protocol: TCP targetPort: 443 selector: vm: frontend-0
Работа с виртуальными машинами
Как создать golden image для Linux?
Golden image — это предварительно настроенный образ виртуальной машины, который можно использовать для быстрого создания новых ВМ с уже установленным программным обеспечением и настройками.
-
Создайте виртуальную машину, установите на неё необходимое программное обеспечение и выполните все требуемые настройки.
-
Установите и настройте
qemu-guest-agent(рекомендуется):-
Для RHEL/CentOS:
yum install -y qemu-guest-agent -
Для Debian/Ubuntu:
apt-get update apt-get install -y qemu-guest-agent
-
-
Включите и запустите сервис:
systemctl enable qemu-guest-agent systemctl start qemu-guest-agent -
Установите политику запуска ВМ runPolicy: AlwaysOnUnlessStoppedManually — это потребуется, чтобы ВМ можно было выключить.
-
Подготовьте образ. Очистите неиспользуемые блоки файловой системы:
fstrim -v / fstrim -v /boot -
Очистите сетевые настройки:
-
Для RHEL:
nmcli con delete $(nmcli -t -f NAME,DEVICE con show | grep -v ^lo: | cut -d: -f1) rm -f /etc/sysconfig/network-scripts/ifcfg-eth* -
Для Debian/Ubuntu:
rm -f /etc/network/interfaces.d/*
-
-
Очистите системные идентификаторы:
echo -n > /etc/machine-id rm -f /var/lib/dbus/machine-id ln -s /etc/machine-id /var/lib/dbus/machine-id -
Удалите SSH host keys:
rm -f /etc/ssh/ssh_host_* -
Очистите systemd journal:
journalctl --vacuum-size=100M --vacuum-time=7d -
Очистите кеш пакетных менеджеров:
-
Для RHEL:
yum clean all -
Для Debian/Ubuntu:
apt-get clean
-
-
Очистите временные файлы:
rm -rf /tmp/* rm -rf /var/tmp/* -
Очистите логи:
find /var/log -name "*.log" -type f -exec truncate -s 0 {} \; -
Очистите историю команд:
history -cДля RHEL: выполните сброс и восстановление контекстов SELinux (выберите один из вариантов):
-
Вариант 1: Проверка и восстановление контекстов немедленно:
restorecon -R / -
Вариант 2: Запланировать
relabelпри следующей загрузке:touch /.autorelabel
-
-
Проверьте, что в
/etc/fstabуказаны UUID илиLABEL, а не имена вида/dev/sdX:blkid cat /etc/fstab -
Сбросьте состояние cloud-init (логи и seed):
cloud-init clean --logs --seed -
Выполните финальную синхронизацию и очистку буферов:
sync echo 3 > /proc/sys/vm/drop_caches -
Выключите виртуальную машину:
poweroff -
Создайте ресурс VirtualImage, указав исходный ресурс VirtualDisk подготовленной ВМ:
d8 k apply -f -<<EOF apiVersion: virtualization.deckhouse.io/v1alpha2 kind: VirtualImage metadata: name: <image-name> namespace: <namespace> spec: dataSource: type: ObjectRef objectRef: kind: VirtualDisk name: <source-disk-name> EOFЛибо создайте ресурс ClusterVirtualImage, чтобы образ был доступен на уровне кластера для всех проектов:
d8 k apply -f -<<EOF apiVersion: virtualization.deckhouse.io/v1alpha2 kind: ClusterVirtualImage metadata: name: <image-name> spec: dataSource: type: ObjectRef objectRef: kind: VirtualDisk name: <source-disk-name> namespace: <namespace> EOF -
Создайте новый ресурс VirtualDisk из полученного образа:
d8 k apply -f -<<EOF apiVersion: virtualization.deckhouse.io/v1alpha2 kind: VirtualDisk metadata: name: <vm-disk-name> namespace: <namespace> spec: dataSource: type: ObjectRef objectRef: kind: VirtualImage name: <image-name> EOF
После выполнения всех шагов у вас будет Golden image, который можно использовать для быстрого создания новых виртуальных машин с предустановленным программным обеспечением и настройками.
Как установить ОС в виртуальной машине из ISO-образа?
Ниже приведён типовой сценарий установки гостевой ОС Windows из ISO-образа. Перед началом разместите ISO-образ на HTTP-ресурсе, доступном из кластера.
-
Создайте пустой VirtualDisk для установки ОС:
apiVersion: virtualization.deckhouse.io/v1alpha2 kind: VirtualDisk metadata: name: win-disk namespace: default spec: persistentVolumeClaim: size: 100Gi storageClassName: local-path -
Создайте ресурсы ClusterVirtualImage для ISO-образа ОС Windows и дистрибутива драйверов
VirtIO:apiVersion: virtualization.deckhouse.io/v1alpha2 kind: ClusterVirtualImage metadata: name: win-11-iso spec: dataSource: type: HTTP http: url: "http://example.com/win11.iso"apiVersion: virtualization.deckhouse.io/v1alpha2 kind: ClusterVirtualImage metadata: name: win-virtio-iso spec: dataSource: type: HTTP http: url: "https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso" -
Создайте виртуальную машину:
apiVersion: virtualization.deckhouse.io/v1alpha2 kind: VirtualMachine metadata: name: win-vm namespace: default labels: vm: win spec: virtualMachineClassName: generic runPolicy: Manual osType: Windows bootloader: EFI cpu: cores: 6 coreFraction: 50% memory: size: 8Gi enableParavirtualization: true blockDeviceRefs: - kind: VirtualDisk name: win-disk - kind: ClusterVirtualImage name: win-11-iso - kind: ClusterVirtualImage name: win-virtio-iso -
Запустите виртуальную машину:
d8 v start win-vm -
Подключитесь к консоли ВМ и завершите установку ОС и драйверов
VirtIOпри помощи графического установщика.Подключение по VNC:
d8 v vnc -n default win-vm -
После завершения установки перезагрузите виртуальную машину.
-
Для дальнейшей работы снова подключитесь по VNC:
d8 v vnc -n default win-vm
Как предоставить файл ответов Windows (Sysprep)?
Автоматическая установка Windows выполняется с файлом ответов (unattend.xml или autounattend.xml).
В примере ниже файл ответов:
- задаёт русский язык интерфейса и раскладку;
- подключает драйверы
VirtIOдля этапа установки (порядок устройств вblockDeviceRefsу ресурса VirtualMachine должен совпадать с путями в файле); - создаёт разметку диска для установки с EFI;
- создаёт пользователя
cloud(администратор, парольcloud) и пользователяuser(парольuser).
-
Сохраните файл ответов в
autounattend.xml(воспользуйтесь примером из блока выше или измените его под свои требования). -
Создайте секрет с типом
provisioning.virtualization.deckhouse.io/sysprep:d8 k create secret generic sysprep-config --type="provisioning.virtualization.deckhouse.io/sysprep" --from-file=./autounattend.xml -
Создайте виртуальную машину, которая в процессе установки будет использовать файл ответов. Укажите в спецификации
provisioningс типомSysprepRef. При необходимости добавьте в спецификацию другие файлы в формате Base64, необходимые для успешного выполнения скриптов внутри файла ответов:apiVersion: virtualization.deckhouse.io/v1alpha2 kind: VirtualMachine metadata: name: win-vm namespace: default labels: vm: win spec: virtualMachineClassName: generic provisioning: type: SysprepRef sysprepRef: kind: Secret name: sysprep-config runPolicy: AlwaysOn osType: Windows bootloader: EFI cpu: cores: 6 coreFraction: 50% memory: size: 8Gi enableParavirtualization: true blockDeviceRefs: - kind: VirtualDisk name: win-disk - kind: ClusterVirtualImage name: win-11-iso - kind: ClusterVirtualImage name: win-virtio-iso