iac/infrastructure/minio/aero/buckets-job.yaml
emelinda c24f02b078 MinIO: аннотация force у Job'а бакетов должна быть enabled, не "true"
Аннотации Flux force, prune и ssa принимают enabled/disabled, а не
булево. Написанное "true" Flux молча игнорировал.

Пока Job'а не существовало, это ничем себя не проявляло: обычный apply
проходил, бакеты заводились, всё выглядело рабочим. Сломалось на первой
же правке скрипта — spec.template у Job неизменяем, и слой
infra-controllers встал целиком:

  Job/minio/minio-buckets dry-run failed (Invalid):
    Job.batch "minio-buckets" is invalid: spec.template: ... field is immutable

а вместе с ним встал зависящий от него слой apps: измерения не получили
новый бакет не потому, что правка неверна, а потому что до них не дошла
очередь.
2026-08-09 12:11:14 +03:00

88 lines
5.2 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.

---
# Заведение бакетов. Чарт MinIO этого не умеет — форк не принимает ни buckets,
# ни provisioning, — а приложения ждут бакет готовым: django падает на загрузке
# файлов, measurements — на старте, если бакета из его vault-шаблона нет.
#
# До этого Job'а бакеты заводились руками через mc. Такой бакет не переживает
# пересоздание контура и не виден в репозитории: развернув всё с нуля, ты
# получишь работающий MinIO и приложения, падающие на отсутствующем бакете.
#
# Идемпотентность даёт mc mb --ignore-existing: Job гоняется при каждом
# применении релиза (ttl удаляет завершившийся), повторный запуск на готовых
# бакетах отрабатывает вхолостую и завершается нулём.
apiVersion: batch/v1
kind: Job
metadata:
name: minio-buckets
namespace: minio
annotations:
# Пересоздавать Job при правке: spec.template у Job неизменяем, обычный
# apply на изменившемся списке бакетов падает с "field is immutable".
#
# ЗНАЧЕНИЕ ИМЕННО enabled. Аннотации Flux — force, prune, ssa — принимают
# enabled/disabled, а не булево. Написанное здесь раньше "true" Flux молча
# игнорировал: пока Job'а не существовало, обычный apply проходил и всё
# выглядело рабочим, а на первой же правке скрипта слой infra-controllers
# встал целиком —
# Job/minio/minio-buckets dry-run failed (Invalid): field is immutable
# и вместе с ним встал зависящий от него слой apps.
kustomize.toolkit.fluxcd.io/force: enabled
spec:
# Job живёт час после завершения и удаляется. Не 0: если он упадёт, логи
# должны остаться доступными для разбора.
ttlSecondsAfterFinished: 3600
backoffLimit: 6
template:
metadata:
annotations:
# Sidecar istio не даёт Job завершиться: контейнер задачи выходит, а
# envoy продолжает работать, и под навсегда остаётся Running.
sidecar.istio.io/inject: "false"
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-init-first: "true"
vault.hashicorp.com/agent-pre-populate-only: "true"
vault.hashicorp.com/auth-path: auth/kubernetes
vault.hashicorp.com/role: minio
vault.hashicorp.com/agent-inject-secret-admin: secrets/data/minio/admin
vault.hashicorp.com/agent-inject-template-admin: |-
{{- with secret "secrets/data/minio/admin" -}}
MINIO_ROOT_USER={{ index .Data.data "rootUser" }}
MINIO_ROOT_PASSWORD={{ index .Data.data "rootPassword" }}
{{- end -}}
spec:
restartPolicy: OnFailure
serviceAccountName: minio-sa
imagePullSecrets:
- name: regcred
containers:
- name: mc
# Тот же образ, которым бакеты заводил compose-стек (SAREX_MC_IMAGE
# в docker-compose.yaml). Тег фиксированный: latest в приватном
# реестре не публикуется.
image: cr.yandex/crp3ccidau046kdj8g9q/mc:250724
command: ["/bin/sh", "-ec"]
args:
- |
. /vault/secrets/admin
# Ждём готовности API: Job стартует вместе с релизом и обгоняет
# готовность самого MinIO.
until mc alias set contour http://minio.minio.svc.cluster.local:9000 \
"$MINIO_ROOT_USER" "$MINIO_ROOT_PASSWORD" >/dev/null 2>&1; do
echo "жду MinIO..."
sleep 5
done
# Бакет в контуре ОДИН: в него пишет django, из него раздаёт
# s3-proxy на маршруте /media/, туда же переведён measurements.
# Раньше у measurements в vault-шаблоне был зашит собственный
# бакет, и файл, положенный им, по ссылке из django не отдавался.
#
# Ранее созданный бакет measurements этой правкой НЕ удаляется:
# Job умеет только mc mb --ignore-existing. Убирать его — отдельное
# осознанное решение, здесь мы лишь перестаём его заводить.
for b in sarex-media-storage; do
mc mb --ignore-existing "contour/$b"
echo "бакет $b готов"
done