Задача падала ещё до обращения к 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.
32 lines
1.5 KiB
Django/Jinja
32 lines
1.5 KiB
Django/Jinja
{# Секреты-файлы, которые монтируются в поды НЕ через 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 %}
|