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¶
DB_USER=$(oc get secret system-database -n "$THREESCALE_NAMESPACE" -o jsonpath='{.data.DB_USER}' | base64 -d)
DB_PASSWORD=$(oc get secret system-database -n "$THREESCALE_NAMESPACE" -o jsonpath='{.data.DB_PASSWORD}' | base64 -d)
oc create namespace "$DB_NAMESPACE" --dry-run=client -o yaml | oc apply -f -
oc create secret generic system-database \
--from-literal=DB_USER="$DB_USER" \
--from-literal=DB_PASSWORD="$DB_PASSWORD" \
-n "$DB_NAMESPACE"
oc apply -k kustomize/bases/postgresql -n "$DB_NAMESPACE"
Comprobar que DB_USER y DB_PASSWORD no estén vacíos 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. Parchear el secret y el APIManager¶
oc get secret system-database -n "$THREESCALE_NAMESPACE" -o yaml > system-database-secret.yaml
DB_URL="postgresql://${DB_USER}:${DB_PASSWORD}@system-postgresql-service.${DB_NAMESPACE}.svc.cluster.local/system"
oc patch secret system-database -n "$THREESCALE_NAMESPACE" -p "{\"stringData\":{\"URL\":\"$DB_URL\"}}"
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}}}}'
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. Luego validar portales y APIs.
Tras confirmar los datos, borrar el Deployment, PVC y Service de PostgreSQL embebido.
No commitear secrets ni dumps
No commitear archivos *-secret.yaml, *.backup ni *.rdb.