Класс виртуальной машины (ВМ) задаёт, какой процессор и какой набор инструкций увидит гостевая система.

Виртуальный процессор

Блок .spec.cpu определяет, какой процессор увидит гостевая ОС. От него зависит и то, между какими узлами ВМ сможет мигрировать.

Блок .spec.cpu после создания ресурса изменить нельзя. Чтобы задать другой процессор, создайте новый класс.

Ниже приведены примеры для каждого типа процессора.

  • Набор процессорных инструкций, обязательных для ВМ. Задаётся типом Features:

    spec:
      cpu:
        features:
          - vmx
        type: Features
    

    Как настроить vCPU в веб-интерфейсе в форме создания классов ВМ:

    1. В блоке «Настройки ЦП» в поле «Тип» выберите Features.
    2. В поле «Обязательный набор поддерживаемых инструкций» выберите нужные инструкции.
    3. Нажмите кнопку «Создать».
  • Универсальный процессор для заданного набора узлов. Задаётся типом Discovery:

    spec:
      cpu:
        discovery:
          nodeSelector:
            matchExpressions:
              - key: node-role.kubernetes.io/control-plane
                operator: DoesNotExist
        type: Discovery
    

    Как выполнить операцию в веб-интерфейсе в форме создания классов ВМ:

    1. В блоке «Настройки ЦП» в поле «Тип» выберите Discovery.
    2. Нажмите кнопку «Добавить» в блоке «Условия для создания универсального процессора» → «Лейблы и выражения».
    3. Задайте «Ключ», «Оператор» и «Значение», они соответствуют параметру .spec.cpu.discovery.nodeSelector.
    4. Нажмите клавишу «Enter», чтобы подтвердить параметры ключа.
    5. Нажмите кнопку «Создать».
  • Процессор, близкий к процессору узла. Задаётся типом Host. Гостевая ОС получает почти полный набор инструкций узла, поэтому производительность выше, чем у фиксированной модели. ВМ такого класса мигрирует только между узлами со схожими процессорами. Например, между узлами с процессорами Intel и AMD миграция невозможна, как и между процессорами разных поколений, если их наборы инструкций различаются.

    spec:
      cpu:
        type: Host
    

    Как выполнить операцию в веб-интерфейсе в форме создания классов ВМ:

    1. В блоке «Настройки ЦП» в поле «Тип» выберите Host.
    2. Нажмите кнопку «Создать».
  • Процессор узла без изменений. Задаётся типом HostPassthrough. ВМ такого класса мигрирует только на узел, процессор которого в точности совпадает с процессором исходного узла.

    spec:
      cpu:
        type: HostPassthrough
    

    Как выполнить операцию в веб-интерфейсе в форме создания классов ВМ:

    1. В блоке «Настройки ЦП» в поле «Тип» выберите HostPassthrough.
    2. Нажмите кнопку «Создать».
  • Конкретная модель процессора с заранее известным набором инструкций. Задаётся типом Model. Сначала посмотрите, какие модели поддерживает нужный узел:

    d8 k get nodes <NODE_NAME> -o json | jq '.metadata.labels | to_entries[] | select(.key | test("cpu-model.node.virtualization.deckhouse.io")) | .key | split("/")[1]' -r
    

    Здесь <NODE_NAME> — имя узла кластера.

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

    Broadwell-noTSX
    Broadwell-noTSX-IBRS
    Haswell-noTSX
    Haswell-noTSX-IBRS
    IvyBridge
    IvyBridge-IBRS
    Nehalem
    Nehalem-IBRS
    Penryn
    SandyBridge
    SandyBridge-IBRS
    Skylake-Client-noTSX-IBRS
    Westmere
    Westmere-IBRS
    

    Затем укажите выбранную модель в спецификации класса:

    spec:
      cpu:
        model: IvyBridge
        type: Model
    

    Как выполнить операцию в веб-интерфейсе в форме создания классов ВМ:

    1. В блоке «Настройки ЦП» в поле «Тип» выберите Model.
    2. В поле «Модель» выберите модель процессора.
    3. Нажмите кнопку «Создать».

Пример конфигурации vCPU Discovery

Ниже показано, как подобрать типы процессора в кластере с разнородными узлами.

Пример конфигурации VirtualMachineClass

Ниже разобран кластер из четырёх узлов. Два узла с лейблом group=blue оснащены процессором «CPU X» с тремя наборами инструкций, два других с лейблом group=green — более новым процессором «CPU Y» с четырьмя наборами.

Набор инструкций процессора — это все команды, которые он умеет выполнять, от сложения до работы с памятью. От набора зависит, какие программы запустятся и насколько быстро, а у разных поколений процессоров наборы различаются.

Такому кластеру подойдут три класса:

  • universal — ВМ запускаются на любом узле и мигрируют между всеми четырьмя. Deckhouse Platform (DP) возьмёт набор инструкций, общий для обоих процессоров, поэтому совместимость максимальная, а часть возможностей «CPU Y» останется неиспользованной;
  • cpuX — ВМ запускаются только на узлах с «CPU X» и мигрируют между ними, используя все инструкции этого процессора;
  • cpuY — то же самое для узлов с «CPU Y».

Классы для такого кластера выглядят так:

---
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualMachineClass
metadata:
  name: universal
spec:
  cpu:
    # Пустой discovery означает, что учитываются все узлы кластера.
    discovery: {}
    type: Discovery
---
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualMachineClass
metadata:
  name: cpuX
spec:
  cpu:
    discovery:
      nodeSelector:
        matchExpressions:
          - key: group
            operator: In
            values: ["blue"]
    type: Discovery
---
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualMachineClass
metadata:
  name: cpuY
spec:
  cpu:
    discovery:
      nodeSelector:
        matchExpressions:
          - key: group
            operator: In
            values: ["green"]
    type: Discovery

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