iac/infrastructure/rabbitmq/aero/rabbitmq.yaml
emelinda 237dcb9b28 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.
2026-08-08 18:32:38 +03:00

118 lines
5.4 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: rabbitmq
namespace: rabbitmq
spec:
interval: 2m
timeout: 10m
# Вырезаем ресурсы ПОСЛЕ рендера чарта. Через values это недостижимо:
# * `null` до Helm не доезжает — kustomize нормализует его в {};
# * `{}` Helm сливает с дефолтом (coalesceMaps), и дефолт возвращается.
# postRenderers работает уже с готовым манифестом, где коалесинг позади.
#
# Что вырезаем: собственные Gateway/VirtualService/Certificate чарта на
# посторонний домен rabbitmq.infra.sarex.io. Маршрутизация контура описана
# централизованно в infrastructure/istio-config/aero.
#
# Особенно важен rmq-tls: домен не наш, ACME отдаёт 503 и проверка не пройдёт
# никогда. Пока он был в релизе, Helm ждал его выпуска, install падал по
# таймауту, срабатывал откат — и весь слой infra-controllers стоял.
postRenderers:
- kustomize:
patches:
- target:
kind: Gateway
name: rmq-gateway
patch: |
$patch: delete
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: rmq-gateway
namespace: gateway
- target:
kind: VirtualService
name: rmq-virt-service
patch: |
$patch: delete
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: rmq-virt-service
namespace: rabbitmq
- target:
kind: Certificate
name: rmq-tls
patch: |
$patch: delete
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: rmq-tls
namespace: gateway
values:
global:
security:
allowInsecureImages: true
# Здесь НЕТ ключей virtualService/gateway/certificate, и это намеренно:
# через values дефолты чарта не убираются вообще никак.
#
# Helm : удалить дефолт можно ТОЛЬКО значением null;
# {} он глубоко сливает с дефолтом, и дефолт остаётся;
# kustomize : в strategic-merge-патче null означает УДАЛИТЬ КЛЮЧ,
# в JSON6902 — нормализуется обратно в {}.
#
# То есть до Helm настоящий null не доходит ни одним путём. Поэтому ресурсы
# вырезаются postRenderers'ом выше, уже из отрендеренного манифеста.
metrics:
serviceMonitor:
enabled: false
default:
enabled: false
perObject:
enabled: false
detailed:
enabled: false
extraServiceMonitors: []
replicaCount: 1
persistence:
storageClass: local-path
size: 8Gi
resources:
requests:
memory: 512Mi
# Логин/пароль приезжают из Vault через vault-agent-injector: секрет кладёт
# ansible (роль sarex_stack, vault_app_secrets), роль rabbitmq в
# 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
role: rabbitmq
authPath: auth/kubernetes
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, []}
]}
].