Стадия жизненного цикла модуля: Предварительная версия (preview)
У модуля есть требования для установки
Экземпляр RabbitMQ описывается объектом Rabbit в вашем неймспейсе. Для каждого объекта Rabbit модуль развёртывает один сервер RabbitMQ и создаёт Service и Secret с учётными данными для подключения к нему.
Быстрый старт
Чтобы развернуть экземпляр RabbitMQ с классом default, выполните следующие шаги:
-
Создайте неймспейс для экземпляра или выберите существующий, например
rabbit. -
Сохраните следующий манифест в файл
rabbit-sample.yaml:apiVersion: managed-services.deckhouse.io/v1alpha1 kind: Rabbit metadata: name: rabbit-sample spec: rabbitClassName: default configuration: maxMessageSize: 16Mi instance: memory: size: 512Mi cpu: cores: 1 coreFraction: "50%" persistentVolumeClaim: size: 1Gi -
Примените манифест:
d8 k -n rabbit apply -f rabbit-sample.yaml -
Дождитесь готовности экземпляра:
d8 k -n rabbit wait rabbit/rabbit-sample --for=condition=LastValidConfigurationApplied --timeout=10m -
Подключите приложение к Service
d8ms-rmq-rabbit-sampleна порту5672с учётными данными из Secretd8ms-rmq-rabbit-sample-user-secret. Подробности приведены в разделе «Подключение к RabbitMQ».
Выбор класса
Класс задаёт допустимые размеры экземпляра, настройки RabbitMQ, которые можно менять, и узлы,
на которых работает RabbitMQ.
Укажите имя класса в параметре spec.rabbitClassName.
Если параметр не задан, используется класс default.
Чтобы вывести список доступных классов, выполните команду:
d8 k get rabbitclassesЧтобы посмотреть ограничения класса, выполните команду:
d8 k get rabbitclass <CLASS_NAME> -o yamlОграничения описаны в параметрах класса sizingPolicies, validations и overridableConfiguration.
Если класс не существует, модуль принимает объект Rabbit с предупреждением, но не развёртывает RabbitMQ,
пока класс не будет создан.
Настройка CPU и памяти
Ресурсы пода RabbitMQ задаются в секции spec.instance:
spec:
instance:
cpu:
cores: 2
coreFraction: "50%"
memory:
size: 2GiМодуль задаёт ресурсы пода следующим образом:
| Ресурс | Limit | Request |
|---|---|---|
| CPU | cores |
cores, умноженное на coreFraction |
| Память | memory.size |
memory.size |
Класс проверяет значения при создании и изменении объекта:
coresдолжно попадать в диапазонcoresодной из политик размеров класса. Для остальных проверок используется первая подходящая политика.memory.sizeдолжно попадать в диапазонmemoryэтой политики и быть кратным еёstep.coreFractionдолжно совпадать с одним из значенийcoreFractionsэтой политики и быть записано в той же форме, например"50%".- Значения должны удовлетворять всем правилам CEL из параметра
validationsкласса.
Модуль передаёт RabbitMQ значение memory.size как объём доступной памяти
и устанавливает порог памяти, при достижении которого RabbitMQ блокирует публикацию сообщений,
равным 60% от этого значения.
Настройка хранилища
RabbitMQ хранит сообщения и метаданные на постоянном томе,
который описывается в секции spec.instance.persistentVolumeClaim:
spec:
instance:
persistentVolumeClaim:
size: 10Gi
storageClassName: <STORAGE_CLASS_NAME>Замените <STORAGE_CLASS_NAME> на имя StorageClass в кластере.
Если storageClassName не задан, используется StorageClass кластера по умолчанию.
Для хранилища действуют следующие правила:
- Класс хранения фиксируется при создании тома. Последующее изменение
storageClassNameне применяется. - Размер тома можно только увеличить. StorageClass должен поддерживать расширение томов. Меньшее значение игнорируется.
- Без секции
persistentVolumeClaimмодуль не создаёт том, и данные теряются при перезапуске пода.
Том принадлежит объекту Rabbit. При удалении объекта Rabbit удаляются том и все данные RabbitMQ.
Изменение настроек RabbitMQ
Настройки RabbitMQ задаются в секции spec.configuration:
spec:
configuration:
maxMessageSize: 16MiПараметр maxMessageSize задаёт максимальный размер сообщения. Сообщения большего размера RabbitMQ отклоняет.
Параметр можно задать, только если класс указывает его в параметре overridableConfiguration;
класс default это разрешает.
Остальные настройки RabbitMQ администратор задаёт в классе.
Включение TLS
С TLS RabbitMQ принимает только зашифрованные подключения AMQPS на порту 5671, а порт 5672 закрыт.
TLS настраивается в секции spec.tls; без этой секции TLS выключен.
Серверный сертификат должен содержать следующие DNS-имена, где <NAME> — имя объекта Rabbit,
<NAMESPACE> — его неймспейс:
d8ms-rmq-<NAME>;d8ms-rmq-<NAME>.<NAMESPACE>;d8ms-rmq-<NAME>.<NAMESPACE>.svc;d8ms-rmq-<NAME>.<NAMESPACE>.svc.<CLUSTER_DOMAIN>, где<CLUSTER_DOMAIN>— домен кластера, по умолчаниюcluster.local.
Клиенты могут подключаться без клиентского сертификата.
Если клиент предъявляет сертификат, RabbitMQ проверяет его по сертификату CA из ca.crt.
Сертификат от cert-manager
В режиме CertManager модуль запрашивает сертификат у cert-manager и включает в него перечисленные выше DNS-имена.
Для этого режима нужен модуль cert-manager: включите его, если он выключен.
Укажите ClusterIssuer или Issuer из неймспейса объекта Rabbit:
spec:
tls:
mode: CertManager
certManager:
clusterIssuerName: <CLUSTER_ISSUER_NAME>Чтобы использовать Issuer, замените clusterIssuerName на issuerName.
Issuer должен помещать сертификат CA в ключ ca.crt Secret сертификата.
Модуль запускает RabbitMQ после того, как cert-manager выпустит сертификат.
Собственный сертификат
В режиме CustomCertificate RabbitMQ использует сертификаты из Secret в неймспейсе объекта Rabbit:
spec:
tls:
mode: CustomCertificate
customCertificate:
serverTLSSecret: <TLS_SECRET_NAME>
serverCASecret: <CA_SECRET_NAME>Замените плейсхолдеры:
<TLS_SECRET_NAME>— Secret типаkubernetes.io/tlsс серверным сертификатом вtls.crtи его ключом вtls.key;<CA_SECRET_NAME>— Secret с сертификатом CA в ключеca.crt.
Состояние сертификата
Секция status.certificate.server объекта Rabbit показывает состояние серверного сертификата:
ttl— количество дней до истечения срока действия сертификата;failed—true, если сертификат не удаётся прочитать.
Подключение к RabbitMQ
Для подключения к экземпляру модуль создаёт следующие объекты, где <NAME> — имя объекта Rabbit:
- Service
d8ms-rmq-<NAME>с портом5672или с портом5671, если включён TLS; - Secret
d8ms-rmq-<NAME>-user-secretс ключамиusernameиpassword.
Пользователь из Secret имеет полные права на виртуальный хост /.
Пароль генерируется при создании объекта Rabbit и не меняется.
Чтобы получить пароль, выполните команду:
d8 k -n <NAMESPACE> get secret d8ms-rmq-<NAME>-user-secret -o jsonpath='{.data.password}' | base64 -dПриложение в кластере подключается по следующему URI:
amqp://<USERNAME>:<PASSWORD>@d8ms-rmq-<NAME>.<NAMESPACE>.svc:5672/С TLS используйте схему amqps и порт 5671.
Пароль может содержать символы !@#$%^&*: закодируйте его в URI (URL-кодирование).
Проверка статуса
Состояние экземпляра отражается в списке status.conditions объекта Rabbit.
Чтобы посмотреть conditions, выполните команду:
d8 k -n <NAMESPACE> get rabbit <NAME> -o jsonpath='{range .status.conditions[*]}{.type}{"\t"}{.status}{"\t"}{.reason}{"\t"}{.message}{"\n"}{end}'Экземпляр готов, когда все conditions имеют значение True:
| Condition | Значение при True |
Причины при False |
|---|---|---|
ConfigurationValid |
Текущая спецификация объекта прошла проверки класса | RulesValidationFailed, ValidationFailed |
ScaledToLastValidConfiguration |
Под RabbitMQ готов и работает с последней валидной конфигурацией | ScaleError, NotScaled |
Available |
RabbitMQ принимает подключения | NotServing |
LastValidConfigurationApplied |
Последняя валидная конфигурация применена, RabbitMQ доступен. Это итоговый condition | Syncing, пока применяются изменения, или <OBJECT>ReconciliationFailed, если модулю не удаётся создать объект Kubernetes |
У каждого condition со значением False есть поля reason и message с описанием проблемы.
Если изменение объекта не прошло проверки, RabbitMQ продолжает работать с последней валидной конфигурацией.
Эта конфигурация отражается в секции status.lastValidConfiguration.
Диагностика проблем
В этом разделе приведены типичные ошибки, их причины и способы устранения.
Объект отклонён из-за размеров
Модуль отклоняет объект Rabbit, ресурсы которого не соответствуют классу. Сообщение об ошибке содержит один из следующих текстов:
| Сообщение | Причина | Решение |
|---|---|---|
cpu does not fit any of Sizing Policies of the chosen Class |
cores не попадает в диапазоны политик размеров |
Выберите cores в пределах диапазона из sizingPolicies класса |
memory setting does not fit selected ... Class in range |
memory.size не попадает в диапазон подходящей политики |
Выберите memory.size в пределах диапазона; границы указаны в байтах |
memory setting does not fit Step |
memory.size не кратно step |
Округлите memory.size до значения, кратного step |
core fraction does not match array in selected ... Class |
coreFraction нет в coreFractions |
Укажите одно из значений coreFractions в той же форме, например "50%" |
Объект отклонён из-за настройки
Сообщение restricted to override by administrator означает, что класс не разрешает настройку,
изменённую в spec.configuration.
Удалите настройку или выберите класс, в котором она указана в overridableConfiguration.
Сообщение Message: <TEXT> означает, что объект не удовлетворяет правилу CEL класса.
<TEXT> — сообщение этого правила.
Измените объект так, чтобы он удовлетворял правилу.
Под не удаётся разместить
Condition ScaledToLastValidConfiguration с причиной ScaleError означает,
что под RabbitMQ не удаётся разместить ни на одном узле.
Размещение подов задаёт администратор в классе.
Проверьте события пода и обратитесь к администратору:
d8 k -n <NAMESPACE> describe pod d8ms-rmq-<NAME>-0У объекта нет conditions
Если у нового объекта Rabbit нет conditions, вероятно, класс, на который он ссылается, не существует.
При создании такого объекта модуль выводит предупреждение RabbitClass <CLASS_NAME> was not found yet, skipping validation.
Проверьте значение spec.rabbitClassName или попросите администратора создать класс.