Kubernetes備份恢復之velero實戰

flynike發表於2021-09-09

一 背景

Kubernetes 叢集備份是一大難點。雖然可以透過etcd來進行備份來實現K8S叢集備份,但是這種備份很難恢復單個 Namespace

對於K8s叢集資料的備份和恢復,以及複製當前叢集資料到其他叢集等都非常方便。可以在兩個叢集間克隆應用和名稱空間,來建立一個臨時性的開發環境。

二 Velero概述

2.1 什麼是Velero

Velero 是一個雲原生的災難恢復和遷移工具,它本身也是開源的, 採用 Go 語言編寫,可以安全的備份、恢復和遷移Kubernetes叢集資源和持久卷。

Velero 是西班牙語,意思是帆船,非常符合 Kubernetes 社群的命名風格。Velero 的開發公司 Heptio,之前已被 VMware 收購,其創始人2014就職於Google,當時被認為是 Kubernetes 核心成員。

Velero 是一種雲原生的Kubernetes最佳化方法,支援標準的K8S叢集,既可以是私有云平臺也可以是公有云。除了災備之外它還能做資源移轉,支援把容器應用從一個叢集遷移到另一個叢集。

Heptio Velero ( 以前的名字為 ARK) 是一款用於 Kubernetes 叢集資源和持久儲存卷(PV)的備份、遷移以及災難恢復等的開源工具。

使用velero可以對叢集進行備份和恢復,降低叢集DR造成的影響。velero的基本原理就是將叢集的資料備份到物件儲存中,在恢復的時候將資料從物件儲存中拉取下來。可以從官方文件檢視可接收的物件儲存,本地儲存可以使用Minio。下面演示使用velero將openstack上的openshift叢集備份恢復到阿里雲的openshift上。

2.2 Velero工作流程

2.2.1 流程圖

圖片描述

圖片描述

2.2.2 備份過程

  1. 本地 Velero 客戶端傳送備份指令。
  2. Kubernetes 叢集內就會建立一個 Backup 物件。
  3. BackupController 監測 Backup 物件並開始備份過程。
  4. BackupController 會向 API Server 查詢相關資料。
  5. BackupController 將查詢到的資料備份到遠端的物件儲存。

2.3 Velero的特性

Velero 目前包含以下特性:

  • 支援 Kubernetes 叢集資料備份和恢復
  • 支援複製當前 Kubernetes 叢集的資源到其它 Kubernetes 叢集
  • 支援複製生產環境到開發以及測試環境

2.4 Velero組建

Velero 元件一共分兩部分,分別是服務端和客戶端。

  • 服務端:執行在你 Kubernetes 的叢集中
  • 客戶端:是一些執行在本地的命令列的工具,需要已配置好 kubectl 及叢集 kubeconfig 的機器上

2.5 支援備份儲存

  • AWS S3 以及相容 S3 的儲存,比如:Minio
  • Azure BloB 儲存
  • Google Cloud 儲存
  • Aliyun OSS 儲存()

專案地址:

2.6 適應場景

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

2.7 與etcd的區別

與 Etcd 備份相比,直接備份 Etcd 是將叢集的全部資源備份起來。而 Velero 就是可以對 Kubernetes 叢集內物件級別進行備份。除了對 Kubernetes 叢集進行整體備份外,Velero 還可以透過對 TypeNamespaceLabel 等物件進行分類備份或者恢復。

注意: 備份過程中建立的物件是不會被備份的。

三 備份過程

VeleroKubernetes 叢集中建立了很多 CRD 以及相關的控制器,進行備份恢復等操作實質上是對相關 CRD 的操作。

# Velero 在 Kubernetes 叢集中建立的 CRD
$ kubectl -n velero get crds -l component=velero
NAME                                CREATED AT
backups.velero.io                   2019-08-28T03:19:56Z
backupstoragelocations.velero.io    2019-08-28T03:19:56Z
deletebackuprequests.velero.io      2019-08-28T03:19:56Z
downloadrequests.velero.io          2019-08-28T03:19:56Z
podvolumebackups.velero.io          2019-08-28T03:19:56Z
podvolumerestores.velero.io         2019-08-28T03:19:56Z
resticrepositories.velero.io        2019-08-28T03:19:56Z
restores.velero.io                  2019-08-28T03:19:56Z
schedules.velero.io                 2019-08-28T03:19:56Z
serverstatusrequests.velero.io      2019-08-28T03:19:56Z
volumesnapshotlocations.velero.io   2019-08-28T03:19:56Z

3.1 保障資料一致性

物件儲存的資料是唯一的資料來源,也就是說 Kubernetes 叢集內的控制器會檢查遠端的 OSS 儲存,發現有備份就會在叢集內建立相關 CRD 。如果發現遠端儲存沒有當前叢集內的 CRD 所關聯的儲存資料,那麼就會刪除當前叢集內的 CRD

3.2 支援的後端儲存

Velero 支援兩種關於後端儲存的 CRD,分別是 BackupStorageLocationVolumeSnapshotLocation

3.2.1 BackupStorageLocation

BackupStorageLocation 主要用來定義 Kubernetes 叢集資源的資料存放位置,也就是叢集物件資料,不是 PVC 的資料。主要支援的後端儲存是 S3 相容的儲存,比如:Mino 和阿里雲 OSS 等。

3.2.1.1 Minio

apiVersion: velero.io/v1
kind: BackupStorageLocation
metadata:
  name: default
  namespace: velero
spec:
# 只有 aws gcp azure
  provider: aws
  # 儲存主要配置
  objectStorage:
  # bucket 的名稱
    bucket: myBucket
    # bucket內的
    prefix: backup
# 不同的 provider 不同的配置
  config:
    #bucket地區
    region: us-west-2
    # s3認證資訊
    profile: "default"
    # 使用 Minio 的時候加上,預設為 false
    # AWS 的 S3 可以支援兩種 Url Bucket URL
    # 1 Path style URL: 
    # 2 Virtual-hosted style URL:  將 Bucker Name 放到了 Host Header中
    # 3 阿里雲僅僅支援 Virtual hosted 如果下面寫上 true, 阿里雲 OSS 會報錯 403
    s3ForcePathStyle: "false"
    # s3的地址,格式為 
    s3Url: http://minio:9000

3.2.1.2 阿里OSS

apiVersion: velero.io/v1
kind: BackupStorageLocation
metadata:
  labels:
    component: velero
  name: default
  namespace: velero
spec:
  config:
    region: oss-cn-beijing
    s3Url: http://oss-cn-beijing.aliyuncs.com
    s3ForcePathStyle: "false"
  objectStorage:
    bucket: build-jenkins
    prefix: ""
  provider: aws

3.2.2 VolumeSnapshotLocation

VolumeSnapshotLocation 主要用來給 PV 做快照,需要雲提供商提供外掛。阿里雲已經提供了外掛,這個需要使用 CSI 等儲存機制。你也可以使用專門的備份工具 Restic,把 PV 資料備份到阿里雲 OSS 中去(安裝時需要自定義選項)。

# 安裝時需要自定義選項
--use-restic

# 這裡我們儲存 PV 使用的是 OSS 也就是 BackupStorageLocation,因此不用建立 VolumeSnapshotLocation 物件
--use-volume-snapshots=false

Restic 是一款 GO 語言開發的資料加密備份工具,顧名思義,可以將本地資料加密後傳輸到指定的倉庫。支援的倉庫有 Local、SFTP、Aws S3、Minio、OpenStack Swift、Backblaze B2、Azure BS、Google Cloud storage、Rest Server。

專案地址:

四 實踐velero備份minio

4.1 環境要求

  • kubernetes >1.7;

4.2 部署velero

4.2.1 下載velero

wget 
tar -zxvf velero-v1.4.2-linux-amd64.tar.gz

4.2.2 安裝minio

cd velero-v1.4.2-linux-amd64
[root@master velero-v1.4.2-linux-amd64]# cat examples/minio/00-minio-deployment.yaml 
---
apiVersion: v1
kind: Namespace
metadata:
  name: velero

---
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: velero
  name: minio
  labels:
    component: minio
spec:
  strategy:
    type: Recreate
  selector:
    matchLabels:
      component: minio
  template:
    metadata:
      labels:
        component: minio
    spec:
      volumes:
      - name: storage
        emptyDir: {}
      - name: config
        emptyDir: {}
      containers:
      - name: minio
        image: minio/minio:latest
        imagePullPolicy: IfNotPresent
        args:
        - server
        - /storage
        - --config-dir=/config
        env:
        - name: MINIO_ACCESS_KEY
          value: "minio"
        - name: MINIO_SECRET_KEY
          value: "minio123"
        ports:
        - containerPort: 9000
        volumeMounts:
        - name: storage
          mountPath: "/storage"
        - name: config
          mountPath: "/config"

---
apiVersion: v1
kind: Service
metadata:
  namespace: velero
  name: minio
  labels:
    component: minio
spec:
  # ClusterIP is recommended for production environments.
  # Change to NodePort if needed per documentation,
  # but only if you run Minio in a test/trial environment, for example with Minikube.
  type: ClusterIP
  ports:
    - port: 9000
      targetPort: 9000
      protocol: TCP
  selector:
    component: minio

---
apiVersion: batch/v1
kind: Job
metadata:
  namespace: velero
  name: minio-setup
  labels:
    component: minio
spec:
  template:
    metadata:
      name: minio-setup
    spec:
      restartPolicy: OnFailure
      volumes:
      - name: config
        emptyDir: {}
      containers:
      - name: mc
        image: minio/mc:latest
        imagePullPolicy: IfNotPresent
        command:
        - /bin/sh
        - -c
        - "mc --config-dir=/config config host add velero  minio minio123 && mc --config-dir=/config mb -p velero/velero"
        volumeMounts:
        - name: config
          mountPath: "/config"

由上面資源清淡我們可以看到,在安裝minio的時候

MINIO_ACCESS_KEY:minio

MINIO_SECRET_KEY:minio123

service的地址為:,型別為ClusterIP,我們可以對映為NodePort檢視

最後執行了一個job來建立一個名稱為:velero/velero的bucket,在建立的時候適應了。

  • 安裝
[root@master velero-v1.4.2-linux-amd64]# kubectl apply -f examples/minio/00-minio-deployment.yaml 
namespace/velero created
deployment.apps/minio created
service/minio created
job.batch/minio-setup created
[root@master velero-v1.4.2-linux-amd64]# kubectl get all -n velero 
NAME                       READY   STATUS              RESTARTS   AGE
pod/minio-fdd868c5-xv52k   0/1     ContainerCreating   0          14s
pod/minio-setup-hktjb      0/1     ContainerCreating   0          14s


NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/minio   ClusterIP   10.233.39.204   <none>        9000/TCP   14s


NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/minio   0/1     1            0           14s

NAME                             DESIRED   CURRENT   READY   AGE
replicaset.apps/minio-fdd868c5   1         1         0       14s



NAME                    COMPLETIONS   DURATION   AGE
job.batch/minio-setup   0/1           14s        14s

待服務都已經啟動完畢,可以登入minio檢視velero/velero的bucket是否建立成功。

修改svc,登入檢視

[root@master velero-v1.4.2-linux-amd64]# kubectl get svc -n velero minio 
NAME    TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
minio   NodePort   10.233.39.204   <none>        9000:30401/TCP   2m26s

圖片描述

4.2.3 安裝velero

4.2.3.1 建立金鑰

安裝velero需要建立能正常登入minio的金鑰

cat > credentials-velero <<EOF
[default]
aws_access_key_id = minio
aws_secret_access_key = minio123
EOF
# 安裝velero
cp velero /usr/bin/

4.2.3.2 K8s叢集安裝velero

# 啟用快速補全
velero completion bash

velero install 
     --provider aws 
     --plugins velero/velero-plugin-for-aws:v1.0.0 
     --bucket velero 
     --secret-file ./credentials-velero 
     --use-volume-snapshots=false 
     --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=
     
[root@master velero-v1.4.2-linux-amd64]# velero install      --provider aws      --plugins velero/velero-plugin-for-aws:v1.0.0      --bucket velero      --secret-file ./credentials-velero      --use-volume-snapshots=false      --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=
CustomResourceDefinition/backups.velero.io: attempting to create resource
CustomResourceDefinition/backups.velero.io: created
CustomResourceDefinition/backupstoragelocations.velero.io: attempting to create resource
CustomResourceDefinition/backupstoragelocations.velero.io: created
CustomResourceDefinition/deletebackuprequests.velero.io: attempting to create resource
CustomResourceDefinition/deletebackuprequests.velero.io: created
CustomResourceDefinition/downloadrequests.velero.io: attempting to create resource
CustomResourceDefinition/downloadrequests.velero.io: created
CustomResourceDefinition/podvolumebackups.velero.io: attempting to create resource
CustomResourceDefinition/podvolumebackups.velero.io: created
CustomResourceDefinition/podvolumerestores.velero.io: attempting to create resource
CustomResourceDefinition/podvolumerestores.velero.io: created
CustomResourceDefinition/resticrepositories.velero.io: attempting to create resource
CustomResourceDefinition/resticrepositories.velero.io: created
CustomResourceDefinition/restores.velero.io: attempting to create resource
CustomResourceDefinition/restores.velero.io: created
CustomResourceDefinition/schedules.velero.io: attempting to create resource
CustomResourceDefinition/schedules.velero.io: created
CustomResourceDefinition/serverstatusrequests.velero.io: attempting to create resource
CustomResourceDefinition/serverstatusrequests.velero.io: created
CustomResourceDefinition/volumesnapshotlocations.velero.io: attempting to create resource
CustomResourceDefinition/volumesnapshotlocations.velero.io: created
Waiting for resources to be ready in cluster...
Namespace/velero: attempting to create resource
Namespace/velero: already exists, proceeding
Namespace/velero: created
ClusterRoleBinding/velero: attempting to create resource
ClusterRoleBinding/velero: created
ServiceAccount/velero: attempting to create resource
ServiceAccount/velero: created
Secret/cloud-credentials: attempting to create resource
Secret/cloud-credentials: created
BackupStorageLocation/default: attempting to create resource
BackupStorageLocation/default: created
Deployment/velero: attempting to create resource
Deployment/velero: created
Velero is installed! ⛵ Use 'kubectl logs deployment/velero -n velero' to view the status.

[root@master velero-v1.4.2-linux-amd64]# kubectl api-versions |grep velero
velero.io/v1

[root@master velero-v1.4.2-linux-amd64]# kubectl get pod -n velero
NAME                      READY   STATUS      RESTARTS   AGE
minio-fdd868c5-xv52k      1/1     Running     0          56m
minio-setup-hktjb         0/1     Completed   0          56m
velero-56fbc5d69c-8v2q7   1/1     Running     0          32m

至此velero就已經全部部署完成。

4.3 velero命令

$ velero create backup NAME [flags]

# 剔除 namespace
--exclude-namespaces stringArray                  namespaces to exclude from the backup

# 剔除資源型別
--exclude-resources stringArray                   resources to exclude from the backup, formatted as resource.group, such as storageclasses.storage.k8s.io

# 包含叢集資源型別 
--include-cluster-resources optionalBool[=true]   include cluster-scoped resources in the backup

# 包含 namespace
--include-namespaces stringArray                  namespaces to include in the backup (use '*' for all namespaces) (default *)

# 包含 namespace 資源型別
--include-resources stringArray                   resources to include in the backup, formatted as resource.group, such as storageclasses.storage.k8s.io (use '*' for all resources)

# 給這個備份加上標籤
--labels mapStringString                          labels to apply to the backup
-o, --output string                               Output display format. For create commands, display the object but do not send it to the server. Valid formats are 'table', 'json', and 'yaml'. 'table' is not valid for the install command.

# 對指定標籤的資源進行備份
-l, --selector labelSelector                      only back up resources matching this label selector (default <none>)

# 對 PV 建立快照
--snapshot-volumes optionalBool[=true]            take snapshots of PersistentVolumes as part of the backup

# 指定備份的位置
--storage-location string                         location in which to store the backup

# 備份資料多久刪掉

--ttl duration                                    how long before the backup can be garbage collected (default 720h0m0s)

# 指定快照的位置,也就是哪一個公有云驅動
--volume-snapshot-locations strings               list of locations (at most one per provider) where volume snapshots should be stored

4.4 測試

velero非常的人性化,在安裝包中已經為我們準備好了測試demo,我們可以利用測試demo來進行測試驗證。

4.4.1 建立測試應用

[root@master velero-v1.4.2-linux-amd64]# kubectl apply -f examples/nginx-app/base.yaml
namespace/nginx-example created
deployment.apps/nginx-deployment created
service/my-nginx created
[root@master velero-v1.4.2-linux-amd64]# kubectl get all -n nginx-example
NAME                                   READY   STATUS              RESTARTS   AGE
pod/nginx-deployment-f4769bfdf-8jrsz   0/1     ContainerCreating   0          12s
pod/nginx-deployment-f4769bfdf-sqfp4   0/1     ContainerCreating   0          12s
NAME               TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
service/my-nginx   LoadBalancer   10.233.10.49   <pending>     80:32401/TCP   13s
NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   0/2     2            0           14s
NAME                                         DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deployment-f4769bfdf   2         2         0       14s

4.4.2 執行備份

[root@master velero-v1.4.2-linux-amd64]# velero backup create nginx-backup --include-namespaces nginx-example
Backup request "nginx-backup" submitted successfully.
Run `velero backup describe nginx-backup` or `velero backup logs nginx-backup` for more details.
[root@master velero-v1.4.2-linux-amd64]# velero backup describe nginx-backup
Name:         nginx-backup
Namespace:    velero
Labels:       velero.io/storage-location=default
Annotations:  velero.io/source-cluster-k8s-gitversion=v1.15.5
              velero.io/source-cluster-k8s-major-version=1
              velero.io/source-cluster-k8s-minor-version=1
Phase:  Completed
Errors:    0
Warnings:  0
Namespaces:
  Included:  nginx-example
  Excluded:  <none>
Resources:
  Included:        *
  Excluded:        <none>
  Cluster-scoped:  auto
Label selector:  <none>
Storage Location:  default
Velero-Native Snapshot PVs:  auto
TTL:  720h0m0s

Hooks:  <none>

Backup Format Version:  1

Started:    2020-07-21 19:12:16 +0800 CST
Completed:  2020-07-21 19:12:24 +0800 CST

Expiration:  2020-08-20 19:12:16 +0800 CST

Total items to be backed up:  23
Items backed up:              23

Velero-Native Snapshots: <none included>

4.4.3 檢視備份資訊

  • 登入minio檢視備份資訊

圖片描述

圖片描述

  • 檢視目錄結構

圖片描述

4.4.4 進行恢復測試

4.4.4.1 刪除nginx服務

[root@master velero-v1.4.2-linux-amd64]# kubectl delete -f examples/nginx-app/base.yaml 
namespace "nginx-example" deleted
deployment.apps "nginx-deployment" deleted
service "my-nginx" deleted

4.4.4.2 恢復nginx服務

[root@master velero-v1.4.2-linux-amd64]# velero restore create --from-backup nginx-backup --wait
Restore request "nginx-backup-20200722134728" 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-20200722134728` and `velero restore logs nginx-backup-20200722134728`.
[root@master velero-v1.4.2-linux-amd64]# kubectl  get pods -n nginx-example
NAME                               READY   STATUS    RESTARTS   AGE
nginx-deployment-f4769bfdf-8jrsz   1/1     Running   0          7s
nginx-deployment-f4769bfdf-sqfp4   1/1     Running   0          7s

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

圖片描述

五 實踐velero備份OSS

本例項實踐如何在阿里雲容器服務 ACK 使用 Velero 完成備份和遷移。

ACK 外掛地址:

5.1 建立OSS bucket

由於為低頻儲存,型別為低頻訪問儲存,許可權為私有

圖片描述

  • 建立bucket,在配置velero 的prefix中用到

圖片描述

  • 配置物件儲存生命週期

圖片描述

圖片描述

5.2 建立阿里雲RAM使用者

在此最好需要建立一個阿里雲RAM使用者,用於操作OSS以及ACK資源,用於許可權分類,提升安全性。

5.2.1 新建許可權策略

圖片描述

策略內容:

{
"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"
    }
]
}

5.2.2 新建使用者

在新建使用者的時候要選擇 程式設計訪問,來獲取 AccessKeyIDAccessKeySecret,這裡請建立一個新用於用於備份,不要使用老使用者的 AK 和 AS。

圖片描述

5.3 部署服務端

5.3.1 拉取velero外掛

git clone 

5.3.2 配置引數

  • 修改 install/credentials-velero 檔案,將新建使用者中獲得的 AccessKeyIDAccessKeySecret 填入。

圖片描述

ALIBABA_CLOUD_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID>
ALIBABA_CLOUD_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>

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

1.建立 velero 名稱空間 和 阿里雲 secret

# 建立 velero 名稱空間
$ kubectl create namespace velero

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

2.替換crd中物件儲存資訊,部署crd和velero

# OSS Bucket 名稱
$ BUCKET=devops-k8s-backup

# OSS 所在可用區
$ REGION=cn-shanghai

# bucket 名字
$ prefix=velero

# 部署 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

# 替換bucket 中名字prifix


# 檢視差異
[root@master velero-plugin]# git diff install/01-velero.yaml
diff --git a/install/01-velero.yaml b/install/01-velero.yaml
index 5669860..7dd4c5a 100644
--- a/install/01-velero.yaml
+++ b/install/01-velero.yaml
@@ -31,10 +31,10 @@ metadata:
   namespace: velero
 spec:
   config:
-    region: <REGION>
+    region: cn-shanghai
   objectStorage:
-    bucket: <BUCKET>
-    prefix: ""
+    bucket: devops-k8s-backup
+    prefix: "velero"
   provider: alibabacloud
 
 ---
@@ -47,7 +47,7 @@ metadata:
   namespace: velero
 spec:
   config:
-    region: <REGION>
+    region: cn-shanghai
   provider: alibabacloud
 
 ---

# 建立認證secret
kubectl create namespace velero


# 部署velero
$ kubectl apply -f install/

# 檢視velero
$ kubectl  get pods -n velero
[root@master velero-plugin]# kubectl  get pods -n velero   
NAME                     READY   STATUS      RESTARTS   AGE
velero-fcc8d77b8-569jz   1/1     Running     0          45s


# 檢視位置
[root@master velero-plugin]# velero get backup-locations
NAME      PROVIDER       BUCKET/PREFIX              ACCESS MODE
default   alibabacloud   devops-k8s-backup/velero   ReadWrite

5.4 備份恢復

5.4.1 備份

$ velero backup create nginx-example --include-namespaces nginx-example

圖片描述

5.4.2 恢復

 velero restore create --from-backup nginx-example

5.4.3 週期性任務

# Create a backup every 6 hours
velero create schedule NAME --schedule="0 */6 * * *"

# Create a backup every 6 hours with the @every notation
velero create schedule NAME --schedule="@every 6h"

# Create a daily backup of the web namespace
velero create schedule NAME --schedule="@every 24h" --include-namespaces web

# Create a weekly backup, each living for 90 days (2160 hours)
velero create schedule NAME --schedule="@every 168h" --ttl 2160h0m0s


# 每日對anchnet-devops-dev/anchnet-devops-test/anchnet-devops-prod/xxxxx-devops-common-test 名稱空間進行備份
velero create schedule anchnet-devops-dev --schedule="@every 24h" --include-namespaces xxxxx-devops-dev 
velero create schedule anchnet-devops-test --schedule="@every 24h" --include-namespaces xxxxx-devops-test
velero create schedule anchnet-devops-prod --schedule="@every 24h" --include-namespaces xxxxx-devops-prod 
velero create schedule anchnet-devops-common-test --schedule="@every 24h" --include-namespaces xxxxx-devops-common-test 

圖片描述

圖片描述

六 注意事項

  • 在velero備份的時候,備份過程中建立的物件是不會被備份的。

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

  • 後期可以講velero作為一個crontjob來執行,定期備份資料。

  • 在高版本1.16.x中,報錯error: unable to recognize "filebeat.yml": no matches for kind "DaemonSet" in version "extensions/v1beta1" ,將yml配置檔案內的api介面修改為 apps/v1 ,導致原因為之間使用的kubernetes 版本是1.14.x版本,1.16.x 版本放棄部分API支援!

參考資料

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2618/viewspace-2826148/,如需轉載,請註明出處,否則將追究法律責任。

相關文章