Топология 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 сливает с дефолтами, возвращая их целиком.
106 lines
4.6 KiB
YAML
106 lines
4.6 KiB
YAML
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
|