iac/aero/roles/sarex_stack/templates/app-secrets.yaml.j2
emelinda e1a81d3dd8 Processing: секрет yc-s3 для подов задач workflows
Задача падала ещё до обращения к S3, на разборе конфигурации:
  pydantic ValidationError for S3AccountModel
  Value error, Expecting value: line 1 column 1 (char 0)
  ValueError: SERVICE_S3 is not valid
"Expecting value ... char 0" — это разбор пустоты: файла по пути не было.

Секрет secrets/minio/apps/processing из Vault при этом настроен верно, и
движок его видит (S3_SERVICE_ACCOUNT=/vault/secrets/processing-s3). Но в
поды задач движок его НЕ передаёт — для них у него отдельный механизм,
зашитый в код:

  services[S3Storage] = Service{
      CredentialsName: "yc-s3",
      CredentialsPath: "/etc/sarex/yc-s3",
      Envs: {"SERVICE_S3": `{"service_account":
             "/etc/sarex/yc-s3/yc-s3-service-account.json"}`},
  }
  (pkg/kube_services/services.go)

То есть он монтирует в Job обычный Secret с именем yc-s3 из namespace
задач (JOBS_NAMESPACE=processing). Ни имя секрета, ни путь, ни имя файла
не настраиваются.

vault-agent сюда не дотягивается по построению: поды задач движок создаёт
сам во время работы, аннотаций инжекции у них нет. Поэтому секрет заводит
ansible — tasks/app-secrets.yml, шаблон app-secrets.yaml.j2 и описание в
k8s_file_secrets. Формат содержимого повторяет
engine/yc-s3-service-account.json из compose-стека и совпадает с тем, что
vault-agent рендерит самому движку.

Манифест рендерится, применяется и сразу удаляется — в нём креды открытым
текстом, ровно как у секретов реестра. Namespace объявлен в том же
манифесте: на холодном старте Flux до слоя apps ещё не дошёл, а apply в
несуществующий namespace упал бы. Повторное создание безвредно, так же
заведён namespace vault.
2026-08-09 23:30:53 +03:00

32 lines
1.5 KiB
Django/Jinja
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.

{# Секреты-файлы, которые монтируются в поды НЕ через vault-agent.
Обычные приложения контура берут креды из Vault аннотациями инжекции. Здесь
так нельзя: эти файлы монтирует в свои Job'ы движок workflows-engine, а он
создаёт поды сам и об аннотациях ничего не знает — ему нужен готовый Secret
в namespace задач. Имя секрета и путь монтирования зашиты в код движка
(pkg/kube_services/services.go, поля CredentialsName и CredentialsPath),
поэтому переименовать их нельзя.
Значения приходят из sarex_secrets, в репозиторий не попадают. #}
{% for s in k8s_file_secrets %}
---
{# Namespace объявлен здесь же: на холодном старте Flux до него ещё не дошёл,
а apply секрета в несуществующий namespace упал бы. Повторное создание
безвредно — Flux спокойно подхватит уже существующий объект, ровно так же
заведён namespace vault. #}
apiVersion: v1
kind: Namespace
metadata:
name: {{ s.namespace }}
---
apiVersion: v1
kind: Secret
metadata:
name: {{ s.name }}
namespace: {{ s.namespace }}
type: Opaque
stringData:
{{ s.key }}: |
{{ s.content | indent(4, true) }}
{% endfor %}