RabbitMQ: снят loopback-only для администратора

Celery не поднимался: worker падал в CrashLoopBackOff на
amqp.exceptions.AccessRefused (403) при подключении к брокеру.

Диагностика уводила в сторону — 403 читается как несовпадение пароля, но
пароль был верный: хеши значения в Vault, в файле, смонтированном в под
брокера, и в собранном BROKER_URL совпадали, а rabbitmqctl authenticate_user
с ним проходил. Настоящая причина нашлась в логе брокера:

  PLAIN login refused: user 'rabbit' can only connect via localhost

Пользователю разрешён вход только с localhost, поэтому отбивалось любое
подключение из кластера — и по той же причине в management UI нельзя было
войти снаружи.

Лечится так же, как в d8-ugmk-prod: флагом auth.enableLoopbackUser и
дублирующим advancedConfiguration. Дубль не избыточен — флаг лишь пишет в
rabbitmq.conf строку "loopback_users.<user> = false", которую брокер не
применяет: в рантайме loopback_users всё равно оставался [<<"rabbit">>].
Значение задаёт именно advanced.config.
This commit is contained in:
emelinda 2026-08-08 18:32:38 +03:00
parent c2a9bae0db
commit 237dcb9b28

View File

@ -87,6 +87,14 @@ spec:
# auth/kubernetes создаётся там же.
auth:
securePassword: true
# Без этого администратор пускается только с localhost, и любое
# подключение из кластера отбивается на аутентификации:
# PLAIN login refused: user 'rabbit' can only connect via localhost
# Диагностика сбивает с толку: клиент видит 403 ACCESS_REFUSED, будто
# не сошёлся пароль, хотя пароль верный — rabbitmqctl authenticate_user
# с тем же значением проходит. Так у celery не поднимался worker, и по
# той же причине в management UI нельзя было войти снаружи.
enableLoopbackUser: false
existingPasswordSecret: ""
vault:
enabled: true
@ -95,3 +103,15 @@ spec:
secretPath: secrets/data/rabbitmq/auth
usernameKey: username
passwordKey: password
# Дублирует enableLoopbackUser: false намеренно, тем же способом, что и
# d8-ugmk-prod. Одного флага мало: он лишь заменяет в rabbitmq.conf строку
# loopback_users.<user> на "= false", а брокер её не применяет — в рантайме
# rabbitmqctl eval "application:get_env(rabbit, loopback_users)." всё равно
# отдавал {ok,[<<"rabbit">>]}. advanced.config разбирается позже и задаёт
# значение явным списком, поэтому именно он и решает.
advancedConfiguration: |-
[
{rabbit, [
{loopback_users, []}
]}
].