iac/aero/roles/sarex_stack/tasks/reload.yml
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

42 lines
3.0 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.

---
# Перекат нагрузок, которые не перезапускаются сами при правке конфигурации.
#
# ЗАЧЕМ ЭТО ОТДЕЛЬНАЯ ЗАДАЧА. Flux обновляет ConfigMap в кластере за пару минут,
# но под продолжает работать со старым содержимым: у релизов universal-chart в
# шаблоне пода нет контрольной суммы конфига, поэтому спецификация не меняется
# и Kubernetes не видит причин пересоздавать под. Всё, что задаётся через
# ConfigMap, применяется только после явного переката.
#
# Так это выглядит на практике: правишь nginx.conf, Flux рапортует Applied
# revision, проверяешь — поведение старое. Легко принять за «правка не поехала»
# и пойти искать несуществующую ошибку. Дважды так и было: сначала с порядком
# set/rewrite, потом с auth_type.
#
# ПОЧЕМУ НЕ ДЕКЛАРАТИВНО. Правильное лечение — аннотация с хешем конфига в
# шаблоне пода, тогда изменение ConfigMap меняет спецификацию и перекат
# происходит сам. Здесь так не выходит: имя ConfigMap чарту передаётся строкой,
# монтирование он делает сам, и посчитать хеш на этапе kustomize нечем —
# configMapGenerator переименовал бы ресурс, но ссылку внутри чарта, который
# рендерится уже в кластере, не поправил бы. Так что действие остаётся
# императивным, и его место — здесь, а не в чьей-то памяти.
#
# ЗАПУСК ТОЛЬКО ЯВНЫЙ. Задача не выполняется при обычном прогоне: перекат
# нагрузок посреди деплоя — не то, что должно случаться само.
# uv run poe reload
# либо точечно:
# uv run poe reload -- -e "sarex_reload_workloads=[{'namespace':'django','deployment':'frontend'}]"
- name: Перекатить нагрузки с изменённой конфигурацией
ansible.builtin.shell:
cmd: >-
{{ compose_cmd }} exec -T k3s-server sh -ec '
kubectl -n {{ item.namespace }} rollout restart deploy/{{ item.deployment }}
kubectl -n {{ item.namespace }} rollout status deploy/{{ item.deployment }} --timeout={{ sarex_reload_timeout }}
'
chdir: "{{ deploy_dir }}"
loop: "{{ sarex_reload_workloads }}"
loop_control:
label: "{{ item.namespace }}/{{ item.deployment }} — {{ item.why | default('правка конфигурации') }}"
changed_when: true
tags: [reload]