K8S備份、恢復、遷移神器 Velero


Kubernetes 集群備份一直是我們的痛點。雖然可以通過Etcd v3備份與恢復來實現K8S集群備份,但是這種備份很難恢復單個 Namespace

今天推薦 Velero 工具,它提供以下功能:

  • 災備場景:提供備份恢復k8s集群的能力
  • 遷移場景:提供拷貝集群資源到其他集群的能力(復制同步開發,測試,生產環境的集群配置,簡化環境配置)

Velero 項目地址:https://github.com/vmware-tanzu/velero

Velero 阿里雲插件地址:https://github.com/AliyunContainerService/velero-plugin

Velero 架構

Velero 分為兩部分:

  • 服務端:部署在目標 k8s 集群中
  • 客戶端:運行在本地環境中,需要已配置好 kubectl 及集群 kubeconfig 的機器上

環境准備

K8S 集群版本為 v1.18.2

阿里雲 Velero 自定義 RAM策略

{
    "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"
        }
    ]
}
  • 創建阿里雲 OSS(對象存儲)Bucket

    • 創建 OSS Bucket 請訪問 https://www.aliyun.com/product/oss?spm=a2c6h.12873639.0.0.5f49340drYAEk0
  • 創建阿里雲 RAM用戶,並自定義策略,把自定義策略加入到新創建的RAM用戶

    • 創建自定義策略(策略在上方),請訪問鏈接 https://ram.console.aliyun.com/policies
    • 創建 RAM用戶並把AK信息復制出來為后面使用做准備,請參考鏈接 https://www.alibabacloud.com/help/zh/doc-detail/93720.htm

  • 下載官方 velero 客戶端 ( https://github.com/vmware-tanzu/velero/releases )

部署 velero 插件服務端

項目地址 https://github.com/AliyunContainerService/velero-plugin

下載 velero 阿里雲插件服務端

# 拉取 velero 阿里雲插件服務端
$ git clone https://github.com/AliyunContainerService/velero-plugin.git

# 進入 velero-plugin 目錄
$ cd velero-plugin

設置阿里雲AK信息

把上面創建的 RAM用戶 AK 信息填寫到 credentials-velero 文件中

$ vim install/credentials-velero

ALIBABA_CLOUD_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID>
ALIBABA_CLOUD_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>

設置備份 OSS Bucket 與 可用區 並部署 velero

1、設置備份 OSS Bucket 和 可用區 環境變量

# OSS Bucket 名稱
$ BUCKET=<YOUR_BUCKET>

# OSS 所在可用區
$ REGION=<YOUR_REGION>

2、創建 velero 命名空間 和 阿里雲 secret

# 創建 velero 命名空間
$ kubectl create namespace velero

# 創建阿里雲 secret
$ kubectl create secret generic cloud-credentials --namespace velero --from-file cloud=install/credentials-velero

3、部署 velero CRD 和 替換 OSS Bucket 與 OSS 所在可用區

# 部署 velero CRD
$ kubectl apply -f install/00-crds.yaml

# 替換 OSS Bucket 與 OSS 所在可用區
$ sed -i "s#<BUCKET>#$BUCKET#" install/01-velero.yaml
$ sed -i "s#<REGION>#$REGION#" install/01-velero.yaml

注意,本文把 velero 生成的備份都存放在 OSS velero-k8s-backu Bucket huawei-k8s 目錄中,具體如下配置:

# 下面是本文的修改
$ git diff  install/01-velero.yaml

@@ -31,10 +31,10 @@ metadata:
   namespace: velero
 spec:
   config:
-    region: <REGION>
+    region: cn-beijing
   objectStorage:
-    bucket: <BUCKET>
-    prefix: ""
+    bucket: velero-k8s-backup
+    prefix: "huawei-k8s"
   provider: alibabacloud

 ---
@@ -47,11 +47,11 @@ metadata:
   namespace: velero
 spec:
   config:
-    region: <REGION>
+    region: cn-beijing
   provider: alibabacloud

 ---
-apiVersion: extensions/v1beta1
+apiVersion: apps/v1
 kind: Deployment
 metadata:
   name: velero

4、部署 velero

# 部署 velero
$ kubectl apply -f install/01-velero.yaml

# 查看 velero
$ kubectl  get pods -n velero

NAME                      READY   STATUS    RESTARTS   AGE
velero-6d4c7d4c9b-5zwll   1/1     Running   0          3h5m

備份與恢復演示

1、部署一個測試 nginx 服務

$ kubectl apply -f examples/base.yaml

2、使用 velero 創建備份

# 備份 nginx-example 整個命名空間,當前命名空間只有一個nginx服務
$ velero backup create nginx-backup --include-namespaces nginx-example --wait

Backup request "nginx-backup" submitted successfully.
Waiting for backup to complete. You may safely press ctrl-c to stop waiting - your backup will continue in the background.
.
Backup completed with status: Completed. You may check for more information using the commands `velero backup describe nginx-backup` and `velero backup logs nginx-backup`.

下面是通過阿里雲 OSS 控制台查看,nginx-backup 已成功創建

3、刪除 nginx 服務

$ kubectl delete -f examples/base.yaml

deployment.apps "nginx-deployment" deleted
service "my-nginx" deleted

4、恢復 nginx 服務

# 使用 velero 恢復 nginx 服務
$ velero restore create --from-backup nginx-backup --wait

Restore request "nginx-backup-20200623174649" submitted successfully.
Waiting for restore to complete. You may safely press ctrl-c to stop waiting - your restore will continue in the background.

Restore completed with status: Completed. You may check for more information using the commands `velero restore describe nginx-backup-20200623174649` and `velero restore logs nginx-backup-20200623174649`.

# 查看 nginx 服務 是否成功恢復
$ kubectl  get pods -n nginx-example

NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-5bf87f5f59-gs2cs   1/1     Running   0          27s
nginx-deployment-5bf87f5f59-vts6d   1/1     Running   0          27s

注意:velero restore 恢復不會覆蓋已有的資源,只恢復當前集群中不存在的資源。已有的資源不會回滾到之前的版本,如需要回滾,需在restore之前提前刪除現有的資源。

帶有持久卷備份與恢復

持久卷備份

$ velero backup create nginx-backup-volume --snapshot-volumes --include-namespaces nginx-example

注意:該備份會在集群所在region給雲盤創建快照(當前還不支持NAS和OSS存儲),快照恢復雲盤只能在同region完成。

持久卷恢復

$ velero  restore create --from-backup nginx-backup-volume --restore-volumes

velero 更多命令使用

查看備份位置

$ velero get backup-locations

NAME      PROVIDER       BUCKET/PREFIX                  ACCESS MODE
default   alibabacloud   velero-k8s-backup/huawei-k8s   ReadWrite

查看已有的備份

$ velero get backup

查看已有的恢復

$ velero get restores

查看 velero 插件

$ velero get plugins

刪除 velero 備份

$ velero backup delete nginx-backup

創建集群所有namespaces備份,但排除 velero,metallb-system 命名空間

$ velero backup create all-ns-backup --snapshot-volumes=false --exclude-namespaces velero,metallb-system

恢復集群所有namespaces備份(對已經存在的服務不會覆蓋)

$ velero restore create --from-backup all-ns-backup

恢復集群 default,nginx-example namespaces備份

$ velero restore create --from-backup all-ns-backup --include-namespaces default,nginx-example

高級備份功能

周期性定時備份

# 每日3點進行備份
$ velero schedule create <SCHEDULE NAME> --schedule "0 3 * * *"

# 每日3點進行備份,備份保留48小時,默認保留30天
$ velero schedule create <SCHEDULE NAME> --schedule "0 3 * * *" --ttl 48

# 每6小時進行一次備份
$ velero create schedule <SCHEDULE NAME> --schedule="@every 6h"

# 每日對 web namespace 進行一次備份
$ velero create schedule <SCHEDULE NAME> --schedule="@every 24h" --include-namespaces web

添加指定的標簽備份時被排除

# 添加標簽
$ kubectl label -n <ITEM_NAMESPACE> <RESOURCE>/<NAME> velero.io/exclude-from-backup=true

# 為 default namespace 添加標簽
$ kubectl label -n default namespace/default velero.io/exclude-from-backup=true

遷移場景

和集群恢復場景類似,velero 可以幫助我們把一個k8s集群的resource導出並導入到另外一個集群,只要將每個Velero實例指向同一個雲對象存儲位置,Velero就可以幫助我們將資源從一個集群移植到另一個集群,請注意,Velero不支持跨雲提供商遷移持久卷。當前使用velero遷移集群功能最完善的場景是在同一個雲廠商的同一個region,可以恢復集群的應用和數據卷。

在集群1上做一個備份:

$ velero backup create <BACKUP-NAME> --snapshot-volumes

在集群2上做一個恢復:

$ velero restore create --from-backup <BACKUP-NAME> --restore-volumes

velero 清理

$ kubectl delete namespace/velero clusterrolebinding/velero
$ kubectl delete crds -l component=velero

總結

Velero 作為一個免費的開源組件,其能力基本可以滿足容器服務的災備和遷移的場景,推薦用戶將velero日常備份作為運維的一部分,未雨綢繆,防患未然。

參考鏈接

  • https://developer.aliyun.com/article/705007
  • https://github.com/AliyunContainerService/velero-plugin


免責聲明!

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



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