Аннотации 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: измерения не получили
новый бакет не потому, что правка неверна, а потому что до них не дошла
очередь.
88 lines
5.2 KiB
YAML
88 lines
5.2 KiB
YAML
---
|
||
# Заведение бакетов. Чарт 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
|