Конфигурацию виртуальной машины (ВМ) можно менять в любой момент после создания. У выключенной машины изменения применяются сразу, а у работающей Deckhouse Platform (DP) применяет их по-разному, в зависимости от того, что именно вы изменили.
| Блок конфигурации | Как применяется у работающей ВМ |
|---|---|
.metadata.labels |
Сразу и распространяется на под ВМ |
.metadata.annotations |
Сразу и распространяется на под ВМ |
.spec.liveMigrationPolicy |
Сразу |
.spec.runPolicy |
Сразу |
.spec.disruptions.restartApprovalMode |
Сразу |
.spec.affinity |
Сразу в коммерческих редакциях DP, в DP Open нужен перезапуск |
.spec.nodeSelector |
Сразу в коммерческих редакциях DP, в DP Open нужен перезапуск |
.spec.cpu.cores |
Без перезапуска, если включено изменение числа ядер без перезапуска в коммерческих редакциях DP, иначе нужен перезапуск |
.spec.networks |
Добавление и удаление сетей применяется на работающей ВМ, если гостевая ОС поддерживает подключение интерфейсов на ходу |
Остальные поля .spec |
Нужен перезапуск |
Ниже показано, как изменить конфигурацию виртуальной машины:
- В командной строке
- В веб-интерфейсе
Ниже показан пример с изменением числа ядер.
-
Посмотрите, сколько ядер видит гостевая ОС сейчас:
d8 v ssh cloud@linux-vm --command "nproc"Пример вывода:
1 -
Задайте новое число ядер:
d8 k patch vm linux-vm --type merge -p '{"spec":{"cpu":{"cores":2}}}' # Того же результата можно добиться, отредактировав ресурс. d8 k edit vm linux-vm -
Убедитесь, что изменение принято, но ещё не применено. Гостевая ОС по-прежнему видит одно ядро, а список ожидающих изменений не пуст:
d8 k get vm linux-vm -o jsonpath="{.status.restartAwaitingChanges}" | jq .Пример вывода:
[ { "currentValue": 1, "desiredValue": 2, "operation": "replace", "path": "cpu.cores" } ]То же самое показывает колонка
NEED RESTART:d8 k get vm linux-vm -o wideПример вывода:
NAME PHASE UPTIME CORES COREFRACTION MEMORY NEED RESTART AGENT MIGRATABLE NODE IPADDRESS AGE linux-vm Running 5m16s 2 100% 1Gi True True True virtlab-pt-1 10.66.10.13 5m16s -
Перезапустите машину:
d8 v restart linux-vm -
Проверьте результат. После перезапуска блок
.status.restartAwaitingChangesпуст, а гостевая ОС видит два ядра:d8 v ssh cloud@linux-vm --command "nproc"Пример вывода:
2
По умолчанию перезапуск подтверждаете вы. Чтобы DP применял изменения сам, задайте в параметре .spec.disruptions.restartApprovalMode значение Automatic:
spec:
disruptions:
restartApprovalMode: Automatic
- Перейдите на вкладку «Проекты» и выберите нужный проект.
- Перейдите в раздел «Виртуализация» → «Виртуальные машины».
- Из списка выберите нужную ВМ и нажмите на её имя.
- Внесите изменения на вкладке «Конфигурация». Если машину требуется перезапустить, DP покажет предупреждение и список ожидающих изменений.
- Чтобы изменения применялись без вашего подтверждения, прокрутите страницу до раздела «Жизненный цикл», включите переключатель «Автоприменение изменений» и нажмите кнопку «Сохранить».
Изменение числа ядер без перезапуска
Число ядер работающей машины можно менять, не перезагружая её, если изменение применимо через живую миграцию. В пределах текущей топологии CPU ядра можно и добавлять, и убирать.
Возможность выключена по умолчанию. Чтобы её включить, администратор добавляет HotplugCPUWithLiveMigration в параметр .spec.settings.featureGates:
kind: ModuleConfig
metadata:
name: virtualization
spec:
settings:
featureGates:
- HotplugCPUWithLiveMigration
В веб-интерфейсе тот же переключатель называется «Изменение CPU без перезагрузки» и находится в блоке «Экспериментальные возможности» на вкладке «Система» → «Deckhouse» → «Модули» → virtualization → «Конфигурация». Права на это есть только у администратора DP.
Когда возможность включена, а новое значение .spec.cpu.cores остаётся в пределах текущей топологии, DP применяет изменение живой миграцией. Если изменение требует смены топологии, машину придётся перезагрузить. Правила расчёта топологии описаны в разделе «Топологии CPU».
- В командной строке
- В веб-интерфейсе
Задайте новое число ядер:
d8 k patch vm linux-vm --type merge -p '{"spec":{"cpu":{"cores":4}}}'
- Перейдите на вкладку «Проекты» и выберите нужный проект.
- Перейдите в раздел «Виртуализация» → «Виртуальные машины».
- Из списка выберите нужную ВМ и нажмите на её имя.
- На вкладке «Конфигурация» в разделе «Ресурсы» задайте новое значение в поле «Ядра ЦП».
- Нажмите появившуюся кнопку «Сохранить».
Гостевая ОС не всегда вводит новые ядра в работу сама, особенно после живой миграции. В Linux ядро включается через sysfs:
echo 1 > /sys/devices/system/cpu/cpu1/online
Чтобы это происходило автоматически, добавьте правило udev:
cat <<'EOF' > /etc/udev/rules.d/99-hotplug-cpu.rules
SUBSYSTEM=="cpu",ACTION=="add",RUN+="/bin/sh -c '[ ! -e /sys$devpath/online ] || echo 1 > /sys$devpath/online'"
EOF
Введённые в работу ядра появляются в выводе nproc, cat /proc/cpuinfo и top.
При уменьшении числа ядер в пределах текущей топологии распределение ядер по сокетам сохраняется.
Изменение объёма памяти без перезапуска
Объём памяти работающей машины можно увеличивать, не перезагружая её. Уменьшение требует перезапуска.
Возможность выключена по умолчанию. Чтобы её включить, администратор добавляет HotplugMemoryWithLiveMigration в параметр .spec.settings.featureGates:
kind: ModuleConfig
metadata:
name: virtualization
spec:
settings:
featureGates:
- HotplugMemoryWithLiveMigration
В веб-интерфейсе переключатель называется «Изменение памяти без перезагрузки» и лежит там же, в блоке «Экспериментальные возможности» настроек модуля.
Когда возможность включена, новое значение .spec.memory.size больше текущего и машина допускает миграцию, DP применяет изменение живой миграцией. Перезапуск понадобится, если память уменьшают, если исходный размер меньше 1 ГиБ или если машину нельзя мигрировать. Без перезапуска память растёт до 256 ГиБ, это предел, заложенный в конфигурацию машины при первом запуске.
- В командной строке
- В веб-интерфейсе
Задайте новый объём памяти:
d8 k patch vm linux-vm --type merge -p '{"spec":{"memory":{"size":"4Gi"}}}'
- Перейдите на вкладку «Проекты» и выберите нужный проект.
- Перейдите в раздел «Виртуализация» → «Виртуальные машины».
- Из списка выберите нужную ВМ и нажмите на её имя.
- На вкладке «Конфигурация» в разделе «Ресурсы» задайте новое значение в поле «Объём памяти».
- Нажмите появившуюся кнопку «Сохранить».
Как и с ядрами, гостевая ОС может не ввести новые блоки памяти в работу сама. В Linux блок включается через sysfs, а имя устройства видно в выводе lsmem или в каталоге /sys/bus/memory/devices/:
echo 1 > /sys/bus/memory/devices/memoryXXX/online
Чтобы это происходило автоматически, добавьте правило udev:
cat <<'EOF' > /etc/udev/rules.d/99-hotplug-memory.rules
SUBSYSTEM=="memory",ACTION=="add",DEVPATH=="/devices/system/memory/memory[0-9]*", TEST=="state", ATTR{state}!="online", ATTR{state}="online"
EOF