iac/infrastructure/istio-config/aero/istio-config.yaml
emelinda 96d0d2e373 BIM в контуре aero: api и worker из aero/bimbackend
Разворачивается ИМЕННО bimbackend (Python, пара api + worker), а не
platform/bim-backend-v2 из apps/bim/base — тот откачен коммитом 285255e.
../base здесь намеренно не подключён.

Различить два приложения по образу нельзя: оба пушат bim-api. Различие в
тегах — у bimbackend полный SHA коммита (CI пушит bim-api:${CI_COMMIT_SHA}
с master), у bim-backend-v2 contour_*. Взят 870965d1..., тот же, что
крутится в dsinv.

Манифесты обычные, а не universal-chart: в репозитории сервис так и описан
(apps/bim/dsinv), своего чарта у него нет.

Отличия от dsinv:
  * секреты из Vault вместо secretKeyRef на несуществующие Secret'ы;
    штатный entrypoint файлы читать не умеет, поэтому обёрнут в sh -ec;
  * PROCESSING_API_URL и WORKSPACES_API_URL приведены к именам контура —
    в dsinv это workflows-service:8000 и workspaces-service:8000, здесь
    оба сервиса называются backend-svc и слушают 80;
  * RABBIT_HOST у воркера в dsinv указывает на rabbitmq-service.bim —
    брокера в этом namespace нет ни там, ни здесь; у api в том же файле
    адрес правильный. Поставлен общий брокер контура, vhost корневой;
  * S3_BUCKET переведён на общее медиахранилище sarex-media-storage;
  * убраны GOOGLE_APPLICATION_CREDENTIALS и том с ключом — Google в
    контуре нет, флаг FEATURE_ENABLE_GCLOUD и так выключен;
  * NodePort с прибитым 31352 заменён на ClusterIP: наружу сервис выходит
    через общий Gateway;
  * снят nodeSelector name=generic, imagePullSecrets переведён на regcred.

ИЗВЕСТНОЕ ОГРАНИЧЕНИЕ, принято осознанно. S3 у этого приложения на MinIO
не настраивается: в storage/s3.py адрес зашит в код —
  endpoint_url='https://storage.yandexcloud.net'
переменной окружения для него нет. Из контура он недостижим, поэтому
операции с файлами будут падать по таймауту, а остальные эндпоинты живы.
Альтернативы — пересборка образа с вынесенным endpoint либо перевод на
BIM_CURRENT_STORAGE=local (тип есть в storage/storages.py).

Наружу выведен на bim.sarex.local.lonsdaleites.ru, имя добавлено в
dnsNames сертификата. Тот же адрес приложение знает про себя через
BIM_API_EXTERNAL_HOST и строит по нему ссылки.
2026-08-09 20:42:23 +03:00

230 lines
13 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: istio-config
namespace: default
spec:
interval: 2m
timeout: 10m
# disableWait РАЗРЫВАЕТ ДЕДЛОК, не украшательство.
#
# Чарт создаёт Certificate, а Flux после установки релиза ждёт готовности его
# ресурсов — в том числе этого сертификата. Выпустить его нельзя, пока нет
# ClusterIssuer, а издатели живут в слое infra-configs, который по dependsOn
# ждёт готовности infra-controllers, где и находится этот самый релиз. Круг:
# istio-config → Certificate → ClusterIssuer → infra-configs
# → infra-controllers → istio-config
# На практике это выглядело как вечное "Running 'upgrade' action" при
# Released: True и Certificate в состоянии
# "Issuing certificate as Secret does not exist".
#
# Ждать здесь всё равно нечего: чарт разворачивает только конфигурационные
# объекты (Gateway, VirtualService, Certificate), а не рабочие нагрузки.
# Сертификат выпустится асинхронно, как только появится издатель.
install:
disableWait: true
upgrade:
disableWait: true
# Список продублирован из base целиком: для CRD kustomize заменяет списки,
# а не сливает, поэтому частичный патч потерял бы зависимости от istio.
# cert-manager добавлен сверх base — чарт istio-config рендерит Certificate,
# и без готовых CRD установка падает.
dependsOn:
- name: istio-base
namespace: istio-system
- name: istiod
namespace: istio-system
- name: ingressgateway
namespace: istio-system
- name: cert-manager
namespace: cert-manager
values:
global:
env: aero
environments:
aero:
namespaces: []
# Блок обязателен, даже пустой: шаблоны gateway.yaml и virtualservice.yaml
# разыменовывают $env.istio.gateways / .virtualServices без проверки на
# nil и падают с "nil pointer evaluating interface {}".
istio:
# Один общий Gateway на весь контур вместо отдельного на каждый сервис.
# Так сделано потому, что у контура есть wildcard-домен: сертификат и
# Gateway покрывают *.sarex.local.lonsdaleites.ru целиком, а новый
# сервис публикуется добавлением ОДНОГО VirtualService — без правки
# сертификатов и Gateway. В прод-кластерах домены выписаны поштучно,
# там wildcard'а нет.
gateways:
contour:
name: contour-gateway
namespace: gateway
servers:
# ПОРЯДОК ЗНАЧИМ: первым обязан идти хост без звёздочки.
# Чарт собирает из hosts[0] имя порта
# name: {{ printf "%s-https-443" (index $server.hosts 0 ...) }}
# и НЕ заключает результат в кавычки. Хост "*.domain" дал бы
# токен "*-domain-https-443", который YAML читает как ссылку на
# якорь, и Helm падает с
# MalformedYAMLError: yaml: unknown anchor ... referenced
# Сами hosts чарт квотирует, поэтому wildcard ниже безопасен.
- hosts:
- sarex.local.lonsdaleites.ru
- "*.sarex.local.lonsdaleites.ru"
tls:
credentialName: contour-tls
# ВНИМАНИЕ: имя ресурса VirtualService чарт берёт из КЛЮЧА map
# ({{ $vsName }}), а поле name внутри — игнорирует, в отличие от
# gateways, где .name учитывается. Поэтому здесь его нет: ключ и есть
# имя. В остальных кластерах репозитория name у virtualServices
# присутствует, но ни на что не влияет.
virtualServices:
# Kubernetes Dashboard. Свой VirtualService чарт дашборда создаёт на
# домен dashboard.preprod.sarex.io — он к контуру aero отношения не
# имеет и никуда не резолвится. Этот выводит дашборд на домен
# контура; точка входа — kong-proxy, как во всех остальных кластерах.
dashboard:
namespace: gateway
hosts:
- dashboard.sarex.local.lonsdaleites.ru
gateways:
- gateway/contour-gateway
routes:
- path:
prefix: /
service: dashboard-kong-proxy.kubernetes-dashboard.svc.cluster.local
port: 80
# Платформа sarex: frontend в корне, backend на /api/ и /admin/.
# Порядок маршрутов значим — более специфичные префиксы идут
# первыми, иначе их перехватит правило для /.
platform:
namespace: gateway
hosts:
- sarex.local.lonsdaleites.ru
gateways:
- gateway/contour-gateway
routes:
# Медиафайлы отдаёт s3-proxy: он добавляет CORS и поддерживает
# Range-запросы, которых у S3 API «как есть» нет. Backend
# формирует ссылки вида /media/<key>, поэтому маршрут должен
# идти ПЕРЕД правилом для /.
- path:
prefix: /media/
service: s3-proxy-svc.django.svc.cluster.local
port: 80
# Микрофронтенд workflows и его API. Порядок внутри пары
# значим: /workflows/api/ обязан идти перед /workflows/, иначе
# запросы к API уйдут в раздачу статики.
#
# Оба маршрута висят на домене платформы, а не на отдельном
# поддомене, потому что адреса бэкендов вшиты в JS-бандл на
# этапе сборки (константа __BUILD_ENV__) и указывают на тот же
# origin относительными путями. Отдельный поддомен означал бы
# пересборку образа.
#
# Маршруты живут в ЭТОМ VirtualService, а не в своём: Istio не
# сливает несколько VirtualService, привязанных к одной паре
# хост+gateway, — часть правил молча потерялась бы.
- path:
prefix: /workflows/api/
rewrite: /api/
service: backend-svc.processing.svc.cluster.local
port: 80
- path:
prefix: /workflows/
rewrite: /
service: frontend-svc.processing.svc.cluster.local
port: 80
- path:
prefix: /api/
service: backend-svc.django.svc.cluster.local
port: 80
- path:
prefix: /admin/
service: backend-svc.django.svc.cluster.local
port: 80
- path:
prefix: /
service: frontend-svc.django.svc.cluster.local
port: 80
# BIM API (aero/bimbackend). Отдельный поддомен, а не префикс на
# домене платформы: свой фронтенд у сервиса отсутствует, а его
# пути на общем домене конфликтовали бы с маршрутом /api/ django.
# Тот же адрес приложение знает про себя само —
# BIM_API_EXTERNAL_HOST в apps/bim/aero, оно строит по нему ссылки.
#
# Имя добавлено в dnsNames сертификата ниже: без этого браузер
# получит сертификат, в котором его нет.
bim:
namespace: gateway
hosts:
- bim.sarex.local.lonsdaleites.ru
gateways:
- gateway/contour-gateway
routes:
- path:
prefix: /
service: bim-api-service.bim.svc.cluster.local
port: 5555
# Management UI RabbitMQ.
rabbitmq:
namespace: gateway
hosts:
- rabbitmq.sarex.local.lonsdaleites.ru
gateways:
- gateway/contour-gateway
routes:
- path:
prefix: /
service: rabbitmq.rabbitmq.svc.cluster.local
port: 15672
# MinIO: консоль на /console/, S3 API в корне. Порядок маршрутов
# значим — более специфичный префикс должен идти первым, иначе его
# перехватит правило для /.
minio:
namespace: gateway
hosts:
- minio.sarex.local.lonsdaleites.ru
gateways:
- gateway/contour-gateway
routes:
- path:
prefix: /console/
service: minio-console.minio.svc.cluster.local
port: 9001
- path:
prefix: /
service: minio.minio.svc.cluster.local
port: 9000
requestAuthentications: {}
authorizationPolicies: {}
certManager:
certificates:
# Издатель — внутренний CA контура, а не ACME: до Let's Encrypt
# из закрытого контура не достучаться.
# См. infrastructure/cert-manager/aero/clusterissuer-ca.yaml
#
# Домены продублированы из aero/roles/sarex_stack/defaults/main.yml
# (platform_domain и производные). Единого источника нет — так же
# захардкожено во всех остальных кластерах репозитория.
#
# Один сертификат на весь контур, общий для всех его сервисов.
contour-tls:
# Имена перечислены ЯВНО, а не wildcard'ом: решатель http01
# принципиально не выдаёт wildcard-сертификаты, для них Let's
# Encrypt требует dns01, а webhook DNS-провайдера в контуре не
# настроен. Wildcard остался в hosts Gateway — там он про
# маршрутизацию, а не про TLS.
#
# Публикуешь новый сервис — добавь его имя сюда, иначе браузер
# получит сертификат, в котором этого имени нет.
dnsNames:
- sarex.local.lonsdaleites.ru
- dashboard.sarex.local.lonsdaleites.ru
- rabbitmq.sarex.local.lonsdaleites.ru
- minio.sarex.local.lonsdaleites.ru
- bim.sarex.local.lonsdaleites.ru
issuerRef:
# Боевой издатель, см. infrastructure/cert-manager/aero/configs.
name: letsencrypt-issuer-istio
kind: ClusterIssuer