Стадия жизненного цикла модуля: Предварительная версия (preview)

У модуля есть требования для установки

Администратор управляет тем, что могут развёртывать пользователи, с помощью объектов RabbitClass. RabbitClass — объект уровня кластера: каждый объект Rabbit ссылается на класс, и модуль проверяет объект по правилам класса перед развёртыванием RabbitMQ или применением изменений.

Класс по умолчанию

При включении модуль создаёт RabbitClass с именем default. Объект Rabbit использует этот класс, если в нём не задан параметр spec.rabbitClassName.

Класс default имеет следующие настройки:

Параметр Значение
sizingPolicies Одна политика: 1–16 ядер, 256Mi–16Gi памяти с шагом 1Mi, coreFractions 25%, 50%, 75%, 100%
overridableConfiguration maxMessageSize
configuration channelMax: 9, sessionMaxPerConnection: 9, linkMaxPerSession: 9

Класс нельзя изменить. Если его удалить, модуль создаст его снова с теми же настройками при следующем запуске или обновлении. Чтобы задать другие правила, создайте собственный класс.

Создание класса

Следующий манифест описывает класс с двумя политиками размеров, правилом валидации и размещением подов на выделенных узлах:

apiVersion: managed-services.deckhouse.io/v1alpha1
kind: RabbitClass
metadata:
  name: production
spec:
  sizingPolicies:
    - cores:
        min: 1
        max: 3
      memory:
        min: 512Mi
        max: 4Gi
        step: 256Mi
      coreFractions:
        - "25%"
        - "50%"
        - "100%"
    - cores:
        min: 4
        max: 16
      memory:
        min: 4Gi
        max: 16Gi
        step: 1Gi
      coreFractions:
        - "50%"
        - "100%"
  validations:
    - message: "At least 1Gi of memory is required"
      rule: "instance.memory.size >= 1073741824"
  overridableConfiguration:
    - maxMessageSize
  configuration:
    channelMax: 128
    sessionMaxPerConnection: 64
    linkMaxPerSession: 256
  nodeSelector:
    node.deckhouse.io/group: rabbit
  tolerations:
    - key: dedicated
      operator: Equal
      value: rabbit
      effect: NoSchedule

Параметры описаны в следующих разделах и в справочнике RabbitClass.

Политики размеров

Политики размеров в параметре sizingPolicies задают допустимые CPU и память экземпляров. Модуль проверяет объект Rabbit по политике следующим образом:

  1. Модуль выбирает первую в списке политику, диапазон cores которой содержит запрошенное количество ядер. Границы диапазона включаются.
  2. Запрошенный объём памяти должен попадать в диапазон memory выбранной политики и быть кратным её step.
  3. Запрошенное значение coreFraction должно совпадать с одним из значений coreFractions выбранной политики.

Если диапазоны нескольких политик пересекаются, используется политика, которая идёт в списке раньше. Объект Rabbit, количество ядер которого не попадает ни в один диапазон, отклоняется.

Правила валидации

Правила валидации в параметре validations — это выражения CEL. Объект Rabbit отклоняется, если правило возвращает false; пользователь видит сообщение message этого правила.

В правилах доступны следующие переменные:

Переменная Тип Значение
instance.memory.size int Объём памяти из spec.instance.memory.size в байтах
instance.cpu.cores int Количество ядер из spec.instance.cpu.cores

Например, следующее правило разрешает не больше 4 ядер:

spec:
  validations:
    - message: "No more than 4 cores are allowed"
      rule: "instance.cpu.cores <= 4"

Настройки, доступные пользователям

Параметр overridableConfiguration содержит список настроек RabbitMQ, которые пользователи могут задавать в секции spec.configuration объекта Rabbit. Единственное доступное значение — maxMessageSize.

Объект Rabbit, в котором задана настройка, отсутствующая в overridableConfiguration, отклоняется.

Настройки RabbitMQ в классе

Параметр configuration задаёт настройки RabbitMQ для всех экземпляров класса. Модуль записывает их в конфигурацию RabbitMQ следующим образом:

Параметр класса Настройка RabbitMQ
channelMax channel_max
sessionMaxPerConnection session_max_per_connection
linkMaxPerSession link_max_per_session

Если параметр не задан, действует значение RabbitMQ по умолчанию.

Кроме того, модуль задаёт для каждого экземпляра следующие настройки RabbitMQ на основе значения spec.instance.memory.size, потому что RabbitMQ в контейнере не может определить лимит памяти пода:

  • total_memory_available_override_value — равно объёму памяти;
  • vm_memory_high_watermark.absolute — 60% от объёма памяти. При достижении этого порога RabbitMQ блокирует публикацию сообщений.

Размещение подов

Параметры nodeSelector, nodeAffinity и tolerations копируются в поды RabbitMQ этого класса. Они подчиняются тем же правилам, что и поля спецификации пода Kubernetes.

Например, следующий класс размещает поды на узлах NodeGroup rabbit с помощью node affinity:

spec:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
        - matchExpressions:
            - key: node.deckhouse.io/group
              operator: In
              values:
                - rabbit

Если ни один узел не удовлетворяет этим правилам, объекты Rabbit этого класса получают condition ScaledToLastValidConfiguration с причиной ScaleError.

Изменение класса

RabbitClass нельзя изменить после создания. Попытка изменения завершается ошибкой RabbitClass is immutable. Create new one if you need to change configuration.

Чтобы изменить правила для существующих экземпляров, выполните следующие шаги:

  1. Создайте класс с новыми правилами.
  2. В каждом объекте Rabbit укажите имя нового класса в параметре spec.rabbitClassName. Модуль проверит объект по правилам нового класса и применит настройки класса.
  3. Удалите старый класс, когда на него не будет ссылаться ни один объект Rabbit.

Модуль не запрещает удалять класс, на который ссылаются объекты Rabbit. Такие экземпляры продолжают работать, но модуль не применяет к ним изменения, пока снова не появится класс с тем же именем.

Управление доступом

Модуль добавляет права для уровней доступа модуля user-authz:

Уровень доступа Права
User Просмотр объектов Rabbit
Editor и выше Создание, изменение и удаление объектов Rabbit и RabbitClass

Компоненты модуля

Компоненты модуля работают в неймспейсе d8-managed-rabbit:

  • Deployment managed-rabbit-operator развёртывает RabbitMQ и обновляет статус объектов Rabbit;
  • Deployment managed-rabbit-webhook проверяет объекты Rabbit по правилам их классов при создании и изменении.

Чтобы посмотреть логи оператора, выполните команду:

d8 k -n d8-managed-rabbit logs deploy/managed-rabbit-operator