4 min read | by Jordi Prats
Just in the same way we backup physical servers, we need to backup Kubernetes workloads to be able to restore it to its previous state: We'll need make sure we are going to be able to restore the objects of any namespace and it's data (PersistentVolumes)
First we'll have to install Velero and configuring one of the cloud providers it supports. But regardless of the provider we are using, we can schedule backups and restore from them in the same way:
Creating a backup of your Kubernetes resources within a set of namespaces is a straightforward process. Velero provides a
Backup object to do so:
apiVersion: velero.io/v1 kind: Backup metadata: namespace: pet2cattle-backup name: test-backup spec: includedNamespaces: - velero-demo ttl: "4h"
velero-demonamespace is backed up using this object.
We might not want to include some of the objects a namespace contains. For example, if we are using External Secrets Operator, there's no point on backing up it's secrets since they are already stored somewhere else. We can exclude them as follows:
apiVersion: velero.io/v1 kind: Backup metadata: namespace: pet2cattle-ondemand-backup name: test-backup spec: includedNamespaces: - velero-demo ttl: "4h" excludedResources: - Secret
Performing on-demand backups might be useful, but scheduling regular backups is critical to ensure that you have a recent backup in case of a disaster. Velero uses the
Schedule object that contains a
Backup template to schedule regular backups:
kind: Schedule apiVersion: velero.io/v1 metadata: name: schedule namespace: pet2cattle-scheduled-backup spec: schedule: "0 */2 * * *" template: excludedResources: - Secret includedNamespaces: - velero-demo ttl: "4h"
schedule field specifies the cron schedule for the backup. In the example above, the backup is scheduled to run every two hours.
In case you need to restore from a Velero backup you'll need to use the
apiVersion: velero.io/v1 kind: Restore metadata: namespace: pet2cattle-restore-same-ns name: test-restore spec: backupName: test-backup includedNamespaces: - velero-demo
backupName field specifies the name of the backup that you want to restore from. By using the
includedNamespaces field specifies the namespaces that you want to restore, in case the backup contains more than one namespace.
If we want to restore the backup to a different namespace to be able to keep the data in the origin namespace as it is (for example for later analysis). We can do that using the
apiVersion: velero.io/v1 kind: Restore metadata: namespace: pet2cattle-restore-other-ns name: test-restore spec: backupName: test-backup includedNamespaces: - velero-demo namespaceMapping: velero-demo: restored-velero-demo
In the example above, we are restoring the
velero-demo namespace from the
test-backup Backup, but we are changing the namespace name to
restored-velero-demo: All the objects in the backup that belonged to the
velero-demo namespace will now belong to the
Backup's metadata is stored in S3 (if you are using AWS), so if you delete the Backup object, velero will eventually recreate the object. If we really want to delete it before it expires we'll need to use the
kind: DeleteBackupRequest apiVersion: velero.io/v1 metadata: name: deletebackuprequest namespace: pet2cattle-backup spec: backupName: test-ondemand-backup
Posted on 08/05/2023