Для создания виртуальной машины (ВМ) используется ресурс VirtualMachine. Его параметры позволяют сконфигурировать:

  • класс виртуальной машины;
  • ресурсы, требуемые для работы виртуальной машины (процессор, память, диски и образы);
  • правила размещения виртуальной машины на узлах кластера;
  • настройки загрузчика и оптимальные параметры для гостевой ОС;
  • политику запуска виртуальной машины и политику применения изменений;
  • сценарии начальной конфигурации (cloud-init);
  • перечень блочных устройств.

С полным описанием параметров конфигурации виртуальных машин можно ознакомиться по в документации конфигурации.

Создание виртуальной машины

Ниже показано, как запустить виртуальную машину с Ubuntu 24.04 на диске, созданном ранее. Сценарий cloud-init устанавливает агента qemu-guest-agent и сервис nginx, а также создаёт пользователя cloud с паролем cloud.

  • В командной строке
  • В веб-интерфейсе
  1. Создайте ресурс VirtualMachine:

    d8 k apply -f - <<"EOF"
    apiVersion: virtualization.deckhouse.io/v1alpha2
    kind: VirtualMachine
    metadata:
      name: linux-vm
    spec:
      # Название класса ВМ.
      virtualMachineClassName: generic
      # Тип ОС, Generic для Linux и Windows для Windows. По умолчанию Generic.
      # osType: Generic
      # Тип загрузчика: BIOS, EFI или EFIWithSecureBoot. По умолчанию BIOS.
      # bootloader: BIOS
      # Сценарий первичной инициализации ВМ.
      provisioning:
        type: UserData
        userData: |
          #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
          ssh_pwauth: True
          users:
            - name: cloud
              passwd: <PASSWORD_HASH>
              shell: /bin/bash
              sudo: ALL=(ALL) NOPASSWD:ALL
              lock_passwd: False
          final_message: "The system is finally up, after $UPTIME seconds"
      # Настройки ресурсов ВМ.
      cpu:
        # Количество ядер процессора.
        cores: 1
        # Гарантированная доля процессорного времени одного ядра.
        coreFraction: 10%
      memory:
        # Объём оперативной памяти.
        size: 1Gi
      # Список дисков и образов, подключаемых к ВМ.
      blockDeviceRefs:
        # Порядок в этом блоке определяет приоритет загрузки.
        - kind: VirtualDisk
          name: linux-vm-root
    EOF
    

    Здесь <PASSWORD_HASH> — хеш пароля пользователя cloud в кавычках, полученный командой mkpasswd --method=SHA-512 --rounds=4096.

  2. Проверьте, что машина запустилась:

    d8 k get vm linux-vm
    

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

    NAME       PHASE     UPTIME   NODE           IPADDRESS     AGE
    linux-vm   Running   11m      virtlab-pt-2   10.66.10.12   11m
    

    IP-адрес машина получает автоматически из диапазона, заданного администратором в настройках модуля.

  1. Перейдите на вкладку «Проекты» и выберите нужный проект.
  2. Перейдите в раздел «Виртуализация» → «Виртуальные машины».
  3. Нажмите кнопку «Создать».
  4. В открывшейся форме в поле «Имя» введите linux-vm.
  5. В разделе «Ресурсы» задайте 1 в поле «Ядра ЦП», 10% в поле «Доля ядра» и 1Gi в поле «Объём памяти».
  6. В разделе «Диски» нажмите кнопку «Добавить».
  7. В открывшемся окне «Диски / Образы» выберите «Существующий» и укажите в списке диск linux-vm-root.
  8. Прокрутите страницу вниз до переключателя «Cloud-init» и включите его.
  9. В появившееся поле вставьте сценарий, подставив вместо <PASSWORD_HASH> хеш пароля в кавычках:

    #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
    ssh_pwauth: True
    users:
      - name: cloud
        passwd: <PASSWORD_HASH>
        shell: /bin/bash
        sudo: ALL=(ALL) NOPASSWD:ALL
        lock_passwd: False
    final_message: "The system is finally up, after $UPTIME seconds"
    
  10. Нажмите кнопку «Создать».
  11. Проверьте статус ВМ на её странице.

Жизненный цикл ВМ

От создания до удаления виртуальная машина проходит через несколько фаз. Текущую показывает поле .status.phase, а подробности о том, что с машиной происходит, содержит блок .status.conditions.

Схема смены фаз виртуальной машины

Условия в блоке .status.conditions отвечают на вопрос, почему машина находится в текущей фазе. Посмотреть те из них, где есть сообщение, можно так:

d8 k get vm <VM_NAME> -o json | jq '.status.conditions[] | select(.message != "")'

Здесь <VM_NAME> — имя виртуальной машины.

Диагностика по фазам

Пока ВМ находится в фазе Pending, она ждёт готовности зависимых ресурсов, то есть дисков, образов, класса ВМ, секрета со сценарием начальной конфигурации. Задержка на этой фазе означает, что какой-то из ресурсов не готов либо исчерпаны квоты неймспейса или проекта. Что именно блокирует запуск, показывают условия, оканчивающиеся на Ready:

d8 k get vm <VM_NAME> -o json | jq '.status.conditions[] | select(.type | test(".*Ready"))'

В фазе Starting зависимые ресурсы готовы, и Deckhouse Platform (DP) запускает ВМ на одном из узлов. Если запуск затягивается, подходящего узла нет либо на подходящих узлах не хватает процессора или памяти. Причину сообщает условие Running:

d8 k get vm <VM_NAME> -o json | jq '.status.conditions[] | select(.type=="Running")'

В фазе Migrating машина переезжает на другой узел живой миграцией. Миграция не начнётся или прервётся, если наборы процессорных инструкций на узлах несовместимы, версии ядра различаются, ни один узел не подходит под правила размещения или на подходящих узлах не хватает ресурсов. Ход миграции показывает условие Migrating вместе с блоком .status.migrationState:

d8 k get vm <VM_NAME> -o json | jq '.status | {condition: .conditions[] | select(.type=="Migrating"), migrationState}'

Фаза Terminating необратима, все связанные с ВМ ресурсы освобождаются, но сами ресурсы не удаляются.

Условия запущенной ВМ

У работающей машины стоит следить за несколькими условиями:

  • AgentReady со статусом True означает, что в гостевой системе работает qemu-guest-agent, и тогда блок .status.guestOSInfo содержит сведения о гостевой ОС.
  • FirmwareUpToDate со статусом False означает, что прошивку ВМ пора обновить.
  • ConfigurationApplied со статусом False означает, что заданная конфигурация к запущенной машине ещё не применена.
  • AwaitingRestartToApplyConfiguration со статусом True означает, что часть изменений применится только после перезагрузки, и выполнить её нужно вручную.
  • SizingPolicyMatched со статусом False означает, что ресурсы машины не отвечают политике сайзинга её класса. Пока вы не приведёте параметры в соответствие политике, сохранить изменения конфигурации не получится.
  • Migratable показывает, можно ли перенести машину живой миграцией. Условие вычисляется только для запущенной ВМ, у выключенной оно отсутствует. Статус False с причиной VirtualMachineNoMigrationTarget означает, что сама машина к миграции пригодна, но подходящего узла в кластере нет. Статус True с причиной VirtualMachineWaitingForMigrationTarget означает, что подходящие узлы есть, но сейчас ни один не может принять машину, и такое состояние проходит само.

Вытеснение с узла

Условие EvictionRequired появляется, когда узел с вашей ВМ переводят в режим обслуживания. Если узел только вывели из планирования командой d8 k cordon, но обслуживание не начали, условие не появляется.

Сообщение условия говорит, что произойдёт с машиной, а именно перенос живой миграцией без остановки гостевой ОС, перезапуск силами DP с разрешения администратора кластера либо ожидание, пока машину не перезапустят. Машину, которую можно перенести живой миграцией, ради освобождения узла не перезапускают. Пока вытеснение не началось, условие носит предупреждающий характер, потому что обслуживание могут отменить.

После перезапуска машина запускается на другом подходящем узле. Если такого узла нет, она остаётся в фазе Pending, а причину от планировщика показывает условие Running. Узел в режиме обслуживания новые машины не принимает, поэтому ВМ, закреплённая за ним правилами размещения или использующая проброшенное с него устройство, запустится только после возвращения узла в работу.

Просмотр состояния в веб-интерфейсе

Веб-интерфейс показывает фазу машины, её ресурсы и текущие проблемы на странице самой машины.

  1. Перейдите на вкладку «Проекты» и выберите нужный проект.
  2. Перейдите в раздел «Виртуализация» → «Виртуальные машины».
  3. Из списка выберите нужную ВМ и нажмите на её имя.

В шапке страницы показаны текущая фаза ВМ, её IP-адрес, класс, конфигурация ресурсов, количество подключённых дисков и образов, узел размещения, признак работы агента гостевой ОС и время с момента запуска. Сама страница разделена на вкладки «Конфигурация», «Мониторинг», «Операции», «События», «VNC», «TTY», «Сетевые политики», «Снимки», «Диагностика», «Мета» и «YAML».

На вкладке «Конфигурация» у запущенной ВМ рядом с полями «Ядра ЦП» и «Объём памяти» отображаются графики использования. В блоке «Диски» для каждого устройства показаны порядковый номер загрузки, имя, размер, статус, способ подключения, класс хранения и текущая нагрузка на диск. В блоке «Сети» показаны имя сети, её статус, IP- и MAC-адреса, а основная сеть кластера обозначена как «Main».

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