iac/infrastructure/rabbitmq/aero/rabbitmq.yaml
emelinda 565faa0e17 feat(aero): базовый слой контура — Vault↔k3s, GitOps-синхронизация, выход наружу
Топология k3s: 1 мастер + 2 воркера (убран k3s-worker-3 с томом).

Vault ↔ k3s. Vault живёт в compose, вне кластера, поэтому получает
статический IP 172.28.0.13, DNS-мост в namespace vault и token reviewer
(SA vault-auth + system:auth-delegator). Ansible включает auth/kubernetes,
передавая адрес apiserver, CA и JWT ревьюера явно, и заводит политику с
ролями. Секрет token reviewer'а читается целиком в JSON: вариант
-o jsonpath={.data.ca\.crt} НЕ работает — модуль command разбирает строку
через shlex, съедает обратный слэш, kubectl возвращает пустую строку с
кодом 0, и отказ остаётся незамеченным до падения vault write.

Синхронизация репозитория в gitea. Нужное подмножество путей (замыкание
ссылок clusters/aero) едет архивом на хост и коммитится там: gitea не
публикуется дальше самого хоста, контур остаётся замкнутым. flux-bootstrap
вынесен в отдельную волну — до неё Vault получает auth/kubernetes, а
репозиторий наполняется, иначе первая реконсиляция падает на пустом репо.

Инфраструктура: vault-agent-injector (чарт vault-contour в режиме внешнего
Vault), local-path-provisioner взамен встроенного в k3s (--disable=
local-storage; путь данных прежний), rabbitmq и minio с кредами из Vault.

Выход наружу: порты 80/443 k3s-server опубликованы (istio ingressgateway
занимает эти hostPort), общий contour-gateway на wildcard-хост, сертификат
Let's Encrypt через http01. Имена в сертификате перечислены явно —
http01 не выдаёт wildcard, для них нужен dns01.

Разорваны два дедлока Flux: infra-configs больше не зависит от
infra-controllers (издатели не должны зависеть от здоровья чартов, которые
их используют), istio-config получил disableWait.

Модули ядра iptable_nat и смежные грузятся на хосте: ноды k3s —
контейнеры, istio-init правит iptables через ядро хоста, а на RED OS 8
(nf_tables) legacy-модули не загружены, из-за чего любой под с
istio-injection навсегда вставал в Init:Error.

Собственные Gateway/VirtualService/Certificate чартов rabbitmq и dashboard
отключены — маршрутизация описана централизованно. У rabbitmq это сделано
postRenderers, а не values: kustomize нормализует null в {}, а пустую карту
Helm сливает с дефолтами, возвращая их целиком.
2026-08-08 09:36:08 +03:00

106 lines
4.6 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: 5m
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 чарта отключаются НЕ здесь,
# а JSON6902-патчем в kustomization.yaml рядом. Причина — в противоположной
# семантике null у двух инструментов:
#
# Helm : удалить дефолт можно ТОЛЬКО значением null;
# {} он глубоко сливает с дефолтом, и дефолт остаётся;
# kustomize : в strategic-merge-патче null означает УДАЛИТЬ КЛЮЧ,
# то есть до Helm он просто не доедет.
#
# Значит ни `virtualService: null`, ни `virtualService: {}` здесь не
# работают: первое стирается kustomize, второе игнорируется Helm. Нужен
# JSON6902, где null — это именно значение, а не команда удаления.
#
# Цена ошибки не косметическая: чарт создавал rmq-gateway, rmq-virt-service
# и сертификат rmq-tls на посторонний домен rabbitmq.infra.sarex.io.
# Последний не проходит проверку ACME никогда, впустую жжёт лимиты
# Let's Encrypt, а релиз висит в install, ожидая его выпуска, и блокирует
# весь слой infra-controllers.
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
existingPasswordSecret: ""
vault:
enabled: true
role: rabbitmq
authPath: auth/kubernetes
secretPath: secrets/data/rabbitmq/auth
usernameKey: username
passwordKey: password