Velero Commands

#!/bin/bash

BUCKET=<name>-velero-backups
PROJECT_ID=<your_project_id>
gcloud config set project $PROJECT_ID

kubectx <your_kubernetes_context>

GSA_NAME=velero
gcloud iam service-accounts create $GSA_NAME \
    --display-name "Velero service account"

gcloud iam service-accounts list

SERVICE_ACCOUNT_EMAIL=$(gcloud iam service-accounts list \
  --filter="displayName:Velero service account" \
  --format 'value(email)')

ROLE_PERMISSIONS=(
    compute.disks.get
    compute.disks.create
    compute.disks.createSnapshot
    compute.projects.get
    compute.snapshots.get
    compute.snapshots.create
    compute.snapshots.useReadOnly
    compute.snapshots.delete
    compute.zones.get
    storage.objects.create
    storage.objects.delete
    storage.objects.get
    storage.objects.list
    iam.serviceAccounts.signBlob
    iam.serviceAccounts.getAccessToken
)

gcloud iam roles create velero.server.custom.platform \
    --project $PROJECT_ID \
    --title "Custom Velero Server Roles" \
    --permissions "$(IFS=","; echo "${ROLE_PERMISSIONS[*]}")"

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member serviceAccount:$SERVICE_ACCOUNT_EMAIL \
    --role projects/$PROJECT_ID/roles/velero.server.custom.platform

gsutil iam ch serviceAccount:$SERVICE_ACCOUNT_EMAIL:objectAdmin gs://${BUCKET}

# Create permission
NAMESPACE=velero
kubectl create namespace $NAMESPACE

# WE NEED TO: Disable service account key creation in organization policies: Override parent's policy
gcloud iam service-accounts keys create credentials-velero \
    --iam-account $SERVICE_ACCOUNT_EMAIL

# Scheduling backup
velero schedule create daily-full-cluster \
    --schedule="0 1 * * *" \
    --ttl 720h \
    --include-cluster-resources=true \
    --include-resources '*' \
    --exclude-namespaces kube-system

velero schedule create hourly-critical-ns \
    --schedule="0 * * * *" \
    --include-namespaces dev,observability,pgbouncer,rabbitmq-system \
    --include-cluster-resources=true \
    --ttl 168h


# 1. Validate backup
velero backup describe daily-full-cluster-<timestamp> --details

# 2. Test restore (to different namespace)
velero restore create test-full-restore \
    --from-backup daily-full-cluster-<timestamp> \
    --namespace-mappings dev:dev-test,observability:observability-test \
    --include-cluster-resources=true \
    --wait

# 3. Production restore
velero restore create prod-full-restore \
    --from-backup daily-full-cluster-<timestamp> \
    --include-cluster-resources=true \
    --wait


# Check backup status
velero backup get

# Check schedule status
velero schedule get

# Check restore status
velero restore get
velero backup create manual-critical-default-ns \
    --include-namespaces default \
    --include-cluster-resources \
    --exclude-resources persistentvolumeclaims,persistentvolumes \
    --ttl 168h --wait

velero backup create manual-critical-redis-dev \
    --include-namespaces redis-dev --selector "app.kubernetes.io/instance=redis" \
    --include-cluster-resources=true \
    --snapshot-volumes \
    --ttl 168h \
    --wait

velero restore create manual-critical-default-v1 \
    --from-backup manual-critical-default-ns \
    --include-cluster-resources=true \
    --wait
    
velero restore create manual-critical-redis-v1 \
    --from-backup manual-critical-redis-dev \
    --include-cluster-resources=true \
    --wait

velero schedule create daily-full-cluster \
    --schedule="0 1 * * *" \
    --ttl 720h \
    --include-cluster-resources=true \
    --include-resources '*' \
    --exclude-namespaces kube-system

velero schedule create hourly-critical-ns \
    --schedule="0 * * * *" \
    --include-namespaces dev,observability,pgbouncer,rabbitmq-system \
    --include-cluster-resources=true \
    --ttl 168h


# 1. Validate backup
velero backup describe daily-full-cluster-<timestamp> --details

# 2. Test restore (to different namespace)
velero restore create test-full-restore \
    --from-backup daily-full-cluster-<timestamp> \
    --namespace-mappings dev:dev-test,observability:observability-test \
    --include-cluster-resources=true \
    --wait

# 3. Production restore
velero restore create prod-full-restore \
    --from-backup daily-full-cluster-<timestamp> \
    --include-cluster-resources=true \
    --wait


# Check backup status
velero backup get

# Check schedule status
velero schedule get

# Check restore status
velero restore get