Блок .spec.sizingPolicies задаёт, какие сочетания ядер, доли ядра и памяти разрешены виртуальным машинам (ВМ) этого класса.

Изменения в блоке .spec.sizingPolicies затрагивают уже существующие виртуальные машины. У виртуальных машин, которые перестали соответствовать новым требованиям, условие SizingPolicyMatched в блоке .status.conditions принимает статус False.

Задавая политики, учитывайте топологию CPU виртуальных машин.

Политика состоит из списка правил, каждое из которых действует на свой диапазон ядер. Диапазон задаётся обязательным блоком cores, и диапазоны разных правил пересекаться не могут, иначе Deckhouse Platform (DP) отклонит такой класс.

Правильная структура, где диапазоны идут друг за другом без пересечений:

- cores:
    min: 1
    max: 4
  # ...
- cores:
    min: 5 # Начало следующего диапазона на единицу больше предыдущего max.
    max: 8

Недопустимая структура, где значение 4 попадает сразу в два диапазона:

- cores:
    min: 1
    max: 4
  # ...
- cores:
    min: 4
    max: 8

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

Внутри диапазона задаются требования к памяти и к доле ядра:

  • memory — минимум и максимум памяти. Указывается либо на весь диапазон, либо на одно ядро через вложенный блок memory.perCore.
  • coreFractions — список разрешённых долей ядра, например [25, 50, 100] для 25%, 50% и 100%. Если владелец проекта задал параметр coreFraction виртуальной машины явно, значение должно быть из этого списка.
  • defaultCoreFraction — доля ядра, которую получит виртуальная машина, если coreFraction в ней не задан. Значение должно входить в список coreFractions. Когда параметр не указан, применяется 100%.

Правило, в котором нет ни memory, ни coreFractions, ничего не ограничивает, поэтому задавайте хотя бы одно из них.

В коммерческих редакциях DP параметру defaultCoreFraction можно задать значение Auto. Тогда долю ядра для ВМ без явного coreFraction подбирает вертикальное автомасштабирование. Auto — это режим, а не доля ядра, поэтому в списке coreFractions его быть не должно.

spec:
  sizingPolicies:
    - cores:
        min: 1
        max: 8
      coreFractions: [10, 25, 50, 100]
      defaultCoreFraction: Auto

Значение Auto принимается, только когда доступны обе возможности:

  • вертикальное автомасштабирование виртуальных машин, которое включается само в коммерческих редакциях DP при включённом модуле vertical-pod-autoscaler;
  • изменение числа ядер и объёма памяти без перезапуска, которое включается функцией HotplugCPUAndMemoryWithInPlaceResize в параметре .spec.settings.featureGates модуля.

Если хотя бы одна из них недоступна, DP отклонит создание такого класса.

Новое значение по умолчанию применяется только к виртуальным машинам, созданным после его изменения. У существующей машины прежнее значение уже записано в её спецификации и остаётся там, пока владелец проекта не задаст другое.

Примеры зависимости объёма памяти от числа ядер:

  • Параметр memory задаёт границы, одинаковые для всего диапазона ядер:

    - cores:
        min: 1
        max: 4
      memory:
        min: 2Gi
        max: 8Gi
    

    Виртуальная машина с любым числом ядер от 1 до 4 получает от 2 до 8 ГиБ памяти, и число ядер на эти границы не влияет.

  • Параметр memory.perCore задаёт границы в расчёте на одно ядро, а итоговые границы получаются умножением на число ядер:

    - cores:
        min: 1
        max: 4
      memory:
        perCore:
          min: 1Gi
          max: 2Gi
    

    Для такой политики допустимый объём памяти растёт вместе с числом ядер:

    • 1 ядро — от 1 до 2 ГиБ;
    • 2 ядра — от 2 до 4 ГиБ;
    • 3 ядра — от 3 до 6 ГиБ;
    • 4 ядра — от 4 до 8 ГиБ.
  • Параметр memory.step ограничивает набор допустимых значений памяти шагом сетки, чтобы владелец проекта не выбирал произвольные объёмы.

    Вместе с memory.min и memory.max шаг отсчитывается от минимума:

    - cores:
        min: 1
        max: 4
      memory:
        min: 2Gi
        max: 8Gi
        step: 1Gi
    

    Допустимы только значения 2, 3, 4, 5, 6, 7 и 8 ГиБ, а 2,5 или 7,5 ГиБ задать нельзя.

    Вместе с memory.perCore шаг отсчитывается от памяти на одно ядро, и уже полученное значение умножается на число ядер:

    - cores:
        min: 1
        max: 4
      memory:
        perCore:
          min: 1Gi
          max: 2Gi
        step: 512Mi
    

    На одно ядро допустимы 1, 1,5 и 2 ГиБ, поэтому итоговый объём зависит от числа ядер:

    • 1 ядро — 1, 1,5 или 2 ГиБ;
    • 2 ядра — 2, 3 или 4 ГиБ;
    • 3 ядра — 3, 4,5 или 6 ГиБ;
    • 4 ядра — 4, 6 или 8 ГиБ.

Пример политики, которая покрывает диапазоны от 1 до 248 ядер:

spec:
  sizingPolicies:
    # Для 1-4 ядер доступно от 1 до 8 ГиБ памяти с шагом 512 МиБ,
    # то есть 1 ГиБ, 1,5 ГиБ, 2 ГиБ, 2,5 ГиБ и так далее.
    # Доступны все доли ядра.
    - cores:
        min: 1
        max: 4
      memory:
        min: 1Gi
        max: 8Gi
        step: 512Mi
      coreFractions: [5, 10, 20, 50, 100]
      defaultCoreFraction: 50 # Доля ядра по умолчанию для диапазона 1-4 ядра.
    # Для 5-8 ядер доступно от 5 до 16 ГиБ памяти с шагом 1 ГиБ,
    # то есть 5 ГиБ, 6 ГиБ, 7 ГиБ и так далее.
    # Доли ядра ограничены тремя значениями.
    - cores:
        min: 5
        max: 8
      memory:
        min: 5Gi
        max: 16Gi
        step: 1Gi
      coreFractions: [20, 50, 100]
      defaultCoreFraction: 100 # Доля ядра по умолчанию для диапазона 5-8 ядер.
    # Для 9-16 ядер доступно от 9 до 32 ГиБ памяти с шагом 1 ГиБ.
    # Доли ядра ограничены двумя значениями.
    - cores:
        min: 9
        max: 16
      memory:
        min: 9Gi
        max: 32Gi
        step: 1Gi
      coreFractions: [50, 100]
    # Для 17-248 ядер доступно от 1 до 2 ГиБ памяти на каждое ядро.
    # Доля ядра только 100%.
    - cores:
        min: 17
        max: 248
      memory:
        perCore:
          min: 1Gi
          max: 2Gi
      coreFractions: [100]

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

  1. Нажмите кнопку «Добавить» в блоке «Правила выделения ресурсов для виртуальных машин».
  2. В блоке «ЦП» в поле «Мин» укажите 1, а в поле «Макс» — 4.
  3. В блоке «ЦП» в поле «Разрешить задать доли ядра» выберите по порядку значения 5%, 10%, 20%, 50%, 100%.
  4. В блоке «Память» установите переключатель в положение «Объём на 1 ядро».
  5. В блоке «Память» в поле «Мин» укажите 1, а в поле «Макс» — 8.
  6. В блоке «Память» в поле «Шаг дискретизации» укажите 1.
  7. При необходимости добавьте другие диапазоны кнопкой «Добавить».
  8. Нажмите кнопку «Создать».

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