1. Answers
  2. Scheduling Regular Kubernetes Backup With Velero Jobs

Scheduling Regular Kubernetes Backup With Velero Jobs

Introduction

In this guide, we will set up a scheduled backup for a Kubernetes cluster using Velero. Velero is an open-source tool that provides backup, restore, and disaster recovery capabilities for Kubernetes clusters. We will use Pulumi to automate the deployment and scheduling of Velero backup jobs.

Step-by-Step Explanation

Step 1: Install Velero

First, we need to install Velero on our Kubernetes cluster. This involves creating a namespace for Velero, setting up the necessary permissions, and deploying the Velero server.

Step 2: Configure Backup Storage

Next, we will configure a storage location for our backups. This can be an S3 bucket on AWS, a Google Cloud Storage bucket, or any other supported storage provider.

Step 3: Schedule Backup Jobs

We will then create a Kubernetes CronJob to schedule regular backups using Velero. The CronJob will run at specified intervals and trigger Velero backup commands.

Step 4: Verify Backups

Finally, we will verify that our backups are being created as expected and can be restored if needed.

Summary

By following these steps, we have set up a scheduled backup system for our Kubernetes cluster using Velero and Pulumi. This ensures that our cluster’s data is regularly backed up and can be restored in case of any issues.

Full Code Example

import * as pulumi from "@pulumi/pulumi";
import * as k8s from "@pulumi/kubernetes";
import * as aws from "@pulumi/aws";

// Step 1: Install Velero
const veleroNamespace = new k8s.core.v1.Namespace("velero-namespace", {
    metadata: { name: "velero" },
});

const veleroServiceAccount = new k8s.core.v1.ServiceAccount("velero-service-account", {
    metadata: {
        namespace: veleroNamespace.metadata.name,
        name: "velero",
    },
});

const veleroClusterRoleBinding = new k8s.rbac.v1.ClusterRoleBinding("velero-clusterrolebinding", {
    metadata: { name: "velero" },
    subjects: [{
        kind: "ServiceAccount",
        name: veleroServiceAccount.metadata.name,
        namespace: veleroNamespace.metadata.name,
    }],
    roleRef: {
        kind: "ClusterRole",
        name: "cluster-admin",
        apiGroup: "rbac.authorization.k8s.io",
    },
});

const veleroDeployment = new k8s.apps.v1.Deployment("velero-deployment", {
    metadata: {
        namespace: veleroNamespace.metadata.name,
        name: "velero",
    },
    spec: {
        replicas: 1,
        selector: { matchLabels: { app: "velero" } },
        template: {
            metadata: { labels: { app: "velero" } },
            spec: {
                serviceAccountName: veleroServiceAccount.metadata.name,
                containers: [{
                    name: "velero",
                    image: "velero/velero:v1.6.0",
                    args: [
                        "server",
                    ],
                    volumeMounts: [{
                        mountPath: "/scratch",
                        name: "scratch",
                    }],
                }],
                volumes: [{
                    name: "scratch",
                    emptyDir: {},
                }],
            },
        },
    },
});

// Step 2: Configure Backup Storage
const backupBucket = new aws.s3.Bucket("velero-backup-bucket", {
    bucket: "velero-backup-bucket",
});

// Step 3: Schedule Backup Jobs
const backupCronJob = new k8s.batch.v1.CronJob("velero-backup-cronjob", {
    metadata: {
        namespace: veleroNamespace.metadata.name,
        name: "velero-backup",
    },
    spec: {
        schedule: "0 2 * * *", // Every day at 2 AM
        jobTemplate: {
            spec: {
                template: {
                    spec: {
                        containers: [{
                            name: "velero",
                            image: "velero/velero:v1.6.0",
                            args: [
                                "backup",
                                "create",
                                "--include-namespaces",
                                "*",
                                \`--storage-location=\${backupBucket.bucket}\`,
                            ],
                        }],
                        restartPolicy: "OnFailure",
                    },
                },
            },
        },
    },
});

// Step 4: Verify Backups
// This step is manual and involves checking the S3 bucket and Velero logs to ensure backups are created successfully.

Deploy this code

Want to deploy this code? Sign up for a free Pulumi account to deploy in a few clicks.

Sign up

New to Pulumi?

Want to deploy this code? Sign up with Pulumi to deploy in a few clicks.

Sign up