Configure Velero storage backends
What you’ll accomplish
Section titled “What you’ll accomplish”You’ll configure Velero’s backup storage destination, provide credentials, and customize the backup schedule and retention to match your environment’s requirements.
Prerequisites
Section titled “Prerequisites”- UDS CLI installed
- Access to a Kubernetes cluster with UDS Core deployed
- An S3-compatible or Azure Blob storage endpoint for backup data
Before you begin
Section titled “Before you begin”UDS Core ships with these backup defaults:
| Setting | Default |
|---|---|
| Schedule | Daily at 03:00 UTC (0 3 * * *) |
| Retention | 10 days (240h) |
| Excluded namespaces | kube-system, velero |
| Cluster resources | Included |
| Volume snapshots | Disabled |
Velero’s storage configuration uses two Helm charts:
| Chart | Scope |
|---|---|
velero (upstream) | Credentials, backup storage location, schedule, volume snapshot settings |
uds-velero-config (UDS) | Storage network egress policy |
S3-compatible storage is configured through Zarf variables set in your uds-config.yaml. Azure Blob Storage is configured through bundle overrides.
-
Configure your storage destination
Add the following variables to your
uds-config.yaml:uds-config.yaml variables:core:VELERO_BUCKET_PROVIDER_URL: "https://s3.us-east-1.amazonaws.com"VELERO_BUCKET: "my-velero-backups"VELERO_BUCKET_REGION: "us-east-1"VELERO_BUCKET_KEY: "<your-access-key>"VELERO_BUCKET_KEY_SECRET: "<your-secret-key>"The full set of available variables:
Variable Description Default VELERO_BUCKET_PROVIDER_URLS3 endpoint URL http://minio.uds-dev-stack.svc.cluster.local:9000VELERO_BUCKETBucket name udsVELERO_BUCKET_REGIONBucket region uds-dev-stackVELERO_BUCKET_KEYAccess key ID udsVELERO_BUCKET_KEY_SECRETSecret access key uds-secretVELERO_BUCKET_CREDENTIAL_NAMEKubernetes Secret name for credentials velero-bucket-credentialsVELERO_BUCKET_CREDENTIAL_KEYKey within the credentials Secret cloud(Optional) Use an existing credentials Secret — If your environment pre-provisions Kubernetes Secrets (for example, via an external secrets operator), you can reference an existing Secret instead of having Zarf create one:
uds-bundle.yaml packages:- name: corerepository: registry.defenseunicorns.com/public/coreref: x.x.x-upstreamoverrides:velero:velero:values:- path: credentials.existingSecretvalue: "velero-bucket-credentials"The Secret must follow this format:
apiVersion: v1kind: Secretmetadata:name: velero-bucket-credentialsnamespace: velerotype: OpaquestringData:cloud: |[default]aws_access_key_id=<your-access-key>aws_secret_access_key=<your-secret-key>Override the Velero credentials and backup storage location to use Azure Blob Storage:
uds-bundle.yaml packages:- name: corerepository: registry.defenseunicorns.com/public/coreref: x.x.x-upstreamoverrides:velero:velero:values:- path: credentials.secretContents.cloudvalue: |AZURE_STORAGE_ACCOUNT_ACCESS_KEY=<your-storage-account-access-key>AZURE_CLOUD_NAME=<your-cloud-name>- path: configuration.backupStorageLocationvalue:- name: defaultprovider: azurebucket: <your-container-name>config:storageAccount: <your-storage-account>resourceGroup: <your-resource-group>storageAccountKeyEnvVar: AZURE_STORAGE_ACCOUNT_ACCESS_KEYsubscriptionId: <your-subscription-id> -
(Optional) Configure storage network egress
By default, Velero’s network policy allows egress to any destination for storage connectivity. To restrict egress to a specific target, add the following overrides to your bundle using the
uds-velero-configchart:Internal storage (in-cluster MinIO or similar):
uds-bundle.yaml packages:- name: corerepository: registry.defenseunicorns.com/public/coreref: x.x.x-upstreamoverrides:velero:uds-velero-config:values:- path: storage.internal.enabledvalue: true- path: storage.internal.remoteSelectorvalue:app: minio- path: storage.internal.remoteNamespacevalue: "minio"CIDR-restricted (known IP range):
uds-bundle.yaml packages:- name: corerepository: registry.defenseunicorns.com/public/coreref: x.x.x-upstreamoverrides:velero:uds-velero-config:values:- path: storage.egressCidrvalue: "10.0.0.0/8" -
(Optional) Customize backup schedule and retention
The default backup schedule runs daily at 03:00 UTC with a 10-day retention window. To customize these settings, add the following overrides to your bundle:
uds-bundle.yaml packages:- name: corerepository: registry.defenseunicorns.com/public/coreref: x.x.x-upstreamoverrides:velero:velero:values:# Run backups every 6 hours- path: schedules.udsbackup.schedulevalue: "0 */6 * * *"# Retain backups for 30 days- path: schedules.udsbackup.template.ttlvalue: "720h" -
Create and deploy your bundle
Combine all overrides from the steps above into a single bundle configuration, then create and deploy:
Terminal window uds create <path-to-bundle-dir>uds deploy uds-bundle-<name>-<arch>-<version>.tar.zst
Verification
Section titled “Verification”# Velero pod is runninguds zarf tools kubectl get pods -n velero
# Backup storage location shows "Available"uds zarf tools kubectl get backupstoragelocation -n velero
# Backup schedule exists with correct cron expressionuds zarf tools kubectl get schedule -n veleroSuccess criteria:
- Velero pod is
Running - BackupStorageLocation phase is
Available - Schedule
velero-udsbackupexists with the expected cron expression
To confirm storage is working end-to-end, trigger a manual backup and verify it completes. See Perform a manual backup.
Troubleshooting
Section titled “Troubleshooting”Problem: BackupStorageLocation shows “Unavailable”
Section titled “Problem: BackupStorageLocation shows “Unavailable””Symptoms: The BSL phase is Unavailable and no backups are created.
Solution: Check Velero logs for storage connectivity errors:
uds zarf tools kubectl logs -n velero deploy/velero --tail=50Common causes include incorrect bucket name or region, invalid credentials, and network policies blocking egress to the storage endpoint.
Problem: Velero pod crash-loops
Section titled “Problem: Velero pod crash-loops”Symptoms: The Velero pod repeatedly restarts.
Solution: Check pod logs for startup errors:
uds zarf tools kubectl logs -n velero deploy/velero --previous --tail=50Common causes include malformed credential Secrets and missing required configuration values.
Related documentation
Section titled “Related documentation”- Velero: Supported Storage Providers — full list of available storage plugins
- Velero: Backup Storage Locations — BSL configuration reference
- Velero Helm Chart — full list of upstream Helm values
- Backup & restore concepts — how Velero fits into UDS Core
Next steps
Section titled “Next steps”These guides and concepts may be useful to explore next: