Класс виртуальной машины (ВМ) задаёт то, что владелец проекта не настраивает сам, а именно модель виртуального процессора, допустимые сочетания ядер и памяти, а также узлы, на которых ВМ может работать. Описывает эти правила ресурс VirtualMachineClass, и через него вы управляете тем, как рабочие нагрузки проектов распределяются по узлам кластера.
При первичной установке модуль создаёт класс generic с моделью процессора Nehalem. Эта модель старая, но поддерживается любым современным процессором, поэтому ВМ такого класса запускаются на любом узле кластера и мигрируют между узлами без ограничений.
Класс generic соответствует процессору с наименьшим набором инструкций, поэтому для рабочих нагрузок в production он не подходит.
Когда все узлы добавлены в кластер и настроены, создайте хотя бы один класс с типом процессора Discovery. Deckhouse Platform (DP) подберёт для него набор инструкций, доступный на всех узлах сразу, и виртуальные машины смогут использовать возможности процессоров полнее, сохранив способность мигрировать между узлами. Набор инструкций фиксируется в момент создания ресурса и не меняется, когда узлы добавляются или удаляются.
Как настроить такой класс, показано в разделе «Пример конфигурации vCPU Discovery».
Классы существуют на уровне кластера. Чтобы вывести их список, выполните команду:
d8 k get virtualmachineclass
Пример вывода:
NAME PHASE ISDEFAULT AGE
generic Ready 6d1h
Изменить у любого класса можно всё, кроме блока .spec.cpu, потому что модель процессора фиксируется при создании ресурса. Класс generic разрешено и менять, и удалять, но заново он не создастся, потому что модуль добавляет его только при первичной установке.
Владелец проекта указывает класс в параметре .spec.virtualMachineClassName виртуальной машины:
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualMachine
metadata:
name: linux-vm
spec:
virtualMachineClassName: generic # Название ресурса VirtualMachineClass.
# ...
VirtualMachineClass по умолчанию
Один из классов можно назначить классом по умолчанию. DP подставит его имя в параметр .spec.virtualMachineClassName, если владелец проекта не указал класс сам.
Класс по умолчанию помечается аннотацией virtualmachineclass.virtualization.deckhouse.io/is-default-class со значением true. Такой класс в кластере может быть только один, поэтому, чтобы назначить новый, сначала снимите аннотацию с текущего.
Не ставьте аннотацию на класс generic, потому что при обновлении модуля она может пропасть. Создайте собственный класс и назначьте по умолчанию его.
-
Посмотрите, какие классы есть в кластере:
d8 k get vmclassПример вывода, в котором класса по умолчанию нет:
NAME PHASE ISDEFAULT AGE generic Ready 1d host-passthrough-custom Ready 1d -
Назначьте класс по умолчанию:
d8 k annotate vmclass host-passthrough-custom virtualmachineclass.virtualization.deckhouse.io/is-default-class=true -
Убедитесь, что аннотация проставлена:
d8 k get vmclassПример вывода:
NAME PHASE ISDEFAULT AGE generic Ready 1d host-passthrough-custom Ready true 1d
Теперь виртуальные машины, созданные без указания класса, получат класс host-passthrough-custom.
Настройки VirtualMachineClass
Класс состоит из трёх блоков, каждый из которых отвечает за свою группу настроек:
- В командной строке
- В веб-интерфейсе
Опишите класс в ресурсе VirtualMachineClass:
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualMachineClass
metadata:
name: <VMCLASS_NAME>
# Аннотация назначает класс классом по умолчанию, её можно не указывать.
# annotations:
# virtualmachineclass.virtualization.deckhouse.io/is-default-class: "true"
spec:
# Параметры виртуального процессора. Блок обязателен и после создания ресурса не меняется.
cpu: ...
# Правила размещения виртуальных машин по узлам. Блок необязателен.
# Изменения применяются ко всем машинам этого класса.
nodeSelector: ...
# Политика подбора ресурсов для виртуальных машин. Блок необязателен.
# Изменения применяются ко всем машинам этого класса.
sizingPolicies: ...
Здесь <VMCLASS_NAME> — имя создаваемого класса.
- Перейдите на вкладку «Система», далее в раздел «Виртуализация» → «Классы ВМ».
- Нажмите кнопку «Создать».
- В открывшейся форме в поле «Имя» введите имя класса ВМ.
Дальше блоки разобраны по отдельности.