Стадия жизненного цикла модуля: Предварительная версия (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 по политике следующим образом:
- Модуль выбирает первую в списке политику, диапазон
coresкоторой содержит запрошенное количество ядер. Границы диапазона включаются. - Запрошенный объём памяти должен попадать в диапазон
memoryвыбранной политики и быть кратным еёstep. - Запрошенное значение
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.
Чтобы изменить правила для существующих экземпляров, выполните следующие шаги:
- Создайте класс с новыми правилами.
- В каждом объекте Rabbit укажите имя нового класса в параметре
spec.rabbitClassName. Модуль проверит объект по правилам нового класса и применит настройки класса. - Удалите старый класс, когда на него не будет ссылаться ни один объект 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