使用velero進行kubernetes災備


使用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.comREGION就是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 HookPost 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 annotationBackup 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.runbackupSyncController.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作為對象存儲服務


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM