Reorganize the brownfield repository, remove retired and generated artifacts, harden ignore rules, and record the GitOps/IaC redesign.
3.6 KiB
3.6 KiB
PostgreSQL Migration Design
Goal
Move the current shared PostgreSQL deployment to CloudNativePG and back it with the existing OpenEBS ZFS storage layer.
The target state is a single PostgreSQL cluster managed by CloudNativePG, running one instance on the only worker node, with one shared database service for the apps that already use shared-postgresql.
Current State
- PostgreSQL is currently deployed from chart values in
shared-postgresql/shared-postgresql-values.yaml. - Storage currently uses
local-path. - Apps such as Gitea and Casdoor point at the shared PostgreSQL service.
- There is an init SQL file for bootstrap data in
shared-postgresql/shared-postgresql-init.sql.
Target State
- CloudNativePG manages the PostgreSQL lifecycle.
- Storage comes from the OpenEBS-provided ZFS-backed
StorageClass. - The cluster runs with
instances: 1because there is only one worker node. - Existing app databases remain in the same PostgreSQL cluster.
- A compatibility Kubernetes
Servicepreserves the existing shared database hostname or provides an equivalent stable alias.
Non-Goals
- High availability across multiple nodes.
- Automatic failover.
- Database sharding or splitting apps into separate clusters.
- Changing application-level schemas unless required by migration.
Approach
- Provision or verify the OpenEBS ZFS
StorageClasssuitable for PostgreSQL PVCs. - Deploy CloudNativePG and create one cluster with a single instance.
- Create the required role and database layout for the shared apps.
- Migrate data from the current PostgreSQL instance with a logical dump and restore.
- Cut over workloads to the new service.
- Validate app logins, migrations, and basic read/write behavior.
Migration Plan
Phase 1: Storage
- Confirm the OpenEBS ZFS components are installed and healthy.
- Create a dedicated PostgreSQL
StorageClassfor CNPG. - Use a single PVC for the primary instance.
Phase 2: Database Deployment
- Install CloudNativePG.
- Create a
Clustermanifest with one instance. - Set resource requests and limits close to the current PostgreSQL footprint.
- Mount any required bootstrap SQL through CloudNativePG-supported init methods.
Phase 3: Data Migration
- Quiesce writes on the current PostgreSQL instance.
- Take a logical backup of the existing databases and roles, including globals such as users and grants.
- Restore into the new CloudNativePG cluster.
- Recreate any app-specific users, grants, and schemas that are not captured automatically.
Phase 4: Cutover
- Point app secrets or connection settings at the new CNPG service.
- Restart or roll the dependent workloads.
- Verify each app can connect and operate normally.
Phase 5: Cleanup
- Keep the old deployment available until validation completes.
- Remove the old PostgreSQL deployment only after the new cluster is confirmed healthy.
Risks
- OpenEBS ZFS must be healthy before PostgreSQL migration starts.
- Single-node deployment means node failure still causes downtime.
- Logical restore can miss permissions or extension details if the old instance has custom setup.
- Existing app passwords should be preserved or rotated carefully during cutover.
Validation
- CNPG cluster reports healthy.
- PVC is bound on the ZFS-backed storage class.
- Existing apps can connect using the shared PostgreSQL service.
- Basic read/write checks succeed for each app database.
- Restarting the PostgreSQL pod does not lose data.
Rollback
- If restore or validation fails, keep the current PostgreSQL deployment active and point apps back to the old service.
- Do not delete the old PVC or deployment until the new cluster passes validation.