Первый прикладной сервис переехал из compose в кластер. Развёрнуты backend, frontend, redis, srx-admin и s3-proxy; celery выключен до следующего шага. Платформа доступна по https://sarex.local.lonsdaleites.ru — корень отдаёт frontend, /api/ и /admin/ уходят в backend, /media/ в s3-proxy. Kafka и Zitadel в контуре не развёрнуты, и приложению они не нужны: SERVER_KAFKA_ENABLED в base уже False, а zitadel_enabled в sarex-backend читается ровно в одном месте — update_ams_user(), которая при выключенном флаге сразу выходит. Но аннотации инжекции этих секретов пришлось убрать: vault-agent-init не рендерит шаблон для несуществующего секрета и роняет под в Init:Error ещё до старта приложения. nginx-configmap заменён целиком. В base зашиты upstream'ы на namespace pm, workspaces и processing; nginx резолвит их при старте и падал с "host not found in upstream". pm убран как ненужный, для остальных двух адрес вынесен в переменную с resolver — их резолвинг откладывается до запроса, поэтому появление сервисов позже не потребует правки конфига. Заменять пришлось именно патчем: объект с тем же kind+name уже приходит из base, и добавление его в resources валит сборку слоя целиком. Секреты django в Vault: postgres, rabbitmq, minio и общие RSA-ключи JWT. RabbitMQ и MinIO подключены под административными кредами — отдельных пользователей приложения чарты создавать не умеют, это осознанный долг. Задача создания суперпользователя переписана с docker compose exec на kubectl exec. ВНИМАНИЕ: она пока НЕ РАБОТАЕТ — команда падает, вывод скрыт no_log. Механизм проверен отдельно и исправен, значит ошибка на стороне Django. Чтобы увидеть причину, нужно временно снять no_log.
86 lines
5.2 KiB
YAML
86 lines
5.2 KiB
YAML
---
|
||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||
kind: Kustomization
|
||
namespace: django
|
||
resources:
|
||
- ../base
|
||
|
||
patches:
|
||
# Свой nginx.conf вместо базового: в base зашиты upstream'ы на namespace,
|
||
# которых в контуре нет, и nginx из-за этого не стартовал. Подробности —
|
||
# в шапке nginx-configmap.yaml.
|
||
#
|
||
# ИМЕННО ПАТЧ, а не resources. Объект с тем же kind+name уже пришёл из
|
||
# ../base, и добавление его вторым ресурсом валит сборку целиком:
|
||
# may not add resource with an already registered id:
|
||
# ConfigMap.v1.[noGrp]/nginx-configmap.django
|
||
# Перекрывать базовый ресурс можно только патчем.
|
||
- path: nginx-configmap.yaml
|
||
target:
|
||
kind: ConfigMap
|
||
name: nginx-configmap
|
||
# --- Состав контура -------------------------------------------------------
|
||
# celery выключен: очереди подключим вместе с остальными фоновыми задачами.
|
||
# s3-proxy ВКЛЮЧЁН — он отдаёт медиафайлы браузеру с CORS и Range, а бакет
|
||
# уже создан, так что проверять его есть на чём.
|
||
- target: {kind: HelmRelease, name: celery}
|
||
patch: |
|
||
$patch: delete
|
||
apiVersion: helm.toolkit.fluxcd.io/v2
|
||
kind: HelmRelease
|
||
metadata:
|
||
name: celery
|
||
namespace: django
|
||
|
||
# --- backend: убираем зависимости, которых в контуре нет ------------------
|
||
- target: {kind: HelmRelease, name: backend}
|
||
patch: |
|
||
# Kafka и Zitadel в контуре не развёрнуты. Само приложение без них живёт:
|
||
# * SERVER_KAFKA_ENABLED в base уже "False", а в sarex-backend продюсер
|
||
# создаётся только под флагом (config/settings/deps/kafka.py);
|
||
# * zitadel_enabled читается ровно в одном месте — update_ams_user()
|
||
# в sarex/core/utils.py, которая при выключенном флаге сразу выходит.
|
||
# К аутентификации Zitadel отношения не имеет.
|
||
#
|
||
# Но аннотации инжекции убрать ОБЯЗАТЕЛЬНО: vault-agent-init не отрендерит
|
||
# шаблон для несуществующего секрета, упадёт, и под навсегда останется в
|
||
# Init:Error — приложение до своих флагов даже не дойдёт.
|
||
#
|
||
# В JSON Pointer слэш внутри ключа экранируется как ~1, поэтому
|
||
# vault.hashicorp.com/agent-... записан как vault.hashicorp.com~1agent-...
|
||
- op: remove
|
||
path: /spec/values/services/backend/podAnnotations/_default/vault.hashicorp.com~1agent-inject-secret-django-kafka
|
||
- op: remove
|
||
path: /spec/values/services/backend/podAnnotations/_default/vault.hashicorp.com~1agent-inject-template-django-kafka
|
||
- op: remove
|
||
path: /spec/values/services/backend/podAnnotations/_default/vault.hashicorp.com~1agent-inject-secret-django-common
|
||
- op: remove
|
||
path: /spec/values/services/backend/podAnnotations/_default/vault.hashicorp.com~1agent-inject-template-django-common
|
||
|
||
# S3 внутри кластера, а не через внешний домен. В base шаблон прибит к
|
||
# https://minio.contour.infra.sarex.tech — чужому домену, который отсюда
|
||
# не резолвится. Через values это не перекрыть: адрес зашит ВНУТРИ
|
||
# vault-шаблона аннотации, поэтому заменяем аннотацию целиком.
|
||
# Ходим напрямую в сервис MinIO, как это делал compose-стек.
|
||
- op: replace
|
||
path: /spec/values/services/backend/podAnnotations/_default/vault.hashicorp.com~1agent-inject-template-django-s3
|
||
value: |-
|
||
{{- with secret "secrets/data/minio/apps/django" }}
|
||
AWS_S3_ENDPOINT_URL=http://minio.minio.svc.cluster.local:9000
|
||
S3_HOST=http://minio.minio.svc.cluster.local:9000
|
||
{{- $buckets := index .Data.data "buckets" }}
|
||
S3_BUCKET={{ if gt (len $buckets) 0 }}{{ index (index $buckets 0) "name" }}{{ else }}django{{ end }}
|
||
S3_LOGIN={{ index .Data.data "access_key" }}
|
||
S3_PASSWORD={{ index .Data.data "secret_key" }}
|
||
{{- end }}
|
||
|
||
# Выключаем Zitadel. Операция test перед replace — страховка от смещения
|
||
# индекса: если в base порядок envs изменится, патч упадёт явно, вместо
|
||
# того чтобы молча перезаписать соседнюю переменную.
|
||
- op: test
|
||
path: /spec/values/services/backend/envs/2/name
|
||
value: SERVER_ZITADEL_ENABLED
|
||
- op: replace
|
||
path: /spec/values/services/backend/envs/2/value/_default
|
||
value: "False"
|