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. на "= false", а брокер её не применяет — в рантайме # rabbitmqctl eval "application:get_env(rabbit, loopback_users)." всё равно # отдавал {ok,[<<"rabbit">>]}. advanced.config разбирается позже и задаёт # значение явным списком, поэтому именно он и решает. advancedConfiguration: |- [ {rabbit, [ {loopback_users, []} ]} ].