Intro
Kubernetes multi-tenancy introduces unique challenges for backup and restore. When multiple teams or applications share a cluster, a misconfigured backup can expose sensitive data across tenant boundaries, and a failed restore can disrupt unrelated workloads. This guide moves beyond theory to provide a practical, command-driven approach for backing up and restoring tenant-scoped resources in Kubernetes.
We focus on the operational realities: identifying what to back up, selecting appropriate tools, validating backups, and executing restore procedures that minimize blast radius. You'll learn how to use native Kubernetes features like namespaces, resource quotas, and RBAC to isolate tenant data, and how to combine them with backup tools like Velero to create robust disaster recovery plans. Every section includes concrete commands, expected outputs, and failure signals to watch for.
The goal is operational safety: observe before changing, limit the blast radius, use placeholders instead of secrets in examples, verify results, and document recovery paths before an incident occurs.
Version and Environment Inventory
Before implementing backup and restore, establish a clear inventory of your cluster's version, topology, and existing tenancy model. This inventory serves as a baseline for troubleshooting and ensures compatibility with backup tools and procedures.
Key components to inventory:
- Kubernetes control plane and node versions (
kubectl version) - Container runtime and CSI drivers (relevant for volume snapshots)
- Namespaces and tenant boundaries (
kubectl get namespaces) - Resource quotas and limit ranges per namespace
- RBAC roles and bindings that define tenant access
- Storage classes and persistent volume claims in use
- Existing backup tooling (e.g., Velero, Stash, Kasten)
Prerequisites for backup implementation:
- Kubernetes cluster version 1.18+ (for stable snapshot APIs) with appropriate permissions
- A backup target: S3-compatible object storage, NFS, or cloud blob storage
- Adequate RBAC permissions for the backup tool to access all tenant namespaces
- If using volume snapshots, a CSI driver that supports snapshotting
Practical inventory commands:
Start with a read-only observation of your cluster:
kubectl version --short
kubectl get nodes -o wide
kubectl get namespaces --show-labels
List resource quotas across namespaces to understand tenant limits:
kubectl get resourcequota --all-namespaces
Review RBAC for backup-related service accounts:
kubectl get clusterrolebinding | grep velero
kubectl describe clusterrole velero
Check storage classes and existing persistent volume claims:
kubectl get storageclass
kubectl get pvc --all-namespaces
Expected outputs and failure signals:
- If
kubectl get nodesshows nodes in NotReady state, resolve node issues before backing up. - If resource quotas are missing, tenant resource usage may be uncontrolled; consider adding them.
- If the backup tool's service account lacks permissions, backups will fail with RBAC errors.
Blast radius and recovery: Any change to cluster-level resources (e.g., CRDs, cluster roles) can affect all tenants. Before installing a backup tool, review its required permissions and test in a non-production cluster if possible. Keep a record of installed components and their versions to facilitate rollback.
Safe Configuration Path
Configuring backup and restore safely requires a step-by-step approach that minimizes risk. This section outlines a configuration path that separates observation from intervention and includes verification at each step.
Step 1: Define backup scope per tenant
In multi-tenant clusters, it's critical to back up each tenant's resources independently. Use namespace-based tenancy as a best practice, where each tenant owns one or more namespaces. Label namespaces to allow selective backup:
apiVersion: v1
kind: Namespace
metadata:
name: tenant-a
labels:
tenant: a
backup: "true"
Apply the manifest:
kubectl apply -f tenant-a-namespace.yaml
Verify the label:
kubectl get namespace tenant-a --show-labels
Step 2: Install and configure backup tool
Velero is a popular open-source tool for Kubernetes backup and restore. Install it with the appropriate plugins for your storage provider. Example installation with AWS S3:
velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.2.0 \
--bucket my-backup-bucket \
--backup-location-config region=us-east-1 \
--snapshot-location-config region=us-east-1 \
--secret-file ./credentials-velero
After installation, verify Velero is running:
kubectl get pods -n velero
kubectl logs deployment/velero -n velero
Check that the backup storage location is available:
velero backup-location get
Step 3: Create backup schedules with tenant-specific selectors
Use label selectors to include only tenant resources in a backup. Example schedule for tenant-a:
apiVersion: velero.io/v1
kind: Schedule
metadata:
name: tenant-a-daily
namespace: velero
spec:
schedule: "0 2 * * *"
template:
includedNamespaces:
- tenant-a
labelSelector:
matchLabels:
tenant: a
ttl: 720h
Apply and verify:
kubectl apply -f tenant-a-schedule.yaml
velero schedule get
Step 4: Validate backup manually
Before relying on schedules, perform an on-demand backup and verify it completes:
velero backup create tenant-a-manual --include-namespaces tenant-a
velero backup describe tenant-a-manual
velero backup logs tenant-a-manual
Safe configuration principles:
- Use namespaces and labels to isolate tenant data.
- Store credentials in Kubernetes secrets, not in plaintext manifests.
- Test backups regularly by restoring to a staging namespace.
- Monitor backup job status and alerts for failures.
Verification commands for safe configuration:
After applying any change, check the relevant pods and logs:
kubectl get pods -n velero -o wide
kubectl describe pod <pod-name> -n velero
kubectl logs <pod-name> -n velero --previous
For Velero deployments, ensure the deployment is rolled out successfully:
kubectl rollout status deployment/velero -n velero
Verification and Diagnostics
Verification is the process of confirming that backups are valid and restorable. Diagnostics help identify why a backup or restore failed. This section provides concrete verification steps and diagnostic commands.
Verifying backup integrity
After creating a backup, check its status and phase:
velero backup get
Expected output should show Completed phase and no errors:
NAME STATUS ERRORS WARNINGS CREATED EXPIRES STORAGE LOCATION SELECTOR
tenant-a-manual Completed 0 0 2023-01-01 12:00:00 +0000 UTC 29d default <none>
Describe the backup for details:
velero backup describe tenant-a-manual --details
Check for warnings or errors in the log:
velero backup logs tenant-a-manual
If there are errors, common causes include insufficient permissions, missing storage location, or invalid selectors.
Verifying restore readiness
Perform a test restore to a different namespace to ensure data integrity without affecting production tenants:
velero restore create --from-backup tenant-a-manual --namespace-mappings tenant-a:tenant-a-restore
Monitor the restore:
velero restore get
velero restore describe tenant-a-restore
velero restore logs tenant-a-restore
Verify that the restored resources are functioning:
kubectl get all -n tenant-a-restore
kubectl get pvc -n tenant-a-restore
Expected output should show all deployments, services, and PVCs created.
Diagnosing common backup/restore failures
- Backup stuck in
InProgress: Check Velero pod logs for errors. Often due to volume snapshot issues.
kubectl logs deployment/velero -n velero | grep -i error
- Restore fails with
NotFounderror: The backup may not include the referenced resource due to label selector mismatch. Verify the backup's resource list:
velero backup describe <backup-name> --details | grep -A5 "Resource List"
- PVC restoration fails: If using dynamic provisioning, ensure the storage class exists and supports the snapshot. Check events:
kubectl get events -n <namespace> --sort-by='.lastTimestamp'
Using native Kubernetes diagnostics
For diagnosing issues within tenant namespaces before backup or after restore:
- Check pod status and events:
kubectl get pods -n tenant-a -o wide
kubectl describe pod <pod-name> -n tenant-a
- View logs for crash-looping pods:
kubectl logs <pod-name> -n tenant-a --previous
- Check rollout status of deployments:
kubectl rollout status deployment/<deployment-name> -n tenant-a
Performance considerations
Backup and restore can impact cluster performance. Monitor resource usage during backup operations:
kubectl top pods -n velero
If Velero pods are consuming excessive CPU or memory, consider adjusting resource limits in the Velero deployment.
Failure Modes and Recovery
Understanding common failure modes prepares you to recover quickly. This section outlines typical backup and restore failures in multi-tenant clusters and provides recovery procedures.
Failure mode 1: Backup incomplete due to missing RBAC permissions
Symptoms: Backup partially completes with errors; logs show 403 Forbidden.
Diagnosis:
velero backup describe <backup-name> --details
kubectl logs deployment/velero -n velero | grep -i forbidden
Recovery:
- Review Velero's required permissions:
kubectl get clusterrole velero -o yaml
- Compare with the documented permissions. If missing, update the cluster role:
kubectl apply -f velero-clusterrole.yaml
- Re-run the backup.
Failure mode 2: Restore conflicts with existing resources
Symptoms: Restore fails with AlreadyExists errors for certain resources.
Diagnosis:
velero restore describe <restore-name> --details
Recovery:
- Identify the conflicting resources.
- Decide whether to delete existing resources or restore with a different name. For example, delete the conflicting deployment:
kubectl delete deployment <deployment-name> -n <namespace>
Or use Velero's --existing-resource-policy flag to skip or update:
velero restore create --from-backup <backup-name> --existing-resource-policy none
Failure mode 3: Volume snapshot failures
Symptoms: Backup completes but volume snapshots fail; PVC data not backed up.
Diagnosis: Check Velero logs for snapshot errors:
kubectl logs deployment/velero -n velero | grep -i snapshot
Recovery:
- Verify the CSI driver supports snapshots:
kubectl get volumesnapshotclass
- If no snapshot class, create one appropriate for your storage provider.
- Re-run backup.
Failure mode 4: Accidental deletion of tenant namespace
Symptoms: Tenant namespace deleted, applications down.
Recovery using Velero:
- Find the latest backup for the namespace:
velero backup get --include-namespaces tenant-a
- Restore the namespace:
velero restore create --from-backup <backup-name>
- Verify restoration:
kubectl get namespace tenant-a
kubectl get all -n tenant-a
Rollback strategies
In multi-tenant clusters, rollbacks must be tenant-scoped to avoid affecting others. Use namespace-based restore to roll back a single tenant's application. For example, if a deployment update breaks tenant-a's app, restore the previous deployment manifest from backup:
velero restore create --from-backup tenant-a-manual --include-resources deployments --namespace-mappings tenant-a:tenant-a
Alternatively, if using GitOps, revert the manifest in Git and sync.
Recovery verification
After any recovery, perform validation:
- Check that pods are running and ready:
kubectl get pods -n tenant-a -o wide
- Test application endpoints.
- Verify data integrity in databases.
- Ensure no cross-tenant resource leakage (e.g., services in other namespaces unaffected).
Document each failure and recovery for future reference.
Operations Checklist
Use this checklist to ensure your Kubernetes multi-tenant backup and restore processes are robust and ready.
Preparation
- [ ] Document cluster version, storage providers, and tenancy model.
- [ ] Define backup policies per tenant: frequency, retention, and scope.
- [ ] Label namespaces with tenant identifiers and backup flags.
- [ ] Configure RBAC for backup tool with least privilege.
- [ ] Set up monitoring and alerting for backup jobs (e.g., Prometheus alerts on Velero metrics).
Backup configuration
- [ ] Install Velero (or alternative) with appropriate plugins.
- [ ] Create backup storage location and verify connectivity.
- [ ] Create schedules with label selectors per tenant.
- [ ] Perform a manual backup and verify completion.
- [ ] Test restore to a staging namespace.
Ongoing operations
- [ ] Monitor backup schedules daily:
velero schedule get. - [ ] Review backup logs weekly for errors or warnings.
- [ ] Test restore at least quarterly to ensure recoverability.
- [ ] Update backup policies as tenants change.
- [ ] Rotate backup credentials regularly.
Incident response
- [ ] Have documented runbooks for common failure modes (as above).
- [ ] Maintain a list of who to contact for each tenant.
- [ ] After recovery, perform a post-incident review and update procedures.
Practical command reference
| Task | Command | Expected Result |
|---|---|---|
| Check Velero status | kubectl get pods -n velero | Pods Running |
| List backups | velero backup get | Successful backups listed |
| Create manual backup | velero backup create test --include-namespaces tenant-a | Backup created |
| Restore backup | velero restore create --from-backup test | Restore initiated |
| Check restore status | velero restore get | Completed |
| Test application | kubectl get pods -n tenant-a | Pods Running |
Replace the example namespace tenant-a with your actual namespace.
Verification for operations checklist
After following the checklist, verify:
- All backup schedules are active and recent backups exist.
- Recovery time objective (RTO) and recovery point objective (RPO) are met in test restores.
- No backup jobs are failing silently (set up alerts for job failures).
- Resource quotas and RBAC are enforced during restore.
Conclusion
Implementing backup and restore in a Kubernetes multi-tenant environment demands careful planning and continuous validation. By isolating tenants with namespaces and labels, using tools like Velero with appropriate selectors, and regularly testing restores, you can achieve reliable disaster recovery without compromising tenant isolation.
This guide has provided practical steps for inventorying your environment, configuring backups safely, verifying and diagnosing issues, and recovering from failures. The key takeaways are:
- Always observe before changing: use read-only commands to understand current state.
- Limit blast radius with tenant-scoped backups and restores.
- Validate backups by testing restores in isolation.
- Document recovery procedures and keep them updated.
As a next step, implement a backup schedule for one tenant in your cluster, test the restore process, and then expand to other tenants following the same patterns. Remember, a backup is only as good as your ability to restore from it.