备份恢复

Velero 是一个提供 Kubernetes 集群和持久卷的备份、迁移以及灾难恢复等的开源工具。

安装

https://github.com/heptio/velero/releases 下载最新的稳定版。

以 Azure 为例,安装 Velero 需要以下步骤:

(1) 创建存储账户

  1. AZURE_BACKUP_RESOURCE_GROUP=Velero_Backups
  2. az group create -n $AZURE_BACKUP_RESOURCE_GROUP --location WestUS
  3. AZURE_STORAGE_ACCOUNT_ID="velero$(uuidgen | cut -d '-' -f5 | tr '[A-Z]' '[a-z]')"
  4. az storage account create \
  5. --name $AZURE_STORAGE_ACCOUNT_ID \
  6. --resource-group $AZURE_BACKUP_RESOURCE_GROUP \
  7. --sku Standard_GRS \
  8. --encryption-services blob \
  9. --https-only true \
  10. --kind BlobStorage \
  11. --access-tier Hot
  12. BLOB_CONTAINER=velero
  13. az storage container create -n $BLOB_CONTAINER --public-access off --account-name $AZURE_STORAGE_ACCOUNT_ID

(2)创建 service principal

  1. AZURE_RESOURCE_GROUP=<NAME_OF_RESOURCE_GROUP>
  2. AZURE_SUBSCRIPTION_ID=`az account list --query '[?isDefault].id' -o tsv`
  3. AZURE_TENANT_ID=`az account list --query '[?isDefault].tenantId' -o tsv`
  4. AZURE_CLIENT_SECRET=`az ad sp create-for-rbac --name "velero" --role "Contributor" --query 'password' -o tsv`
  5. AZURE_CLIENT_ID=`az ad sp list --display-name "velero" --query '[0].appId' -o tsv`
  6. cat << EOF > ./credentials-velero
  7. AZURE_SUBSCRIPTION_ID=${AZURE_SUBSCRIPTION_ID}
  8. AZURE_TENANT_ID=${AZURE_TENANT_ID}
  9. AZURE_CLIENT_ID=${AZURE_CLIENT_ID}
  10. AZURE_CLIENT_SECRET=${AZURE_CLIENT_SECRET}
  11. AZURE_RESOURCE_GROUP=${AZURE_RESOURCE_GROUP}
  12. EOF

(3)启动 Velero

  1. velero install \
  2. --provider azure \
  3. --bucket $BLOB_CONTAINER \
  4. --secret-file ./credentials-velero \
  5. --backup-location-config resourceGroup=$AZURE_BACKUP_RESOURCE_GROUP,storageAccount=$AZURE_STORAGE_ACCOUNT_ID \
  6. --snapshot-location-config apiTimeout=<YOUR_TIMEOUT>

备份

创建定期备份:

  1. velero schedule create <SCHEDULE NAME> --schedule "0 7 * * *"

灾难恢复

  1. # Update your backup storage location to read-only mode
  2. kubectl patch backupstoragelocation <STORAGE LOCATION NAME> \
  3. --namespace velero \
  4. --type merge \
  5. --patch '{"spec":{"accessMode":"ReadOnly"}}'
  6. # Create a restore with your most recent Velero Backup
  7. velero restore create --from-backup <SCHEDULE NAME>-<TIMESTAMP>
  8. # When ready, revert your backup storage location to read-write mode
  9. kubectl patch backupstoragelocation <STORAGE LOCATION NAME> \
  10. --namespace velero \
  11. --type merge \
  12. --patch '{"spec":{"accessMode":"ReadWrite"}}'

迁移

首先,在集群 1 中创建备份(默认 TTL 是 30 天,你可以使用 —ttl 来修改):

  1. velero backup create <BACKUP-NAME>

然后,为集群 2 配置 BackupStorageLocations 和 VolumeSnapshotLocations,指向与集群 1 相同的备份和快照路径,并确保 BackupStorageLocations 是只读的(使用 —access-mode=ReadOnly)。接下来,稍微等一会(默认的同步时间为 1 分钟),等待 Backup 对象创建成功。

  1. # The default sync interval is 1 minute, so make sure to wait before checking.
  2. # You can configure this interval with the --backup-sync-period flag to the Velero server.
  3. velero backup describe <BACKUP-NAME>

最后,执行数据恢复:

  1. velero restore create --from-backup <BACKUP-NAME>
  2. velero restore get
  3. velero restore describe <RESTORE-NAME-FROM-GET-COMMAND>

参考文档