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

https://github.com/heptio/velero/releases 下载velero最新的稳定版。velero使用场景如下:

  • 进行集群级别更新前(比如集群升级)备份集群资源,防止集群数据丢失
  • 集群迁移时,将集群资源迁移到另一个新集群
  • 将生产环境的集群资源完整的备份复制到测试集群或开发集群

velero 工作原理

velero 主要包含两部分

  • 运行在集群中的 velero 服务
  • velero 命令行工具

velero操作包括 on-demand backup(按需备份)scheduled backup(定时备份)restore(还原备份),每一个操作都是一个定义在 k8s 集群的自定义资源crd(Custom Resource Definition ),velero 通过控制器 controllers 来 watch 这些crd资源来触发执行集群备份、还原和其他的相关动作。

我们可以使用 velero 备份集群的所有资源,也可以支持通过type、namespace 或者 label字段来过滤选择指定的资源备份。

On-demand backups(按需备份)

备份操作主要做两部分工作

  1. 拷贝打包集群资源对象,并上传到云服务商的对象存储
  2. 调用云服务商的api来制作 pv 卷的磁盘快照

velero支持在执行备份前设置回调钩子,比如在制作磁盘快照之前设置一个回调来把内存中的缓存全部写入磁盘。More about hook

集群备份不是一个严格的原子操作,如果集群在备份过程中创建或者更新资源对象,则这些变化可能不会包含到备份里面。

Scheduled backups(定时备份)

该操作用来支持定期备份集群资源,定期执行的表达式使用 cron 表达式表示。Scheduled backups 备份的资源一般命名格式是 - 的格式是 YYYYMMDDhhmmss。

Restores(还原备份)

Restores 操作用于从备份中恢复集群的资源对象和pv存储卷,还原恢复集群时,可以过滤只还原部分资源和pv卷,Restores 操作也支持namespace 重新映射,比如在执行恢复中,在namespace 是 “abc”下的对象可以在namespace “def”下重新创建。

备份工作流

执行备份时需要执行命令

velero backup create test-backup
  1. Velero client 会调用kubernetes api server 创建一个 Backup 对象
  2. BackupController 监测到新的 Backup 对象创建,并执行验证
  3. BackupController 开始备份,开始调用api server收集需要备份的所有数据
  4. BackupController 调用云服务商存储服务api上传备份文件
  5. BackupController 调用云服务商api,创建pv对应的磁盘快照

执行 velero backup create 创建备份时,默认会创建所有 persistent volumes 对应的磁盘快照,如果我们想要禁止创建快照,可以加上选项 --snapshot-volumes=false

设置备份过期

当创建备份时,可以使用选项 --ttl <DURATION> 来配置备份过期时间,如果 Velero 观测到备份已经过期,则会移除

  1. 备份的资源文件
  2. 所有的pv快照
  3. 所有与备份相关的Restores资源

部署实例

以 Azure 为例,部署Velero ,并执行备份和恢复。

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

  1. 创建存储账户
AZURE_BACKUP_RESOURCE_GROUP=Velero_Backups
az group create -n $AZURE_BACKUP_RESOURCE_GROUP --location WestUS

AZURE_STORAGE_ACCOUNT_ID="velero$(uuidgen | cut -d '-' -f5 | tr '[A-Z]' '[a-z]')"
az storage account create \
    --name $AZURE_STORAGE_ACCOUNT_ID \
    --resource-group $AZURE_BACKUP_RESOURCE_GROUP \
    --sku Standard_GRS \
    --encryption-services blob \
    --https-only true \
    --kind BlobStorage \
    --access-tier Hot

BLOB_CONTAINER=velero
az storage container create -n $BLOB_CONTAINER --public-access off --account-name $AZURE_STORAGE_ACCOUNT_ID
  1. 创建 service principal
AZURE_RESOURCE_GROUP=<NAME_OF_RESOURCE_GROUP>
AZURE_SUBSCRIPTION_ID=`az account list --query '[?isDefault].id' -o tsv`
AZURE_TENANT_ID=`az account list --query '[?isDefault].tenantId' -o tsv`
AZURE_CLIENT_SECRET=`az ad sp create-for-rbac --name "velero" --role "Contributor" --query 'password' -o tsv`
AZURE_CLIENT_ID=`az ad sp list --display-name "velero" --query '[0].appId' -o tsv`

cat << EOF  > ./credentials-velero
AZURE_SUBSCRIPTION_ID=${AZURE_SUBSCRIPTION_ID}
AZURE_TENANT_ID=${AZURE_TENANT_ID}
AZURE_CLIENT_ID=${AZURE_CLIENT_ID}
AZURE_CLIENT_SECRET=${AZURE_CLIENT_SECRET}
AZURE_RESOURCE_GROUP=${AZURE_RESOURCE_GROUP}
EOF
  1. 启动 Velero
velero install \
    --provider azure \
    --bucket $BLOB_CONTAINER \
    --secret-file ./credentials-velero \
    --backup-location-config resourceGroup=$AZURE_BACKUP_RESOURCE_GROUP,storageAccount=$AZURE_STORAGE_ACCOUNT_ID \
    --snapshot-location-config apiTimeout=<YOUR_TIMEOUT>

备份
创建定期备份:

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

灾难恢复

# Update your backup storage location to read-only mode 
kubectl patch backupstoragelocation <STORAGE LOCATION NAME> \
    --namespace velero \
    --type merge \
    --patch '{"spec":{"accessMode":"ReadOnly"}}'

# Create a restore with your most recent Velero Backup
velero restore create --from-backup <SCHEDULE NAME>-<TIMESTAMP>

# When ready, revert your backup storage location to read-write mode
kubectl patch backupstoragelocation <STORAGE LOCATION NAME> \
       --namespace velero \
       --type merge \
       --patch '{"spec":{"accessMode":"ReadWrite"}}'

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

velero backup create <BACKUP-NAME>

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

velero backup describe <BACKUP-NAME>

最后,执行数据恢复:

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