Bootstrap FreeKB - OpenShift - Schedule reoccurring OpenShift API for Data Protection (OADP) backup
OpenShift - Schedule reoccurring OpenShift API for Data Protection (OADP) backup

Updated:   |  OpenShift articles

This assumes you have already

Let's say we want to use OpenShift API for Data Protection (OADP) to schedule reoccurring backups of resources and store the backups in an Amazon Web Services S3 Bucket. 

The oc get backupStorageLocations command can be used to list the name of the Storage Locations you have created. 

~]$ oc get backupStorageLocations --namespace openshift-adp
NAME               PHASE       LAST VALIDATED   AGE   DEFAULT
my-aws-s3-bucket   Available   58s              44m   true

 

Let's say you want to backup the resources in namespace my-project. Let's create a velero backup resource that will backup the resources in namespace my-project, replacing my-aws-s3-bucket with the name of your Storage Location. Let's say this markup is in a file named my-project-backup.yml. By default, the Time To Live (TTL) will be 30 days, which means the backup will be retained for 30 days. Once the backup has exceeded 30 days, the backup will be removed from the storage location.

apiVersion: velero.io/v1
kind: Schedule
metadata:
  name: my-project
  namespace: openshift-adp
spec:
  schedule: 00 01 * * *
  template:
    includedNamespaces:
    - my-project
    storageLocation: my-aws-s3-bucket

 

Let's use the oc apply command to create the scheduled backup resource.

~]$ oc apply --filename my-project-scheduled-backup.yml
schedule.velero.io/my-project created

 

There should now be a backup resource named my-project in the openshift-adp namespace. Notice that LASTBACKUP contains no value because the scheduled job has not yet run.

~]$ oc get schedules --namespace openshift-adp
NAME          STATUS    SCHEDULE      LASTBACKUP   AGE   PAUSED
my-project    Enabled   00 01 * * *                42s

 

Once the scheduled job has run, LASTBACKUP should then have a value.

~]$ oc get schedules --namespace openshift-adp
NAME          STATUS    SCHEDULE      LASTBACKUP   AGE   PAUSED
my-project    Enabled   00 01 * * *   15m          23h

 

The aws s3api list-objects command can be used to list the objects in the S3 Bucket. Something like this should be returned, where there are my-project objects in the S3 Bucket matching the schedule. Awesome, it works!

~]$ aws s3api list-objects --bucket my-bucket-asdfadkjsfasfljdf --profile admin
{
    "Contents": [
        {
            "Key": "backups/my-project/my-project-csi-volumesnapshotclasses.json.gz",
            "LastModified": "2025-04-16T01:00:31+00:00",
            "ETag": "\"6848cb8d5f3669ef603f87e48ece8567\"",
            "Size": 29,
            "StorageClass": "STANDARD",
            "Owner": {
                "DisplayName": "john.doe",
                "ID": "ab0e0a41e318d5103a77c82240d5cb3fc41ff11cc325c65b5c777a5f8e743743"
            }
        },
        {
            "Key": "backups/my-project/my-project-csi-volumesnapshotcontents.json.gz",
            "LastModified": "2025-04-16T01:00:31+00:00",
            "ETag": "\"6848cb8d5f3669ef603f87e48ece8567\"",
            "Size": 29,
            "StorageClass": "STANDARD",
            "Owner": {
                "DisplayName": "john.doe",
                "ID": "ab0e0a41e318d5103a77c82240d5cb3fc41ff11cc325c65b5c777a5f8e743743"
            }
        },
        {
            "Key": "backups/my-project/my-project-csi-volumesnapshots.json.gz",
            "LastModified": "2025-04-16T01:00:31+00:00",
            "ETag": "\"6848cb8d5f3669ef603f87e48ece8567\"",
            "Size": 29,
            "StorageClass": "STANDARD",
            "Owner": {
                "DisplayName": "john.doe",
                "ID": "ab0e0a41e318d5103a77c82240d5cb3fc41ff11cc325c65b5c777a5f8e743743"
            }
        },
        {
            "Key": "backups/my-project/my-project-itemoperations.json.gz",
            "LastModified": "2025-04-16T01:00:31+00:00",
            "ETag": "\"ae811dd04e417ed7b896b4c4fa3d2ac0\"",
            "Size": 27,
            "StorageClass": "STANDARD",
            "Owner": {
                "DisplayName": "john.doe",
                "ID": "ab0e0a41e318d5103a77c82240d5cb3fc41ff11cc325c65b5c777a5f8e743743"
            }
        },
        {
            "Key": "backups/my-project/my-project-logs.gz",
            "LastModified": "2025-04-16T01:00:31+00:00",
            "ETag": "\"673aef92adf289811d5c04b270084eac\"",
            "Size": 11312,
            "StorageClass": "STANDARD",
            "Owner": {
                "DisplayName": "john.doe",
                "ID": "ab0e0a41e318d5103a77c82240d5cb3fc41ff11cc325c65b5c777a5f8e743743"
            }
        },
        {
            "Key": "backups/my-project/my-project-resource-list.json.gz",
            "LastModified": "2025-04-16T01:00:31+00:00",
            "ETag": "\"47145873ba24f87182ee601bc7dd92fc\"",
            "Size": 307,
            "StorageClass": "STANDARD",
            "Owner": {
                "DisplayName": "john.doe",
                "ID": "ab0e0a41e318d5103a77c82240d5cb3fc41ff11cc325c65b5c777a5f8e743743"
            }
        },
        {
            "Key": "backups/my-project/my-project-results.gz",
            "LastModified": "2025-04-16T01:00:31+00:00",
            "ETag": "\"4b8f571a28628df1f222ee56c3673550\"",
            "Size": 49,
            "StorageClass": "STANDARD",
            "Owner": {
                "DisplayName": "john.doe",
                "ID": "ab0e0a41e318d5103a77c82240d5cb3fc41ff11cc325c65b5c777a5f8e743743"
            }
        },
        {
            "Key": "backups/my-project/my-project-volumeinfo.json.gz",
            "LastModified": "2025-04-16T01:00:31+00:00",
            "ETag": "\"05cd97096815e99b306792f280b67b06\"",
            "Size": 292,
            "StorageClass": "STANDARD",
            "Owner": {
                "DisplayName": "john.doe",
                "ID": "ab0e0a41e318d5103a77c82240d5cb3fc41ff11cc325c65b5c777a5f8e743743"
            }
        },
        {
            "Key": "backups/my-project/my-project-volumesnapshots.json.gz",
            "LastModified": "2025-04-16T01:00:31+00:00",
            "ETag": "\"6848cb8d5f3669ef603f87e48ece8567\"",
            "Size": 29,
            "StorageClass": "STANDARD",
            "Owner": {
                "DisplayName": "john.doe",
                "ID": "ab0e0a41e318d5103a77c82240d5cb3fc41ff11cc325c65b5c777a5f8e743743"
            }
        },        
        {
            "Key": "backups/my-project/my-project.tar.gz",
            "LastModified": "2025-04-16T01:00:31+00:00",
            "ETag": "\"c28c1d05c60cfb80f21799b5b11faac9\"",
            "Size": 13046,
            "StorageClass": "STANDARD",
            "Owner": {
                "DisplayName": "john.doe",
                "ID": "ab0e0a41e318d5103a77c82240d5cb3fc41ff11cc325c65b5c777a5f8e743743"
            }
        },
        {
            "Key": "backups/my-project/velero-backup.json",
            "LastModified": "2025-04-16T01:00:31+00:00",
            "ETag": "\"33c1cecb4d65267049037e13b78759d1\"",
            "Size": 3826,
            "StorageClass": "STANDARD",
            "Owner": {
                "DisplayName": "john.doe",
                "ID": "ab0e0a41e318d5103a77c82240d5cb3fc41ff11cc325c65b5c777a5f8e743743"
            }
        }
    ]
}        

 

 




Did you find this article helpful?

If so, consider buying me a coffee over at Buy Me A Coffee



Comments


Add a Comment


Please enter f2e018 in the box below so that we can be sure you are a human.