iac/infrastructure/minio/aero/buckets-job.yaml
emelinda c750a08f8d Measurements пишет в общий бакет контура + перекат нагрузок в ansible
--- Бакет ---

В base у measurements имя бакета ЗАШИТО в самом vault-шаблоне:
  "buckets":["measurements"]
Из-за этого он складывал файлы в собственный бакет, тогда как
медиахранилище контура одно — sarex-media-storage: туда пишет django и
оттуда же раздаёт s3-proxy на маршруте /media/. Ссылка на файл
измерения, отданная через django, вела бы в пустоту.

Шаблон переопределён в apps/measurements/aero так, чтобы имя бакета
читалось из секрета — как уже читается endpoint. Значение задаётся в
одном месте, vault_app_secrets, и совпадает с sarex_django_s3_bucket.
Заменить пришлось аннотацию целиком: значение внутри шаблона, через
values его не перекрыть.

Из Job'а бакетов убран measurements. Это не удаление: Job умеет только
mc mb --ignore-existing, ранее созданный бакет остаётся на месте — мы
лишь перестаём его заводить.

Порядок применения безопасен: в platform.yml vault-k8s.yml идёт до
gitea-sync.yml, то есть секрет получит ключ bucket раньше, чем Flux
пересоздаст под. Иначе vault-agent-init не отрендерил бы шаблон с
несуществующим ключом и под ушёл бы в Init:Error.

--- Перекат нагрузок ---

Единственное действие, которое до сих пор делалось руками мимо роли, —
rollout restart после правки ConfigMap. Оно понадобилось дважды (порядок
set/rewrite в nginx и auth_type) и оба раза выглядело как «правка не
поехала»: Flux рапортует Applied revision, а поведение старое.

Причина в том, что у релизов universal-chart в шаблоне пода нет
контрольной суммы конфига: ConfigMap меняется, спецификация пода — нет,
Kubernetes не видит причин пересоздавать под. Декларативно это здесь не
лечится — имя ConfigMap передаётся чарту строкой, монтирует он его сам, а
configMapGenerator переименовал бы ресурс, не поправив ссылку внутри
чарта, который рендерится уже в кластере.

Добавлены tasks/reload.yml, список sarex_reload_workloads в defaults и
задача `uv run poe reload`. По умолчанию выключено: перезапуск подов
посреди обычного деплоя происходить сам не должен.
2026-08-09 11:58:06 +03:00

80 lines
4.6 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 при каждой синхронизации: спецификация Job неизменяема,
# и без пересоздания kustomize не смог бы применить правку списка бакетов.
kustomize.toolkit.fluxcd.io/force: "true"
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