--- Бакет --- В 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`. По умолчанию выключено: перезапуск подов посреди обычного деплоя происходить сам не должен.
80 lines
4.6 KiB
YAML
80 lines
4.6 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 при каждой синхронизации: спецификация 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
|