Backup and Restore
This feature is available in the Standard Plan and above. For more information, see our pricing plans or contact our sales team.
Upbound Crossplane offers a built-in backup and restore feature that lets you configure automatic schedules for taking snapshots of your control planes. You can restore data from these backups in-place or in a new control plane. This guide explains how to use Backup and Restore for disaster recovery or upgrade scenarios.
Prerequisites
Before you begin, make sure you have:
- a running Upbound Crossplane control plane cluster
- a valid Standard license applied to your control plane
- resources deployed and managed in the control plane
- Cloud provider credentials
Maintaining a healthy backup cadence is useful to prevent data loss or operational downtime in the event of accidental deletion, human error, or upstream failures.
Backup
A control plane backup object requires:
- a
BackupConfigthat defines your cloud provider object store and secret - a
Backupthat specifies your backup name and deletion policy
UXP can capture your control plane and stores the backup information in a cloud
object store with a BackupConfig. Backup operations export:
- Crossplane core
.crossplane.ioCRDs - Upbound core
.upbound.ioCRDs - CRDs owned by Crossplane packages
- CRDs owned by a
CompositeResourceDefinition SecretsandConfigMaps
Backups capture schema definitions and configuration needed to recreate your platform setup, not the actual provisioned resources themselves.
Upbound Crossplane needs a BackupConfig object that defines your provider, the
name of your backup bucket and the credentials associated with that cloud
account.
Create a BackupConfig
Create a Kubernetes secret with your cloud provider credentials. The example below uses AWS, but Backups are compatible with all major cloud providers.
kubectl create secret generic aws-secret --from-literal=my-aws-secret=<your-credentials>
To backup your control plane to your cloud provider object store, you need to
create a BackupConfig and apply it to your cluster:
apiVersion: admin.uxp.upbound.io/v1beta1
kind: BackupConfig
metadata:
name: default
spec:
objectStorage:
provider: AWS
bucket: my-bucket
config:
endpoint: s3.us-west-1.amazonaws.com
credentials:
source: Secret
secretRef:
name: aws-secret
key: my-aws-secret
The required properties of this object are:
spec.objectStorageto configure the bucket name and object store endpointspec.objectStorage.credentialsto pass cloud provider secrets
Create a ClusterRole
Your cluster needs permissions to the upbound-controller-manager component to
backup. Create a new ClusterRole for your backup operations:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: br-role
labels:
rbac.crossplane.io/aggregate-to-crossplane: "true"
rules:
- apiGroups:
- <your_apiGroups>
resources:
- "*"
verbs:
- "*"
Your apiGroups field expects a list of all apiVersions in your Composition.
Create a manual Backup
To capture the control plane state, you need to create a Backup and apply it
to your cluster to kick off the actual backup task:
apiVersion: admin.uxp.upbound.io/v1beta1
kind: Backup
metadata:
name: <your_backup_name>
spec:
configRef:
name: default
deletionPolicy: Delete
When you apply this Backup, UXP creates a compressed archive of Crossplane
resource manifests and stores them in your configured object storage.
kubectl apply -f my-backup.yaml
Verify the backup:
kubectl get backup
NAME PHASE RETRIES TTL AGE
my-backup Completed 34s
Create a BackupSchedule
You can also create a BackupSchedule to automatically trigger backups based on your
BackupConfig.
apiVersion: admin.uxp.upbound.io/v1beta1
kind: BackupSchedule
metadata:
name: <your_backup_name>
spec:
configRef:
name: default
deletionPolicy: Delete
schedule: '@weekly'
The spec.schedule field is a Cron-formatted string. Some common examples are below:
| Entry | Description |
|---|---|
@hourly | Run once an hour. |
@daily | Run once a day. |
@weekly | Run once a week. |
0 0/4 * * * | Run every 4 hours. |
0/15 * * * 1-5 | Run every fifteenth minute on Monday through Friday. |
@every 1h30m10s | Run every 1 hour, 30 minutes, and 10 seconds. Hour is the largest measurement of time for @every. |
Backup archive storage structure
UXP stores completed backups in the following format:
s3://<bucket>/<prefix>/<backupName or scheduleName>/<timestampedName>/
├── resources.tar.gz – compressed archive of Crossplane resource manifests
└── uxp-backup.yaml – serialized Backup CR manifest for traceability
Restore
A control plane restore operation requires:
- a
Restoreobject to kick off the restore operation
Restoration modes
The two modes for restoring your control plane from a backup are:
- In-place: Restores your resources into the same control plane cluster. This mode is suitable for disaster recovery or rollback scenarios. All existing resources in the control plane are overwritten by a restore operation.
- Cross-control plane: Restores your resources into a different control plane cluster. Requires matching versions of UXP.
Create a Restore object
Your Restore object specifies the backup name you specified in the previous
step:
apiVersion: admin.uxp.upbound.io/v1beta1
kind: Restore
metadata:
name: my-restore
spec:
configRef:
name: default
backupName: <your_backup_name>-backup
Verify the restore:
kubectl get restore
NAME PHASE RETRIES AGE
my-restore Completed 2 19s
To verify your resources:
kubectl get composite
NAME SYNCED READY COMPOSITION AGE
my-app True True app-yaml 94s
Advanced options
Set Time-To-Live
You can set your backup Time-To-Live (TTL) to automate cleanup. In both Backup
and BackupSchedule objects, you can add spec.ttl. For example:
apiVersion: admin.uxp.upbound.io/v1beta1
kind: Backup
metadata:
name: <your_backup_name>
spec:
configRef:
name: default
deletionPolicy: Delete
ttl: 168h # Backup deleted after 7 days
TTL Best Practices
| Environment | Recommended TTL | Example Values |
|---|---|---|
| Development/Test | Short TTLs | 24 to 72 hours |
| Production | Longer TTLs | 7 to 30 days |
Resource exclusion
You can customize resources in the backup scope with spec.excludedResources. For
example:
apiVersion: admin.uxp.upbound.io/v1beta1
kind: Backup
metadata:
name: <your_backup_name>
spec:
excludedResources:
- "XCluster"
- "XDatabase"
- "XRolePolicyAttachment"
Deletion policy
You can automate how your backups behave when you delete resources with the
deletionPolicy field in your Backup or BackupSchedule objects. For
example:
apiVersion: admin.uxp.upbound.io/v1beta1
kind: Backup
metadata:
name: <your_backup_name>
spec:
configRef:
name: default
deletionPolicy: Orphan # Retains the backup in resource deletion
Deletion Policy Best Practices
| Deletion Policy | Environment | Use Case | Behavior |
|---|---|---|---|
Delete | Development/Test | Auto cleanup | Backups deleted when the resource is deleted |
Orphan | Production | Long-term archival | Backups retained even if the resource is deleted |