Externalizar PostgreSQL¶
Seguir el capítulo oficial PostgreSQL 10 upgrade — On-cluster. Esta página resume el procedimiento con los manifiestos de este repositorio. Runbook completo: docs/runbooks/01-externalize-postgresql.md (Git Bash: docs/runbooks/01-bis-externalize-postgresql-windows.md).
Variables¶
export THREESCALE_NAMESPACE=3scale
export OPERATOR_NAMESPACE=3scale
export DB_NAMESPACE=3scale-db
oc project "$THREESCALE_NAMESPACE"
Capturar las réplicas antes de escalar a 0 (lista completa en el runbook).
1. Escalar 3scale y el operador 3scale¶
oc scale deployment threescale-operator-controller-manager-v2 -n "$OPERATOR_NAMESPACE" --replicas=0
oc scale deployment/{system-memcache,zync-database,apicast-production,apicast-staging,backend-cron,backend-listener,backend-worker,backend-redis,system-app,system-redis,system-sidekiq,system-searchd,zync,zync-que} --replicas=0
Dejar system-postgresql en 1 réplica.
2. Dump¶
POSTGRES_POD=$(oc get pods -l deployment=system-postgresql -o jsonpath='{.items[0].metadata.name}')
oc exec "$POSTGRES_POD" -- pg_dump -U system -d system -F c -b -v -f /tmp/db_dump.backup
oc cp "$POSTGRES_POD":/tmp/db_dump.backup ./db_dump.backup
3. Desplegar PostgreSQL 15¶
El ExternalSecret system-database en 3scale-db escribe DB_USER y DB_PASSWORD desde Vault. Completar antes Vault y External Secrets y esperar ese ExternalSecret en SecretSynced. No crear el Secret con oc create secret.
oc get externalsecret system-database -n "$DB_NAMESPACE"
oc apply -k kustomize/bases/postgresql -n "$DB_NAMESPACE"
Comprobar que las claves del Secret no estén vacías antes de que el pod inicialice el PVC.
Desplegar solo PostgreSQL 15 primero. No aplicar aún el overlay lab completo. Ese overlay también crea Redis 7. Esperar system-postgresql-external en 1/1.
4. Restore¶
oc cp ./db_dump.backup "$(oc get pods -n "$DB_NAMESPACE" -l deployment=system-postgresql-external -o jsonpath='{.items[0].metadata.name}')":/tmp -n "$DB_NAMESPACE"
oc rsh -n "$DB_NAMESPACE" "$(oc get pods -n "$DB_NAMESPACE" -l deployment=system-postgresql-external -o jsonpath='{.items[0].metadata.name}')" \
bash -c 'pg_restore -v -h localhost -U postgres -d system /tmp/db_dump.backup'
El aviso schema "public" already exists es esperado.
GRANT CREATE en schema public¶
PostgreSQL 15 no concede CREATE en el schema public al usuario de la aplicación. Sin este paso, el Job system-app-pre falla en el salto a 2.16 con permission denied for schema public.
oc rsh -n "$DB_NAMESPACE" "$(oc get pods -n "$DB_NAMESPACE" -l deployment=system-postgresql-external -o jsonpath='{.items[0].metadata.name}')" \
psql -U postgres -d system -c 'GRANT USAGE, CREATE ON SCHEMA public TO system; ALTER SCHEMA public OWNER TO system;'
5. Secret de conexión y APIManager¶
oc apply -k kustomize/overlays/lab-vault-components
APIMANAGER_NAME=$(oc get apimanager -n "$THREESCALE_NAMESPACE" -o jsonpath='{.items[0].metadata.name}')
oc patch apimanager "$APIMANAGER_NAME" -n "$THREESCALE_NAMESPACE" --type=merge \
-p '{"spec": {"externalComponents": {"system": {"database": true}}}}'
El ExternalSecret escribe URL con mergePolicy: Merge. No parchear ese Secret a mano.
Eso desconecta el reconcile del operador 3scale sobre el PostgreSQL embebido y su PVC.
6. Subir y validar¶
Volver a subir Redis embebido (backend-redis, system-redis) antes del runbook de Redis. Restaurar el resto de réplicas. El operador no sube system-app ni system-sidekiq desde 0; escalar esos dos a mano. Luego validar portales y APIs.
Escalar system-postgresql embebido a 0. Conservar su Deployment, Service y PVC hasta que system-app-pre termine bien en 2.16. Borrarlos elimina el camino de rollback.
No commitear secrets ni dumps
No commitear archivos *-secret.yaml, *.backup ni *.rdb.