Топология 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 сливает с дефолтами, возвращая их целиком.
45 lines
2.0 KiB
YAML
45 lines
2.0 KiB
YAML
# Token reviewer для метода auth/kubernetes.
|
||
#
|
||
# Vault живёт ВНЕ кластера, поэтому не может воспользоваться ни своим
|
||
# ServiceAccount-токеном, ни CA из /var/run/secrets. Чтобы он мог проверять
|
||
# токены подов, ему выдаётся отдельный ServiceAccount с правом обращаться к
|
||
# TokenReview API — ClusterRole `system:auth-delegator` (встроенная).
|
||
#
|
||
# Схема целиком: под с аннотациями vault.hashicorp.com/* → injector добавляет
|
||
# init-контейнер vault-agent → агент логинится в Vault токеном ServiceAccount'а
|
||
# пода → Vault валидирует этот токен через TokenReview от имени vault-auth →
|
||
# при успехе отдаёт секреты, агент кладёт их файлами в /vault/secrets/.
|
||
---
|
||
apiVersion: v1
|
||
kind: ServiceAccount
|
||
metadata:
|
||
name: vault-auth
|
||
namespace: vault
|
||
---
|
||
apiVersion: rbac.authorization.k8s.io/v1
|
||
kind: ClusterRoleBinding
|
||
metadata:
|
||
name: vault-auth-delegator
|
||
roleRef:
|
||
apiGroup: rbac.authorization.k8s.io
|
||
kind: ClusterRole
|
||
name: system:auth-delegator
|
||
subjects:
|
||
- kind: ServiceAccount
|
||
name: vault-auth
|
||
namespace: vault
|
||
---
|
||
# Долгоживущий токен ServiceAccount'а. С k8s 1.24 секрет-токен больше не
|
||
# создаётся автоматически при создании SA, а `kubectl create token` выдаёт
|
||
# токен с TTL — он протух бы, и Vault перестал бы валидировать логины.
|
||
# Секрет типа service-account-token с этой аннотацией заполняет
|
||
# token-controller: в него попадают и `token`, и `ca.crt` кластера.
|
||
apiVersion: v1
|
||
kind: Secret
|
||
metadata:
|
||
name: vault-auth-token
|
||
namespace: vault
|
||
annotations:
|
||
kubernetes.io/service-account.name: vault-auth
|
||
type: kubernetes.io/service-account-token
|