apiVersion: helm.toolkit.fluxcd.io/v2 kind: HelmRelease metadata: name: postgresql namespace: postgresql spec: interval: 2m # Разворачиваем пустой инстанс: базы создаются с нуля, дампы не # восстанавливаются. Поэтому таймауты обычные, а не двухчасовые как в # yc-k8s-test — там они заданы под restoreFromDump. # # 10 минут, а не 20: таймаут — это ещё и цена одной неудачной итерации. # Пока стояло 20, цикл «install → таймаут → откат → install» занимал по # 20 минут на круг, и правка, приехавшая в середине круга, подхватывалась # только на следующем. Здоровый инстанс поднимается примерно за две минуты, # так что 10 — с большим запасом. timeout: 10m install: timeout: 10m remediation: retries: 3 upgrade: timeout: 10m remediation: retries: 3 # Снимаем nodeSelector, который чарт ставит по умолчанию. # # В дефолтах чарта (primary.nodeSelector) прописано dedicated: sts — расчёт на # кластер с выделенным пулом нод под StatefulSet'ы. В контуре aero таких нод # нет, все три равнозначны, и под навсегда повисал в Pending: # 0/3 nodes are available: 3 node(s) didn't match Pod's node affinity/selector # а следом застревал PVC, потому что у local-path режим WaitForFirstConsumer # и том создаётся только после планирования пода. # # Через values это не снять: Helm сливает карты по ключам, поэтому и {}, и # любая другая метка оставят dedicated: sts на месте. В yc-k8s-test дефолт не # убирают, а перекрывают на dedicated: db — там выделенные ноды есть. # Тут остаётся убрать ключ из уже отрендеренного манифеста. # # Tolerations чарта не трогаем: они разрешают taint dedicated=sts, которого на # наших нодах нет, и ни на что не влияют. postRenderers: - kustomize: patches: - target: kind: StatefulSet name: postgresql patch: | - op: remove path: /spec/template/spec/nodeSelector values: global: security: allowInsecureImages: true defaultStorageClass: local-path imagePullSecrets: - regcred postgresql: auth: # Пусто осознанно: пользователя и базу заводит не чарт-бутстрап # bitnami, а contour-логика ниже (contour.databases). Оставь здесь # значения — получишь лишнюю базу-пустышку. username: "" database: "" secretKeys: userPasswordKey: "postgres-password" auth: username: "" database: "" secretKeys: userPasswordKey: "postgres-password" image: registry: cr.yandex/crp3ccidau046kdj8g9q repository: contour/postgresql tag: 17.0.7 pullPolicy: IfNotPresent metrics: enabled: false prometheusRule: enabled: false primary: # Токен ServiceAccount нужен vault-agent'у для логина в Vault. automountServiceAccountToken: true containerSecurityContext: readOnlyRootFilesystem: false persistence: storageClass: local-path size: 20Gi # В yc-k8s-test здесь nodeSelector/tolerations dedicated=db. В контуре # aero выделенных под БД нод нет — все три равнозначны, ограничивать # планировщик нечем и незачем. customLivenessProbe: exec: command: - /bin/sh - -c - exec pg_isready -U "postgres" -d postgres -h 127.0.0.1 -p 5432 initialDelaySeconds: 30 periodSeconds: 10 timeoutSeconds: 5 successThreshold: 1 failureThreshold: 6 customReadinessProbe: exec: command: - /bin/sh - -c - exec pg_isready -U "postgres" -d postgres -h 127.0.0.1 -p 5432 initialDelaySeconds: 5 periodSeconds: 10 timeoutSeconds: 5 successThreshold: 1 failureThreshold: 6 customStartupProbe: exec: command: - /bin/sh - -c - exec pg_isready -U "postgres" -d postgres -h 127.0.0.1 -p 5432 initialDelaySeconds: 30 periodSeconds: 10 timeoutSeconds: 5 successThreshold: 1 failureThreshold: 6 # contour-логика: создаёт роли, базы и расширения по списку ниже, пароли # берёт из Vault через vault-agent-injector. contour: enabled: true adminUser: "postgres" vault: enabled: true role: postgresql authPath: auth/kubernetes # Пароль администратора. secretPath: secrets/data/postgresql/admin secretKey: postgres-password # Пароли пользователей баз: ключи внутри секрета сопоставляются с # passwordKey каждой базы. Чарт требует этот путь при vault.enabled. # Секрет кладёт ansible (роль sarex_stack, vault_app_secrets). usersSecretPath: secrets/data/postgresql/users # timescaledb включён заранее, хотя нашим четырём базам он не нужен: # shared_preload_libraries читается только при старте, и добавить его # позже — значит перезапустить СУБД. Сервисы, которым он понадобится # (issues, subscriptions, system-log), уже есть в списке на перенос. sharedPreloadLibraries: "timescaledb,pg_stat_statements" # Набор баз повторяет то, что сейчас провижинит postgres-init в # docker-compose.yaml, — контур переезжает в k3s тем же составом. # passwordKey должен совпадать с ключом в секрете Vault # secrets/postgresql/users. databases: - name: sarex_db user: django passwordKey: django extensions: - ltree restoreFromDump: false - name: workflow_db user: processing passwordKey: processing # Роль processing не суперпользователь, а её миграции делают # CREATE EXTENSION — поэтому расширения создаёт бутстрап заранее. extensions: - uuid-ossp - ltree - hstore restoreFromDump: false - name: bim_db user: bim passwordKey: bim extensions: [] restoreFromDump: false - name: workspace_db user: workspace passwordKey: workspace extensions: [] restoreFromDump: false