--- Бакет --- В 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`. По умолчанию выключено: перезапуск подов посреди обычного деплоя происходить сам не должен.
42 lines
3.0 KiB
YAML
42 lines
3.0 KiB
YAML
---
|
||
# Перекат нагрузок, которые не перезапускаются сами при правке конфигурации.
|
||
#
|
||
# ЗАЧЕМ ЭТО ОТДЕЛЬНАЯ ЗАДАЧА. 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]
|