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.
118 lines
5.4 KiB
YAML
118 lines
5.4 KiB
YAML
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, []}
|
||
]}
|
||
].
|