Топология 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 сливает с дефолтами, возвращая их целиком.
64 lines
3.0 KiB
YAML
64 lines
3.0 KiB
YAML
# Инфраструктура разделена на два слоя, и это не косметика.
|
||
#
|
||
# Flux делает dry-run всей Kustomization целиком перед применением. Если
|
||
# положить cert-manager (который СТАВИТ CRD) и ClusterIssuer/Certificate
|
||
# (которые ЭТИ CRD используют) в один слой, dry-run падает с
|
||
# no matches for kind "Certificate" in version "cert-manager.io/v1"
|
||
# и не применяется НИЧЕГО — включая сам cert-manager. Дедлок: CRD никогда не
|
||
# появятся, потому что слой не может пройти проверку.
|
||
#
|
||
# Поэтому: controllers ставят чарты (и CRD), configs содержат только
|
||
# пользовательские ресурсы.
|
||
#
|
||
# ПОЧЕМУ У infra-configs НЕТ dependsOn (было — и создавало дедлок).
|
||
#
|
||
# В configs лежат ClusterIssuer'ы. Чарты из слоя controllers создают
|
||
# Certificate, а Flux после установки релиза ждёт готовности его ресурсов.
|
||
# С dependsOn получался круг:
|
||
# чарт с Certificate ждёт выпуска
|
||
# → выпуск ждёт ClusterIssuer
|
||
# → ClusterIssuer в configs
|
||
# → configs ждёт готовности controllers
|
||
# → а там висит тот самый чарт
|
||
# Наступали на это дважды: сначала istio-config, следом rabbitmq (тот провисел
|
||
# в "Running 'install' action" полчаса).
|
||
#
|
||
# Жёсткий порядок заменён сходимостью через повторы: пока cert-manager не
|
||
# поставил CRD, configs будет падать на dry-run и переприменяться каждые
|
||
# 10 минут, а как только CRD появятся — применится сам. Издатели при этом
|
||
# больше не зависят от здоровья чартов, которые в них нуждаются.
|
||
#
|
||
# apps по-прежнему ждёт controllers, и это правильно: без istiod и
|
||
# vault-agent-injector его поды физически не поднимутся.
|
||
---
|
||
apiVersion: kustomize.toolkit.fluxcd.io/v1
|
||
kind: Kustomization
|
||
metadata:
|
||
name: infra-controllers
|
||
namespace: flux-system
|
||
spec:
|
||
interval: 10m0s
|
||
path: ./clusters/aero/controllers
|
||
prune: true
|
||
wait: true
|
||
timeout: 10m0s
|
||
sourceRef:
|
||
kind: GitRepository
|
||
name: flux-system
|
||
---
|
||
apiVersion: kustomize.toolkit.fluxcd.io/v1
|
||
kind: Kustomization
|
||
metadata:
|
||
name: infra-configs
|
||
namespace: flux-system
|
||
spec:
|
||
interval: 10m0s
|
||
path: ./clusters/aero/configs
|
||
prune: true
|
||
# dependsOn намеренно отсутствует — см. комментарий в начале файла.
|
||
# Повторные попытки до появления CRD дешевле, чем дедлок.
|
||
retryInterval: 1m0s
|
||
sourceRef:
|
||
kind: GitRepository
|
||
name: flux-system
|