Конфигурацию виртуальной машины (ВМ) можно менять в любой момент после создания. У выключенной машины изменения применяются сразу, а у работающей 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 Нужен перезапуск

Ниже показано, как изменить конфигурацию виртуальной машины:

  • В командной строке
  • В веб-интерфейсе

Ниже показан пример с изменением числа ядер.

  1. Посмотрите, сколько ядер видит гостевая ОС сейчас:

    d8 v ssh cloud@linux-vm --command "nproc"
    

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

    1
    
  2. Задайте новое число ядер:

    d8 k patch vm linux-vm --type merge -p '{"spec":{"cpu":{"cores":2}}}'
    
    # Того же результата можно добиться, отредактировав ресурс.
    d8 k edit vm linux-vm
    
  3. Убедитесь, что изменение принято, но ещё не применено. Гостевая ОС по-прежнему видит одно ядро, а список ожидающих изменений не пуст:

    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
    
  4. Перезапустите машину:

    d8 v restart linux-vm
    
  5. Проверьте результат. После перезапуска блок .status.restartAwaitingChanges пуст, а гостевая ОС видит два ядра:

    d8 v ssh cloud@linux-vm --command "nproc"
    

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

    2
    

По умолчанию перезапуск подтверждаете вы. Чтобы DP применял изменения сам, задайте в параметре .spec.disruptions.restartApprovalMode значение Automatic:

spec:
  disruptions:
    restartApprovalMode: Automatic
  1. Перейдите на вкладку «Проекты» и выберите нужный проект.
  2. Перейдите в раздел «Виртуализация» → «Виртуальные машины».
  3. Из списка выберите нужную ВМ и нажмите на её имя.
  4. Внесите изменения на вкладке «Конфигурация». Если машину требуется перезапустить, DP покажет предупреждение и список ожидающих изменений.
  5. Чтобы изменения применялись без вашего подтверждения, прокрутите страницу до раздела «Жизненный цикл», включите переключатель «Автоприменение изменений» и нажмите кнопку «Сохранить».

Изменение числа ядер без перезапуска

Число ядер работающей машины можно менять, не перезагружая её, если изменение применимо через живую миграцию. В пределах текущей топологии 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}}}'
  1. Перейдите на вкладку «Проекты» и выберите нужный проект.
  2. Перейдите в раздел «Виртуализация» → «Виртуальные машины».
  3. Из списка выберите нужную ВМ и нажмите на её имя.
  4. На вкладке «Конфигурация» в разделе «Ресурсы» задайте новое значение в поле «Ядра ЦП».
  5. Нажмите появившуюся кнопку «Сохранить».

Гостевая ОС не всегда вводит новые ядра в работу сама, особенно после живой миграции. В 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"}}}'
  1. Перейдите на вкладку «Проекты» и выберите нужный проект.
  2. Перейдите в раздел «Виртуализация» → «Виртуальные машины».
  3. Из списка выберите нужную ВМ и нажмите на её имя.
  4. На вкладке «Конфигурация» в разделе «Ресурсы» задайте новое значение в поле «Объём памяти».
  5. Нажмите появившуюся кнопку «Сохранить».

Как и с ядрами, гостевая ОС может не ввести новые блоки памяти в работу сама. В 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

Дополнительные ресурсы