restore-backup
Restores applications and data from Velero backups with proper configuration, validation, and verification.
When & Why to Use This Skill
This Claude skill automates the complex process of restoring Kubernetes applications and data using Velero and OADP. It streamlines disaster recovery and infrastructure management by handling configuration validation, resource mapping, and post-restore verification, ensuring high availability and data integrity in cloud-native environments.
Use Cases
- Disaster Recovery: Rapidly recover critical services and persistent data after accidental deletion or cluster-wide failures to minimize downtime.
- Application Migration: Seamlessly move workloads between different Kubernetes clusters or cloud regions while preserving state and configuration.
- Environment Cloning: Replicate production environments into development or staging namespaces for safe testing, debugging, and quality assurance.
- Backup Integrity Testing: Periodically verify the validity of backups by performing automated test restores of specific resources or Persistent Volume Claims (PVCs).
- Cross-Region Recovery: Utilize Velero's built-in Data Mover to restore applications across different geographic locations for enhanced business continuity.
| name | restore-backup |
|---|---|
| description | Restores applications and data from Velero backups with proper configuration, validation, and verification. |
Restore from OADP/Velero Backup
This skill helps you restore applications and data from existing backups with proper configuration and validation.
When to Use This Skill
- Recovering from accidental deletion
- Migrating applications to new clusters
- Cloning applications to different namespaces
- Disaster recovery scenarios
- Testing backup validity
What This Skill Does
- Validates Backup: Ensures backup exists and is complete
- Plans Restore: Determines restore strategy
- Prepares Environment: Checks for conflicts
- Executes Restore: Creates restore resource
- Monitors Progress: Watches restore completion
- Verifies: Confirms application restored correctly
How to Use
Restore backup myapp-backup-20240315
Restore backup myapp-backup to namespace myapp-dev
Restore only PVCs from backup myapp-backup
Examples
Example 1: Simple Restore
User: "Restore backup wordpress-backup-20240315"
Actions:
- Verify backup exists and is complete
- Check if namespace exists
- Create restore
- Monitor completion
- Verify application
# Verify backup
velero backup get wordpress-backup-20240315
# Create restore
velero restore create wordpress-restore-20240315 \
--from-backup wordpress-backup-20240315 \
--wait
# Verify
oc get all -n wordpress
Example 2: Cross-Namespace Restore
User: "Restore backup prod-app to namespace dev-app"
apiVersion: velero.io/v1
kind: Restore
metadata:
name: prod-to-dev-restore
namespace: openshift-adp
spec:
backupName: prod-app-backup
namespaceMapping:
prod-app: dev-app
restorePVs: true
Example 3: Partial Restore
User: "Restore only deployments and services from backup myapp"
apiVersion: velero.io/v1
kind: Restore
metadata:
name: partial-restore
namespace: openshift-adp
spec:
backupName: myapp-backup
includedResources:
- deployments
- services
excludedResources:
- secrets
- configmaps
Example 4: Selective Restore
User: "Restore only resources with label app=frontend"
apiVersion: velero.io/v1
kind: Restore
metadata:
name: frontend-restore
namespace: openshift-adp
spec:
backupName: full-backup
labelSelector:
matchLabels:
app: frontend
Example 5: Velero Built-in Data Mover Restore (Cross-Region)
User: "Restore backup with Velero's built-in Data Mover from different region"
Note: Data Mover is now built-in to Velero and handles volume data migration natively.
Actions:
Verify target BSL configured:
oc get backupstoragelocations -n openshift-adpCreate restore with Data Mover:
apiVersion: velero.io/v1 kind: Restore metadata: name: datamover-restore-20240315 namespace: openshift-adp annotations: oadp.openshift.io/target-bsl: secondary-bsl # BSL in target region spec: backupName: app-datamover-backup-20240315 includedNamespaces: - myapp restorePVs: trueMonitor Data Mover restore:
# Watch Velero Data Mover operations oc get datadownloads -A -w # Check PVCs being created oc get pvc -n myapp -w # Monitor Velero logs for data mover activity oc logs -n openshift-adp deployment/velero -f | grep -i datamover
Expected Behavior:
- Velero's built-in Data Mover creates DataDownload CRs for each PVC
- Empty PVCs created first
- Data transferred from Kopia backup repository to PVCs (or Restic for OADP 1.3)
- Application pods start after PVCs populated
Example 6: Cross-BSL/Cross-Region Restore
User: "Restore from backup in different region/BSL"
Actions:
Sync backups from source BSL:
# Velero automatically syncs backups from all BSLs velero backup get # Verify backup from secondary BSL is visible velero backup describe offsite-backup-20240315 | grep "Storage Location"Create restore with BSL mapping:
apiVersion: velero.io/v1 kind: Restore metadata: name: cross-region-restore namespace: openshift-adp annotations: oadp.openshift.io/source-bsl: secondary-bsl # Backup from this BSL oadp.openshift.io/target-region: us-east-1 # Target region oadp.openshift.io/target-storage-class: gp3 # Storage class in target region spec: backupName: offsite-backup-20240315 includedNamespaces: - critical-app restorePVs: true volumeSnapshotLocations: - aws-us-east-1-vsl # VSL in target regionHandle cross-region volume snapshots:
# For snapshot-based backups, Data Mover may be required # Or manually copy snapshots between regions using cloud provider tools # Check if snapshots need to be copied velero backup describe offsite-backup-20240315 --details | grep VolumeSnapshot
Use Cases:
- Disaster recovery to different region
- Migration between clusters in different regions
- Testing restore in alternate location
Example 7: OpenShift Virtualization VM Restore
User: "Restore VirtualMachine from backup"
Actions:
Verify VM backup:
velero backup describe vm-backup-20240315 --detailsCreate VM restore:
apiVersion: velero.io/v1 kind: Restore metadata: name: vm-restore-20240315 namespace: openshift-adp annotations: oadp.openshift.io/target-storage-class: ocs-storagecluster-ceph-rbd # Target storage class spec: backupName: vm-backup-20240315 includedNamespaces: - vm-namespace includedResources: - virtualmachines.kubevirt.io - virtualmachineinstances.kubevirt.io - datavolumes.cdi.kubevirt.io - persistentvolumeclaims - volumesnapshots.snapshot.storage.k8s.io restorePVs: trueVerify VM restore:
# Check VM restored oc get vms -n vm-namespace # Check DataVolumes oc get datavolumes -n vm-namespace # Check PVCs bound oc get pvc -n vm-namespace # Check VM status virtctl status vm-name -n vm-namespaceStart VM if needed:
# VMs are restored in stopped state by default virtctl start vm-name -n vm-namespace
Success Indicators:
- VirtualMachine CR restored
- DataVolumes recreated
- PVCs bound and populated
- VM can be started successfully
Post-Restore Actions:
- Verify VM disk integrity
- Check VM network configuration
- Test VM functionality
- Update any cluster-specific settings
Example 8: etcd Restore Reference
Note: etcd restore is a cluster-level disaster recovery operation performed separately from OADP application restores.
etcd Restore (Manual Process):
# On each master node - restore etcd from snapshot
oc debug node/master-0
chroot /host
# Stop static pods
sudo mv /etc/kubernetes/manifests /etc/kubernetes/manifests.backup
# Restore etcd snapshot
sudo -E /usr/local/bin/cluster-restore.sh /path/to/etcd-snapshot
# Restart services
sudo systemctl restart kubelet.service
sudo systemctl restart crio.service
# Restore static pods
sudo mv /etc/kubernetes/manifests.backup /etc/kubernetes/manifests
exit
Force etcd Redeployment:
# After restoring on all masters
oc patch etcd cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$(date --rfc-3339=ns)"'"}}' --type=merge
Restore OADP Backup of etcd Resources (Optional):
After etcd data is restored, restore etcd-related resources:
# Restore etcd namespace resources
velero restore create etcd-resources-restore \
--from-backup etcd-resources-backup \
--include-namespaces openshift-etcd
Important Notes:
- etcd restore is destructive - only use as last resort
- Follow official OpenShift disaster recovery documentation
- Test etcd restore procedure in non-production first
- Ensure all master nodes are processed
- Cluster may be unavailable during etcd restore
Integration with OADP:
- Use OADP for application-level backups
- Use etcd snapshots for control plane disaster recovery
- Combine both for complete cluster recovery capability
Restore Strategies
1. In-Place Restore
Restore to original namespace (requires deletion first)
# Delete namespace
oc delete namespace myapp
# Restore
velero restore create myapp-restore \
--from-backup myapp-backup \
--wait
2. Cross-Namespace Restore
Restore to different namespace
# Create target namespace
oc create namespace myapp-dev
# Restore with mapping
velero restore create myapp-clone \
--from-backup myapp-backup \
--namespace-mappings myapp:myapp-dev \
--wait
3. Cross-Cluster Restore
Restore to different cluster
# On target cluster with same BSL configured
velero restore create cross-cluster-restore \
--from-backup myapp-backup \
--wait
4. Partial Restore
Restore specific resources
# Restore only PVCs
velero restore create pvc-only-restore \
--from-backup myapp-backup \
--include-resources persistentvolumeclaims \
--wait
Handling Conflicts
Existing Resources
Strategy 1: Delete first
oc delete namespace myapp
velero restore create --from-backup myapp-backup
Strategy 2: Update existing
velero restore create myapp-restore \
--from-backup myapp-backup \
--existing-resource-policy=update
Strategy 3: Skip existing
# Default behavior - skip existing resources
velero restore create --from-backup myapp-backup
PVC Binding Issues
# Map storage classes
velero restore create myapp-restore \
--from-backup myapp-backup \
--storage-class-mappings old-sc:new-sc
Restore with Hooks
Post-Restore Hooks
apiVersion: velero.io/v1
kind: Restore
metadata:
name: db-restore-with-hooks
namespace: openshift-adp
spec:
backupName: database-backup
hooks:
resources:
- name: db-post-restore
includedNamespaces:
- database
labelSelector:
matchLabels:
app: postgres
postHooks:
- exec:
container: postgres
command:
- /bin/bash
- -c
- |
# Wait for DB ready
until pg_isready; do sleep 1; done
# Run migrations
psql -U postgres -d mydb -f /migrations/latest.sql
execTimeout: 5m
waitTimeout: 10m
Monitoring Restore
Real-time Monitoring
# Watch restore status
watch "oc get restore myapp-restore -n openshift-adp"
# Stream logs
velero restore logs myapp-restore -f
# Detailed status
velero restore describe myapp-restore --details
Checking Progress
# Get restore status
velero restore get
# Check resource creation
oc get all -n myapp --watch
# Check PVC binding
oc get pvc -n myapp --watch
# Check pod status
oc get pods -n myapp --watch
Verification
Post-Restore Checklist
# 1. Check restore completed
velero restore describe myapp-restore | grep "Phase:"
# 2. Verify all pods running
oc get pods -n myapp
# 3. Verify PVCs bound
oc get pvc -n myapp
# 4. Check services
oc get svc -n myapp
# 5. Test application
curl http://myapp-route.example.com
# 6. Verify data integrity
oc exec -n myapp deployment/myapp -- /check-data.sh
Comparing Backup vs Restore
# Resources in backup
velero backup describe myapp-backup --details | \
grep "Resource List" -A 100
# Resources after restore
oc api-resources --verbs=list --namespaced -o name | \
xargs -n 1 oc get --show-kind --ignore-not-found -n myapp
Troubleshooting
Restore Stuck
# Check restore logs
velero restore logs myapp-restore
# Check for errors
velero restore describe myapp-restore | grep -i error
# Check Velero logs
oc logs -n openshift-adp deployment/velero
PVCs Not Binding
# Check VolumeSnapshots
oc get volumesnapshots -n myapp
# Check storage class
oc get storageclass
# Describe PVC
oc describe pvc <pvc-name> -n myapp
# Check for events
oc get events -n myapp --sort-by='.lastTimestamp'
Partial Restore
# Check what was restored
velero restore describe myapp-restore --details
# Check for warnings
velero restore logs myapp-restore | grep -i warning
# Check skipped resources
velero restore describe myapp-restore | grep -A 20 "Warnings:"
Best Practices
- Verify backup first: Ensure backup completed successfully
- Plan for conflicts: Know how to handle existing resources
- Test in non-prod: Verify restore works before DR scenario
- Monitor closely: Watch restore progress in real-time
- Verify thoroughly: Check all aspects of restored app
- Document process: Keep runbooks for DR scenarios
- Time estimates: Know how long restores take
- Storage class mapping: Plan for cross-cluster restores
- Network policies: May need updating after restore
- Secrets rotation: Consider rotating secrets after restore
Common Scenarios
Disaster Recovery
#!/bin/bash
# DR restore script
BACKUP_NAME=$1
TARGET_NAMESPACE=$2
echo "Starting DR restore from $BACKUP_NAME to $TARGET_NAMESPACE"
# 1. Verify backup
velero backup get $BACKUP_NAME || exit 1
# 2. Create namespace if needed
oc get namespace $TARGET_NAMESPACE || \
oc create namespace $TARGET_NAMESPACE
# 3. Create restore
velero restore create dr-restore-$(date +%s) \
--from-backup $BACKUP_NAME \
--namespace-mappings source-ns:$TARGET_NAMESPACE \
--wait || exit 1
# 4. Verify
echo "Verifying restore..."
oc wait --for=condition=ready pod \
-l app=$APP_LABEL \
-n $TARGET_NAMESPACE \
--timeout=10m
echo "DR restore completed successfully"
Application Migration
# Migrate app to new cluster
# On source cluster - create backup
velero backup create app-migration \
--include-namespaces myapp \
--wait
# On target cluster - configure same BSL
# Then restore
velero restore create app-migration-restore \
--from-backup app-migration \
--wait
# Update DNS/routes to point to new cluster
Next Steps
- Verify application functionality
- Update configurations for new environment
- Test application thoroughly
- Document any manual steps required
- Plan for cleanup of source resources (if migration)
- Schedule regular restore testing