Major Database Update Guide
Starting from version 7.1.2, an automatic gate mechanism is in place that blocks the update process if you attempt to upgrade from Grain versions < 6.6.0 to versions >= 7.1.2.
Please note that for versions between 7.0.0 and 7.1.1, this automatic control is absent. Exercise extreme caution and manually verify compatibility when upgrading within this specific version range.
You should not copy & paste commands from this guide, they are provided as an example, but you have to update them to match you current context and database versions.
1. MongoDB
General Description
MongoDB is configured as a StatefulSet with data persistence and supports an automated version upgrade mechanism through Feature Compatibility Version (FCV) management.
New Implemented Features
The ability to configure the Feature Compatibility Version directly from ArgoCD has been added, enabling a controlled and predictable upgrade of feature compatibility.
Update Procedure
Detailed Steps
Phase 1: Preparation
-
Complete database backup
mongodump --uri="mongodb+srv://<user>:<pass>@mongodb-svc:27017/?authSource=admin" \
--out=./backup_pre_upgrade -
Update the chart values.yaml
mongodb:
enabled: true
image:
repository: mongo
tag: "7.0" # New major version
migration:
enabled: true
targetFCV: "7.0" # Set target FCV
Phase 2: Deploy
- Apply changes via ArgoCD
- Synchronize the chart in the desired namespace
- The new StatefulSet will have the new image
Phase 3: Automatic migration
- Migration Job
- A Kubernetes Job is automatically created thanks to the template configuration
- The job executes the command:
mongosh "$MONGO_URI" --eval 'db.adminCommand({setFeatureCompatibilityVersion: "7.0", confirm: true})' - The job has a TTL of 300 seconds after completion (automatic cleanup)
Phase 4: Validation
- Verify the FCV
mongosh mongodb-svc:27017 -u <user> -p <pass> --authenticationDatabase admin \
--eval "db.adminCommand({getParameter: 1, featureCompatibilityVersion: 1})"
Rollback Strategies
If the migration job fails:
-
Quick diagnostics
kubectl logs -l batch.kubernetes.io/job-name=mongodb-migration-job-<hash> -f -
Image rollback
- Return to the previous tag in values.yaml
- Apply the rollback via ArgoCD
- The old StatefulSet will become active again
-
Restore from backup (last resort)
mongorestore --uri="mongodb+srv://<user>:<pass>@mongodb-svc:27017/?authSource=admin" \
./backup_pre_upgrade
Important Notes
- ⚠️ FCV must be incremental: Move between consecutive versions (e.g., 5.0 → 6.0 → 7.0)
- ✅ Idempotent job: Can be re-run without issues
- 📊 The upgrade is zero-downtime for clients once the FCV is set
- 🔄 Job TTL: The job is automatically deleted after 5 minutes from completion
2. PostgreSQL
General Description
PostgreSQL is configured as a StatefulSet with data persistence. Unlike MongoDB, it does not have an automatic compatibility mechanism for major changes and requires a more conservative and manual approach.
Current Configuration Features
- Init Container: Manages automatic data layout migration from
PostgreSQL <18to>=18 - Storage: Supports both traditional layout and with subPath
- Architecture duality: Requires different approaches depending on the target architecture
Major Update Procedure
For non-Power Architectures (x86_64, ARM64)
On non-Power architectures, it is possible to use pgautoupgrade, a tool that automatically performs the upgrade between PostgreSQL major versions using Debian images.
Detailed Steps:
-
Pre-Upgrade Backup
# Access the pod
kubectl exec -it postgres-0 -- /bin/bash
# Export everything
pg_dumpall > /tmp/backup_pre_upgrade.sql
# Extract the backup from the pod
kubectl cp postgres-0:/tmp/backup_pre_upgrade.sql ./backup_pre_upgrade.sql -
Update values.yaml with the pgautoupgrade image
postgres:
enabled: true
image:
repository: pgautoupgrade/pgautoupgrade
tag: "pgautoupgrade-debian-tag"
-
Apply the change via ArgoCD
- ArgoCD will synchronize the chart and Kubernetes automatically recreates the pod
- pgautoupgrade will automatically execute the major version upgrade
- The init container will automatically handle the data layout migration
⚠️ If you need to upgrade multiple major versions using the pgautoupgrade image, you should wait a few moments between updates to ensure the previous migration has completed.
-
Monitor the upgrade process
kubectl logs -f postgres-0This may take several minutes depending on the database size.
-
Post-upgrade validation
kubectl exec -it postgres-0 -- psql -U postgres -c "SELECT version();"
# Verify data integrity
kubectl exec -it postgres-0 -- psql -U postgres -c "SELECT relname FROM pg_class LIMIT 5;"
For Power Architectures (ppc64le)
The pgautoupgrade images are not available for Power. A manual approach is required.
Detailed Steps:
-
Make a complete backup (as above)
-
Update values.yaml with the new version
postgres:
enabled: true
image:
repository: postgres # Official image (supported on Power)
tag: "16-alpine" # New major version -
Apply the change via ArgoCD
- ArgoCD will synchronize the chart and Kubernetes automatically recreates the pod with the new image
- PostgreSQL will detect the change in the data layout
- It will automatically execute the necessary upgrades on first start
- This may take several minutes
-
Monitor the logs
kubectl logs -f postgres-0 -
Post-upgrade validation
kubectl exec -it postgres-0 -- psql -U postgres -c "SELECT version();"
Rollback Strategy
In case of problems during the upgrade:
-
Return to the previous image in values.yaml
postgres:
image:
tag: "15-alpine" # Previous version -
Apply the rollback via ArgoCD
- Kubernetes automatically recreates the pod with the previous version
-
Complete restore from backup (last resort)
# Access the pod
kubectl exec -it postgres-0 -- /bin/bash
# Copy the backup to the pod
kubectl cp ./backup_pre_upgrade.sql postgres-0:/tmp/
# Restore (with database downtime)
psql -U postgres < /tmp/backup_pre_upgrade.sql
Important Notes
- ⚠️ Significant downtime: The upgrade requires database shutdown
- 📦 pgautoupgrade not available for Power: Use official images
- 🔄 Incremental upgrade: Preferably one major version at a time
- 💾 Mandatory backup: Always backup before any upgrade
- 🧹 Init Container: Automatically handles layout migration
- 🔑 Credentials: Must remain consistent before and after the upgrade
3. Redis
General Description
Redis is configured as a simple Deployment (not StatefulSet) without data persistence. Therefore, major version upgrades are very simple and without complications.
Configuration Features
# Minimal deployment, no persistence
kind: Deployment
replicas: 1
containers:
- name: redis
image: redis:7-alpine
ports:
- containerPort: 6379
Update Procedure
Steps:
-
Update values.yaml
redis:
enabled: true
image:
repository: redis
tag: "8-alpine" # New major version -
Apply the change via ArgoCD
- Synchronize the chart
- The old pod will be terminated and a new one will be started
-
Validate the new version
kubectl exec -it redis-<pod-id> -- redis-cli INFO server | grep redis_version
Considerations
- ✅ No backup necessary: Redis is used as a cache, data is not persistent
- ⏱️ Brief downtime: Only the time needed to recreate the pod (seconds)
- 🔄 Rolling update: The Deployment automatically handles the rollout
- 💾 Acceptable cache loss: Clients must be prepared to recache data
- 🧩 Compatibility: Redis maintains good compatibility between consecutive major versions
Rollback (not necessary)
In the unlikely case of issues:
redis:
image:
tag: "7-alpine" # Return to previous version
Recreate the pod with the previous version.
4. RabbitMQ
General Description
RabbitMQ is configured as a StatefulSet with persistence of schema and configuration data. It has an internal compatibility management system that makes major upgrades relatively safe.
Current Configuration Features
- StatefulSet with persistence: Message data and configuration are persistent
- Health checks: Liveness and readiness probes to monitor status
- Management UI: Available on port 15672
- AMQP Protocol: Available on port 5672
- Auto-discovery: Automatic cluster configuration via Kubernetes
Major Update Procedure
Detailed Steps:
-
Pre-upgrade Validation
# Verify cluster status
kubectl exec -it rabbitmq-0 -- rabbitmq-diagnostics status
# Verify active connections
kubectl exec -it rabbitmq-0 -- rabbitmq-diagnostics -q listconnections -
Update values.yaml
rabbitmq:
enabled: true
image:
repository: rabbitmq # Official repository
tag: "3.13-management-alpine" # New major version -
Apply the change via ArgoCD
- Synchronize the chart in the namespace
- RabbitMQ will have a brief downtime during restart
-
Validate the new version
kubectl exec -it rabbitmq-0 -- rabbitmq-diagnostics -q version -
Verify the internal schema
kubectl exec -it rabbitmq-0 -- rabbitmq-diagnostics -q status | grep schema
Automatic Compatibility Management
RabbitMQ automatically manages compatibility between versions:
- Schema Management: RabbitMQ updates the internal schema on first start
- Feature Negotiation: Clients automatically negotiate available features
- Backward Compatibility: Supports clients of different versions at the same time
- Non-breaking Changes: The vast majority of major upgrades are non-breaking
Stability Considerations
- ✅ Automatic compatibility: No additional configuration needed
- 📊 Health Checks: Constantly monitor service health
- 🔄 Persistent Storage: Data is not lost during the upgrade
- ⏱️ Brief downtime: Only during pod recreation
- 👥 Multi-tenancy: Supports connection pooling and client multiplexing
- 🛡️ Transactions: Supports AMQP transactions in all versions
Rollback Strategy
In case of post-upgrade issues:
-
Monitor the logs
kubectl logs -f rabbitmq-0 | grep -i error -
If necessary, return to the previous version
rabbitmq:
image:
tag: "3.12-management-alpine" # Previous version -
RabbitMQ will automatically repeat the schema downgrade
- No manual intervention required
- Persistent storage still contains the data
Important Notes
- ✅ Zero configuration required: RabbitMQ manages everything automatically
- 📈 Scalability: Supports multi-node clusters (future configuration)
- 🔒 Security: Credentials managed via Secrets
- 🎯 Performance: No performance change between consecutive versions
- 📚 Management Plugin: Included in the
rabbitmq:*-management-*image