Документация находится в разработке, может содержать неполную информацию.

Ресурс VirtualMachineClass предназначен для централизованной конфигурации предпочтительных параметров виртуальных машин. Он позволяет задавать параметры для CPU, включая инструкции и политики конфигурации ресурсов, а также определять соотношение между ресурсами CPU и памяти. Кроме того, VirtualMachineClass обеспечивает управление размещением виртуальных машин по узлам платформы, что помогает администраторам эффективно распределять ресурсы и оптимально размещать виртуальные машины.

Платформа виртуализации предоставляет 3 предустановленных ресурса VirtualMachineClass:

kubectl get virtualmachineclass
NAME               PHASE   AGE
host               Ready   6d1h
host-passthrough   Ready   6d1h
generic            Ready   6d1h
  • host — этот класс использует виртуальный CPU, максимально соответствующий набору инструкций CPU узла платформы, что обеспечивает высокую производительность и функциональность. Он также гарантирует совместимость с живой миграцией для узлов с похожими типами процессоров. Например, миграция виртуальной машины между узлами с процессорами Intel и AMD невозможна. Это также относится к процессорам разных поколений, так как их наборы инструкций могут отличаться.
  • host-passthrough — в этом классе используется физический CPU узла платформы без изменений. Виртуальная машина, использующая этот класс, может быть мигрирована только на узел, у которого CPU точно совпадает с CPU исходного узла.
  • generic — универсальный класс CPU, использующий модель Nehalem, которая является достаточно старой, но поддерживаемой большинством современных процессоров. Это позволяет запускать виртуальные машины на любых узлах кластера с возможностью живой миграции..

VirtualMachineClass является обязательным параметром в конфигурации виртуальной машины. Пример того, как указать класс виртуальной машины в спецификации:

apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualMachine
metadata:
  name: linux-vm
spec:
  virtualMachineClassName: generic # название ресурса VirtualMachineClass
  ...

Рекомендуется создать как минимум один ресурс VirtualMachineClass в кластере с типом Discovery сразу после того как все узлы будут настроены и добавлены в кластер. Это позволит использовать в виртуальных машинах универсальный процессор с максимально возможными характеристиками с учетом ЦП на узлах кластера, обеспечив виртуальным машинам использование максимума возможностей ЦП и, при необходимости, беспрепятственно осуществлять миграцию между узлами кластера. Примеры и описания классов с типом Discovery приведены ниже.

Администраторы платформы могут создавать классы виртуальных машин, соответствующие их потребностям, однако рекомендуется минимизировать их количество для упрощения управления. Далее рассмотрим пример настройки.

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

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

Предположим, у нас есть кластер из четырех узлов. Два из этих узлов с меткой group=blue оснащены процессором CPU X, который поддерживает три набора инструкций. Остальные два узла с меткой group=green имеют более новый процессор CPU Y, поддерживающий четыре набора инструкций. В этом случае администратор может настроить классы виртуальных машин, чтобы гарантировать совместимость с различными типами процессоров в кластере.

Для оптимального использования ресурсов данного кластера, рекомендуется создать три дополнительных класса виртуальных машин (VirtualMachineClass):

  • universal: Этот класс позволит виртуальным машинам запускаться на всех узлах платформы и мигрировать между ними. При этом будет использоваться набор инструкций для самой младшей модели CPU, что обеспечит наибольшую совместимость.
  • cpuX: Этот класс будет предназначен для виртуальных машин, которые должны запускаться только на узлах с процессором “CPU X”. ВМ смогут мигрировать между этими узлами, используя доступные наборы инструкций “CPU X”.
  • cpuY: Этот класс предназначен для виртуальных машин, которые должны запускаться только на узлах с процессором “CPU Y”. ВМ смогут мигрировать между этими узлами, используя доступные наборы инструкций “CPU Y”.

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

Примерные конфигурации ресурсов для данного кластера:

---
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualMachineClass
metadata:
  name: universal
spec:
  cpu:
    discovery: {}
    type: Discovery
  sizingPolicies: { ... }
---
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualMachineClass
metadata:
  name: cpuX
spec:
  cpu:
    discovery: {}
    type: Discovery
  nodeSelector:
    matchExpressions:
      - key: group
        operator: In
        values: ["blue"]
  sizingPolicies: { ... }
---
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualMachineClass
metadata:
  name: cpuY
spec:
  cpu:
    discovery:
      nodeSelector:
        matchExpressions:
          - key: group
            operator: In
            values: ["green"]
    type: Discovery
  sizingPolicies: { ... }

Прочие варианты конфигурации

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

apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualMachineClass
metadata:
  name: discovery
spec:
  cpu:
    # сконфигурировать универсальный vCPU для заданного набора узлов
    discovery:
      nodeSelector:
        matchExpressions:
          - key: node-role.kubernetes.io/control-plane
            operator: DoesNotExist
    type: Discovery
  # разрешать запуск ВМ с данным классом только на узлах группы worker
  nodeSelector:
    matchExpressions:
      - key: node.deckhouse.io/group
        operator: In
        values:
          - worker
  # политика конфигурации ресурсов
  sizingPolicies:
    # для диапазона от 1 до 4 ядер возможно использовать от 1 до 8 Гб оперативной памяти с шагом 512Mi
    # т.е 1Гб, 1,5Гб, 2Гб, 2,5Гб итд
    # запрещено использовать выделенные ядра
    # и доступны все варианты параметра corefraction
    - cores:
        min: 1
        max: 4
      memory:
        min: 1Gi
        max: 8Gi
        step: 512Mi
      dedicatedCores: [false]
      coreFractions: [5, 10, 20, 50, 100]
    # для диапазона от 5 до 8 ядер возможно использовать от 5 до 16 Гб оперативной памяти с шагом 1Гб
    # т.е. 5Гб, 6Гб, 7Гб, итд
    # запрещено использовать выделенные ядра
    # и доступны некоторые варианты параметра corefraction
    - cores:
        min: 5
        max: 8
      memory:
        min: 5Gi
        max: 16Gi
        step: 1Gi
      dedicatedCores: [false]
      coreFractions: [20, 50, 100]
    # для диапазона от 9 до 16 ядер возможно использовать от 9 до 32 Гб оперативной памяти с шагом 1Гб
    # можно использовать выделенные ядра (а можно и не использовать)
    # и доступны некоторые варианты параметра corefraction
    - cores:
        min: 9
        max: 16
      memory:
        min: 9Gi
        max: 32Gi
        step: 1Gi
      dedicatedCores: [true, false]
      coreFractions: [50, 100]
    # для диапазона от 17 до 1024 ядер возможно использовать от 1 до 2 Гб оперативной памяти из расчета на одно ядро
    # доступны для использования только выделенные ядра
    # и единственный параметр corefraction = 100%
    - cores:
        min: 17
        max: 1024
      memory:
        perCore:
          min: 1Gi
          max: 2Gi
      dedicatedCores: [true]
      coreFractions: [100]

Далее приведены фрагменты конфигураций VirtualMachineClass для решения различных задач:

  • класс с vCPU с требуемым набором процессорных инструкций, для этого используем type: Features, чтобы задать необходимый набор поддерживаемых инструкций для процессора:

    spec:
      cpu:
        features:
          - vmx
        type: Features
    
  • класс c универсальным vCPU для заданного набора узлов, для этого используем type: Discovery:

    spec:
      cpu:
        discovery:
          nodeSelector:
            matchExpressions:
              - key: node-role.kubernetes.io/control-plane
                operator: DoesNotExist
        type: Discovery
    
  • чтобы создать vCPU конкретного процессора с предварительно определенным набором инструкций, используем тип type: Model. Предварительно, чтобы получить перечень названий поддерживаемых CPU для узла кластера, выполните команду:

    kubectl get nodes <node-name> -o json | jq '.metadata.labels | to_entries[] | select(.key | test("cpu-model")) | .key | split("/")[1]' -r
    

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

    IvyBridge
    Nehalem
    Opteron_G1
    Penryn
    SandyBridge
    Westmere
    
  • укажите в спецификации ресурса VirtualMachineClass:

    spec:
      cpu:
        model: IvyBridge
        type: Model