DEVOPS-117: чарт on-premise 3.0 — Nanabush Player, секреты в Secret, валидация values

Актуализация чарта по продовому .helm из HRBOX.

Nanabush Player перенесён из прода и упрощён под one-release-топологию
on-premise: без карт env/ci_dc, но с сохранёнными инвариантами (audience =
https://<host>, basePath отдельно от aud, allowlist обратного канала только
на внутрикластерный web, метрики на непубликуемом порту). Выделенного
поддомена в on-premise нет, поэтому плеер монтируется на основной домен под
/nanabush-player. Три переключателя для аварийного отката сохранены.

Из прода также перенесены: пул конвертации видео, PodDisruptionBudget для
web, OpenTelemetry-сайдкар, assetlinks, набор location в nginx (/healthz,
/health-check, потоковый /api/v1/integration/commit, /ai/, sw.js, шрифты).
Версии образов подтянуты к продовым.

Приведение чарта в порядок: все образы в блоке image, imagePullSecrets в
настройках, девять одинаковых define ресурсов заменены одним хелпером,
удалено ~100 строк мёртвого кода в _helpers.tpl, пароли и ключи уехали в
Secret и читаются через secretKeyRef, добавлены 00-validate.yaml и NOTES.txt.

Исправлено в 2.x:
- SERVICES_INTERNAL_SECRET имел захардкоженное значение по умолчанию, то есть
  все установки, где его не заполнили, работали на одном секрете межсервисной
  аутентификации;
- cluster.domain игнорировался: маршруты кластера NATS были захардкожены на
  cluster.local;
- CLUSTER_ADVERTISE без сегмента svc — ноды NATS объявляли соседям
  недостижимый адрес;
- nats.replicas и nats.cluster.replicas задавались независимо, при
  расхождении часть нод не входила в кластер;
- пробы web проверяли только TCP-порт 9000, поэтому под с неработающим PHP
  считался готовым;
- внутренние URL были захардкожены строками hrbox-* и молча ломались при
  nameOverride.

Имена объектов и селекторы Deployment не менялись — обновление 2.x -> 3.0 не
пересоздаёт объекты. Переехавшие ключи values.yaml чарт распознаёт и
останавливает установку с подсказкой; порядок перехода — в CHANGELOG.md.

Проверено: helm lint чистый; отрендерены 4 конфигурации (дефолт, всё
включено, плеер и инфра выключены, nameOverride); структурная проверка
рендера без замечаний; 20 негативных сценариев срабатывают с ожидаемыми
сообщениями; реалистичный values.yaml из 2.x последовательно ловится всеми
шестью guard'ами.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-02 16:37:42 +06:00
co-authored by Claude Opus 5
parent 6363382f09
commit efc506e5de
35 changed files with 3150 additions and 1118 deletions
+35 -111
View File
@@ -1,119 +1,43 @@
{{- define "app_resources" }}
resources:
requests:
memory: {{ .Values.resources.app.requests.memory | quote }}
cpu: {{ .Values.resources.app.requests.cpu | quote }}
ephemeral-storage: {{ .Values.resources.app.requests.ephemeralStorage | quote }}
limits:
memory: {{ .Values.resources.app.limits.memory | quote }}
cpu: {{ .Values.resources.app.limits.cpu | quote }}
ephemeral-storage: {{ .Values.resources.app.limits.ephemeralStorage | quote }}
{{- end }}
{{/*
============================================================================
resources: для контейнера
============================================================================
{{- define "nginx_resources" }}
resources:
requests:
memory: {{ .Values.resources.nginx.requests.memory | quote }}
cpu: {{ .Values.resources.nginx.requests.cpu | quote }}
ephemeral-storage: {{ .Values.resources.nginx.requests.ephemeralStorage | quote }}
limits:
memory: {{ .Values.resources.nginx.limits.memory | quote }}
cpu: {{ .Values.resources.nginx.limits.cpu | quote }}
ephemeral-storage: {{ .Values.resources.nginx.limits.ephemeralStorage | quote }}
{{- end }}
В чарте 2.x на каждый компонент был отдельный define из восьми одинаковых
строк. Здесь один хелпер, который читает resources.<компонент> из values.yaml.
Незаданные поля просто не рендерятся, поэтому компоненту можно указать,
например, только requests.
{{- define "worker_resources" }}
Usage:
{{- include "hrbox.resources" (dict "ctx" . "component" "app") | indent 10 }}
*/}}
{{- define "hrbox.resources" -}}
{{- $r := index .ctx.Values.resources .component -}}
{{- if $r }}
resources:
{{- with $r.requests }}
requests:
memory: {{ .Values.resources.worker.requests.memory | quote }}
cpu: {{ .Values.resources.worker.requests.cpu | quote }}
ephemeral-storage: {{ .Values.resources.worker.requests.ephemeralStorage | quote }}
limits:
memory: {{ .Values.resources.worker.limits.memory | quote }}
cpu: {{ .Values.resources.worker.limits.cpu | quote }}
ephemeral-storage: {{ .Values.resources.worker.limits.ephemeralStorage | quote }}
{{- with .cpu }}
cpu: {{ . | quote }}
{{- end }}
{{- with .memory }}
memory: {{ . | quote }}
{{- end }}
{{- with .ephemeralStorage }}
ephemeral-storage: {{ . | quote }}
{{- end }}
{{- end }}
{{- define "websocket_resources" }}
resources:
requests:
memory: {{ .Values.resources.websocket.requests.memory | quote }}
cpu: {{ .Values.resources.websocket.requests.cpu | quote }}
ephemeral-storage: {{ .Values.resources.websocket.requests.ephemeralStorage | quote }}
{{- with $r.limits }}
limits:
memory: {{ .Values.resources.websocket.limits.memory | quote }}
cpu: {{ .Values.resources.websocket.limits.cpu | quote }}
ephemeral-storage: {{ .Values.resources.websocket.limits.ephemeralStorage | quote }}
{{- with .cpu }}
cpu: {{ . | quote }}
{{- end }}
{{- with .memory }}
memory: {{ . | quote }}
{{- end }}
{{- with .ephemeralStorage }}
ephemeral-storage: {{ . | quote }}
{{- end }}
{{- end }}
{{- define "geonames_resources" }}
resources:
requests:
memory: {{ .Values.resources.geonames.requests.memory | quote }}
cpu: {{ .Values.resources.geonames.requests.cpu | quote }}
ephemeral-storage: {{ .Values.resources.geonames.requests.ephemeralStorage | quote }}
limits:
memory: {{ .Values.resources.geonames.limits.memory | quote }}
cpu: {{ .Values.resources.geonames.limits.cpu | quote }}
ephemeral-storage: {{ .Values.resources.geonames.limits.ephemeralStorage | quote }}
{{- end }}
{{- define "conductor_resources" }}
resources:
requests:
memory: {{ .Values.resources.conductor.requests.memory | quote }}
cpu: {{ .Values.resources.conductor.requests.cpu | quote }}
ephemeral-storage: {{ .Values.resources.conductor.requests.ephemeralStorage | quote }}
limits:
memory: {{ .Values.resources.conductor.limits.memory | quote }}
cpu: {{ .Values.resources.conductor.limits.cpu | quote }}
ephemeral-storage: {{ .Values.resources.conductor.limits.ephemeralStorage | quote }}
{{- end }}
{{- define "jobs_resources" }}
resources:
requests:
memory: {{ .Values.resources.jobs.requests.memory | quote }}
cpu: {{ .Values.resources.jobs.requests.cpu | quote }}
ephemeral-storage: {{ .Values.resources.jobs.requests.ephemeralStorage | quote }}
limits:
memory: {{ .Values.resources.jobs.limits.memory | quote }}
cpu: {{ .Values.resources.jobs.limits.cpu | quote }}
ephemeral-storage: {{ .Values.resources.jobs.limits.ephemeralStorage | quote }}
{{- end }}
{{- define "goworker_resources" }}
resources:
requests:
memory: {{ .Values.resources.goworker.requests.memory | quote }}
cpu: {{ .Values.resources.goworker.requests.cpu | quote }}
ephemeral-storage: {{ .Values.resources.goworker.requests.ephemeralStorage | quote }}
limits:
memory: {{ .Values.resources.goworker.limits.memory | quote }}
cpu: {{ .Values.resources.goworker.limits.cpu | quote }}
ephemeral-storage: {{ .Values.resources.goworker.limits.ephemeralStorage | quote }}
{{- end }}
{{- define "kedoca_resources" }}
resources:
requests:
memory: {{ .Values.resources.kedoca.requests.memory | quote }}
cpu: {{ .Values.resources.kedoca.requests.cpu | quote }}
ephemeral-storage: {{ .Values.resources.kedoca.requests.ephemeralStorage | quote }}
limits:
memory: {{ .Values.resources.kedoca.limits.memory | quote }}
cpu: {{ .Values.resources.kedoca.limits.cpu | quote }}
ephemeral-storage: {{ .Values.resources.kedoca.limits.ephemeralStorage | quote }}
{{- end }}
{{- define "chatbox_resources" }}
resources:
requests:
memory: {{ .Values.resources.chatbox.requests.memory | quote }}
cpu: {{ .Values.resources.chatbox.requests.cpu | quote }}
ephemeral-storage: {{ .Values.resources.chatbox.requests.ephemeralStorage | quote }}
limits:
memory: {{ .Values.resources.chatbox.limits.memory | quote }}
cpu: {{ .Values.resources.chatbox.limits.cpu | quote }}
ephemeral-storage: {{ .Values.resources.chatbox.limits.ephemeralStorage | quote }}
{{- end }}
{{- end -}}