使用velero可以對集群進行備份和恢復,降低集群DR造成的影響。velero的基本原理就是將集群的數據備份到對象存儲中,在恢復的時候將數據從對象存儲中拉取下來。可以從官方文檔查看可接收的對象存儲,本地存儲可以使用Minio。下面演示使用velero將openstack上的openshift集群備份恢復到阿里雲的openshift上。
環境要求:kubernetes >1.7;openshift >3.7
注意:本次使用的velero鏡像來自官方dockerhub,版本為v1.2.0-beta.1,而非來自配置文件中的registry.cn-hangzhou.aliyuncs.com/acs/velero:latest
。建議采用最新鏡像,經驗證v1.1.0
版本的鏡像會出現velero無法在1min內同步對象存儲的問題(實際同步為1h)。
安裝velero
該步驟需要在openstack和阿里雲的openshift上執行,一個用於創建backup,一個執行restore。
使用阿里雲oss需要特定的插件支持,velero的安裝可以參見阿里雲官方文檔。
首先需要創建bucket,創建RAM用戶並授權該用戶,用戶所需要的權限如下,以ecs
開頭的用於操作雲盤快照,以oss
開頭的用於操作oss bucket。
{
"Version": "1",
"Statement": [
{
"Action": [
"ecs:DescribeSnapshots",
"ecs:CreateSnapshot",
"ecs:DeleteSnapshot",
"ecs:DescribeDisks",
"ecs:CreateDisk",
"ecs:Addtags",
"oss:PutObject",
"oss:GetObject",
"oss:DeleteObject",
"oss:GetBucket",
"oss:ListObjects"
],
"Resource": [
"*"
],
"Effect": "Allow"
}
]
}
修改官方項目中的install/credentials-velero
文件,內容如下,用於連接oss bucket:
ALIBABA_CLOUD_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID>
ALIBABA_CLOUD_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
ALIBABA_CLOUD_OSS_ENDPOINT=<ALIBABA_CLOUD_OSS_ENDPOINT>
在shell中設置如下變量,分別用於設置BackupStorageLocation和VolumeSnapshotLocation。REGION
可以從阿里雲backet的頁面看到,如oss-cn-beijing.aliyuncs.com
的REGION
就是beijing
BUCKET=<YOUR_BUCKET>
REGION=<YOUR_REGION>
按照官方文檔執行如下步驟即可創建velero
kubectl create namespace velero
kubectl create secret generic cloud-credentials --namespace velero --from-file cloud=install/credentials-velero
kubectl apply -f install/00-crds.yaml
sed -i "s#<BUCKET>#$BUCKET#" install/01-velero.yaml
sed -i "s#<REGION>#$REGION#" install/01-velero.yaml
kubectl apply -f install/01-velero.yaml
配置文件install/01-velero.yaml中使用的鏡像是從gcr.io/heptio-images/velero:latest同步的,可以在官方release中查看當前的最新版本
# sync from gcr.io/heptio-images/velero:latest
image: registry.cn-hangzhou.aliyuncs.com/acs/velero:latest
為了方便執行,可以下載velero命令行工具,拷貝到系統$PATH
路徑即可使用
velero的使用
velero的使用推薦觀看該視頻,講解的比較詳細。所有支持的命令可以通過--help
選項查看
velero會定期同步對象存儲中的backup操作(新增/刪除)
手動備份
備份集群的所有資源
velero backup create ${BACKUP_NAME}
--include-namespaces
選項可以指定備份某些命名空間下面的資源
velero backup create ${BACKUP_NAME} --include-namespaces ${NAMESPACE1},${NAMESPACE2}
--exclude-namespaces
選項可以指定備份排除某些命名空間下面的資源
velero backup create ${BACKUP_NAME} --exclude-namespaces ${NAMESPACE1},${NAMESPACE2}
--include-resources
選項可以指定備份哪些資源類型;--exclude-resources`可以指定排除某些資源類型
velero backup create ${BACKUP_NAME} --include-resources pod,secret
--ttl
可以指定backup
的生存周期,在ttl
超時后,backup
會被定期清理,ttl
默認30天
刪除backup
使用--confirm
可以直接刪除備份,無需確認
velero backup delete ${BACKUP_NAME} --confirm
定期backup
定期備份類似kubernetes的cronjob,會定期上傳backup到對象存儲。在首次執行velero schedule
會執行一次數據備份。
# Create a backup every 6 hours
velero create schedule ${SCHEDULE_NAME} --schedule="0 */6 * * *"
# Create a backup every 6 hours with the @every notation
velero create schedule ${SCHEDULE_NAME} --schedule="@every 6h"
# Create a daily backup of the web namespace
velero create schedule ${SCHEDULE_NAME} --schedule="@every 24h" --include-namespaces web
# Create a weekly backup, each living for 90 days (2160 hours)
velero create schedule ${SCHEDULE_NAME} --schedule="@every 168h" --ttl 2160h0m0s
restore
從backup創建restore
velero restore create ${RESTORE_NAME} --from-backup ${BACKUP_NAME}
從backup創建restore,restore默認名為 ${BACKUP_NAME}-<timestamp>
velero restore create --from-backup ${BACKUP_NAME}
從schedule最新一次的backup創建restore
velero restore create --from-schedule ${SCHEDULE_NAME}
指定backup中的某些資源創建restore
velero restore create --from-backup backup-2 --include-resources pod,secret
velero Hook
velero支持兩種Hook:Pre Hook
和Post Hook
,分別表示在backup前執行和在backup后執行
pre.hook.backup.velero.io/container
pre.hook.backup.velero.io/command
pre.hook.backup.velero.io/on-error
pre.hook.backup.velero.io/timeout
post.hook.backup.velero.io/container
post.hook.backup.velero.io/command
post.hook.backup.velero.io/on-error
post.hook.backup.velero.io/timeout
可以通過兩種方式注入Hook:Pod annotation和Backup spec
需要注意的是Hook執行失敗會導致backup操作失敗,因此除非必要,請不要設置Hook
velero debug
查看backup的詳細信息,帶上detail可以查看備份的資源內容
velero backup describe <backupName> --detail
查看backup的服務日志
velero backup logs <backupName>
查看restore 的詳細信息
velero restore describe <restoreName> --detail
查看restore 的服務日志
velero restore logs <restoreName>
查看velero服務日志
kubectl logs deployment/velero -n velero
download backup
使用velero backup download ${BACKUP_NAME}
可在本地生成一個backup的壓縮包,包含backup的各個資源
velero的刪除
執行以下命令可以刪除velero
kubectl delete namespace/velero clusterrolebinding/velero
kubectl delete crds -l component=velero
velero暴露Prometheus metrics
安裝后的velero默認不會暴露Prometheus metrics。部署如下service,通過訪問http://velero-exporter.velero.svc.cluster.local:8085/metrics
查看metrics信息
apiVersion: v1
kind: Service
metadata:
labels:
velero: exporter
name: velero-exporter
namespace: velero
spec:
ports:
- name: https
port: 8085
protocol: TCP
targetPort: 8085
selector:
component: velero
Disaster recovery
-
cluster1上創建
velero schedule
實現定期備份 -
cluster1發生DR時,在cluster2上執行如下命令即可
kubectl patch backupstoragelocation <STORAGE LOCATION NAME> \ --namespace velero \ --type merge \ --patch '{"spec":{"accessMode":"ReadOnly"}}'
velero restore create --from-backup <SCHEDULE NAME>-<TIMESTAMP>
kubectl patch backupstoragelocation <STORAGE LOCATION NAME> \ --namespace velero \ --type merge \ --patch '{"spec":{"accessMode":"ReadWrite"}}'
上述為官方解決方案,也可以將cluster2的
backupstoragelocation
直接設置為ReadOnly
,此時cluster將無法創建/刪除backup,僅能同步對象存儲中的內容這里是一個例子,實現了將一個集群備份到阿里雲上
TIPS:
-
openstack無法直接訪問阿里雲oss
可以在阿里ECS上創建反向代理,openstack通過反向代理連接阿里雲oss。此時需要在velero的配置文件
install/01-velero.yaml
中增加如下地址解析hostAliases: - hostnames: - "${BUCKET_NAME}.oss-cn-${REGION}-internal.aliyuncs.com" ip: "${PROXY_IP}"
在代理情況下,如果在node節點上使用
velero
命令行命令,需要在node節點上添加bucket${BUCKET_NAME}.oss-cn-${REGION}-internal.aliyuncs.com
的地址解析,如在/ets/hosts
中添加如下內容${OSS_PROXY_IP} ${BUCKET_NAME}.oss-cn-${REGION}-internal.aliyuncs.com
-
進行集群備份的時候需要兩個集群的kubernetes版本保持一致
-
備份集群資源時最好指定需要備份的內容,防止受環境無法備份的資源的影響,如pv/pvc
-
在cluster1創建backup到cluster2同步到該backup之間的時間差在90s以內,實現代碼在
pkg/controller/backup_sync_controller.go
,velero每30s會調調度backupSyncController.run
,backupSyncController.run
函數中會對比backupstoragelocations.velero.io
資源中的lastSyncedTime
字段,當前時間與該字段(上一次同步時間)的時間差大於1min時才會進行同步。status: lastSyncedTime: 2019-10-25T06:05:49.496158379Z
-
velero有字段GC功能,一些無法刪除或ttl超時的backup會在60min后被GC掉
-
velero集成了restic,用以備份容器的persistent volumes。使用velero備份persistent volumes時需要persistent volumes支持snapshots功能(快照功能通常由Amazon EBS Volumes, Azure Managed Disks, Google Persistent Disks等提供),否則需要單獨使用restic,詳見官方文檔。
PS:restic不會支持阿里OSS (╬▔皿▔)凸 -
如果沒有Ali OSS,也可以通過自行搭建Minio作為對象存儲服務