Оба пода уходили в рестарты, причины разные и обе — мои.
1. bim-api:
psycopg2.OperationalError: FATAL: database "bimapidb" does not exist
Имя базы у приложения ЗАХАРДКОЖЕНО и переменной не задаётся — в
entrypoint_api.sh (yoyo apply ... /bimapidb) и в models/database.py
(PooledPostgresqlExtDatabase('bimapidb', ...)). Переменной DB_NAME в
коде нет вообще, я подставлял её впустую. Запись в contour.databases
переименована bim_db -> bimapidb, DB_NAME из vault-шаблона убран.
Пустая bim_db остаётся в СУБД: бутстрап умеет только создавать. Данных
в ней нет — проверено, ноль таблиц.
2. bim-worker:
Exception: ENV_VARIABLE NOT SET: GOOGLE_APPLICATION_CREDENTIALS
settings.py делает check_settings(): проходит по ВСЕМ ключам ENV_FIELDS
и падает на первом незаданном, до проверки флагов дело не доходит.
Убирать переменную вместе с Google-хранилищем было нельзя. Возвращена;
файла по этому пути нет и не нужно — при FEATURE_ENABLE_GCLOUD=false
его никто не открывает, важно лишь наличие самой переменной.
Отсюда правило для этого приложения: набор переменных должен повторять
apps/bim/dsinv целиком, образ там тот же (870965d1...). Менять можно
только значения — адреса, бакет, брокер, — но не состав.
182 lines
8.1 KiB
YAML
182 lines
8.1 KiB
YAML
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
|
||
# Имя ОБЯЗАНО быть bimapidb: в aero/bimbackend оно захардкожено и
|
||
# переменной не задаётся — и в entrypoint_api.sh (yoyo apply
|
||
# ... /bimapidb), и в models/database.py (PooledPostgresqlExtDatabase
|
||
# ('bimapidb', ...)). С любым другим именем приложение падает на
|
||
# старте: FATAL: database "bimapidb" does not exist.
|
||
- name: bimapidb
|
||
user: bim
|
||
passwordKey: bim
|
||
extensions: []
|
||
restoreFromDump: false
|
||
- name: workspace_db
|
||
user: workspace
|
||
passwordKey: workspace
|
||
extensions: []
|
||
restoreFromDump: false
|