如何在 DOKS 中使用 TrilioVault 执行备份和恢复

介紹

在本教程中,您將學習如何部署TrilioVault for Kubernetes(或TVK)到您的DOKS集群,創建備份,並在發生故障時從備份中恢復。您可以備份整個集群,或者可選擇基於命名空間或標籤的備份。

使用Trilio的優點:

  • 全面(或增量)備份您的集群,並在數據丟失的情況下恢復。
  • 從一個集群遷移到另一個集群。
  • 支持Helm發布備份。
  • 運行備份和恢復操作的預先和後置鉤子。
  • Web管理控制台,允許您詳細檢查您的備份/恢復操作狀態。
  • 定義您的備份的保留策略。
  • 應用程序生命周期(即TVK本身)可以通過專用的TrilioVault操作員來管理。
  • Velero集成。
  • 您可以備份和還原基於操作員的應用程序。

有關更多信息,請參閱TVK CRD官方文檔。

目錄

先決條件

完成本教程,您需要以下東西:

  1. A DO Spaces Bucket and access keys. Save the access and secret keys in a safe place for later use.
  2. A Git client to clone the Starter Kit repository.
  3. Helm,用於管理 TrilioVault 運算子的發行版和升級。
  4. Doctl 用於與 DigitalOcean API 互動。
  5. Kubectl 用於與 Kubernetes 互動。

要讓TrilioVault正確運作並備份您的PVCs,DOKS需要配置以支援容器存儲接口(簡稱CSI)。默認情況下,它已經安裝並配置了驅動程序。您可以使用以下命令進行檢查:

kubectl get storageclass

輸出應該類似於以下片段。請注意,提供程序是dobs.csi.digitalocean.com

NAME                         PROVISIONER                 RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
do-block-storage (default)   dobs.csi.digitalocean.com   Delete          Immediate           true                   10d

TrilioVault安裝還需要volumeSnapshot自定義資源定義(CRD)才能成功安裝。您可以使用以下命令進行檢查:

kubectl get crd | grep volumesnapshot

輸出應該類似於以下片段。如果未安裝VolumeSnapshotCRD,請參閱安裝VolumeSnapshot CRDs

volumesnapshotclasses.snapshot.storage.k8s.io         2022-02-01T06:01:14Z
volumesnapshotcontents.snapshot.storage.k8s.io        2022-02-01T06:01:14Z
volumesnapshots.snapshot.storage.k8s.io               2022-02-01T06:01:15Z

同樣,請確保CRD支持v1beta1v1 API版本。您可以運行以下命令檢查API版本:

kubectl get crd volumesnapshots.snapshot.storage.k8s.io -o yaml

在CRD YAML的末尾,您應該看到一個包含v1beta1v1值的storedVersions列表(如果未安裝,請參閱安裝VolumeSnapshot CRDs):

...
- lastTransitionTime: "2022-01-20T07:58:06Z"
    message: approved in https://github.com/kubernetes-csi/external-snapshotter/pull/419
    reason: ApprovedAnnotation
    status: "True"
    type: KubernetesAPIApprovalPolicyConformant
  storedVersions:
  - v1beta1
  - v1

步驟1 – 安裝用於Kubernetes的TrilioVault

在這一步,您將學習如何為DOKS部署TrilioVault並通過Helm管理TVK安裝。備份數據將存儲在前面在先決條件部分中創建的DO Spaces存儲桶中。

TrilioVault應用程序可以通過多種方式安裝:

  • 通過TrilioVault Operator。您定義一個TrilioVaultManager CRD,告訴TrilioVault操作者如何處理Trilio應用程序組件的安裝、後配置步驟和未來升級。
  • 通過完全由Helm管理的triliovault-operator圖表(在本教程中進行了涵蓋)。

使用Helm安裝TrilioVault

Starter Kit教程使用了TVK應用程序的集群安裝類型(applicationScope Helm值設置為“Cluster”)。本教程中的所有示例都依賴於這種類型的安裝才能正常運行。

首先,複製Starter Kit Git存儲庫並將目錄更改為您的本地副本:

git clone https://github.com/digitalocean/Kubernetes-Starter-Kit-Developers.git
cd Kubernetes-Starter-Kit-Developers

接下來,添加TrilioVault Helm存儲庫,並列出可用的圖表:

helm repo add triliovault-operator http://charts.k8strilio.net/trilio-stable/k8s-triliovault-operator
helm repo update triliovault-operator
helm search repo triliovault-operator

輸出看起來類似以下內容:

NAME                                            CHART VERSION   APP VERSION     DESCRIPTION
triliovault-operator/k8s-triliovault-operator   2.9.2           2.9.2           K8s-TrilioVault-Operator is an operator designe...

感興趣的圖表是 triliovault-operator/k8s-triliovault-operator,它將在叢集上安裝用於 Kubernetes 的 TrilioVault,以及 TrilioVault-Manager。您可以運行 helm show values triliovault-operator/k8s-triliovault-operator,並將其匯出到文件中以查看所有可用的選項。

然後,使用您選擇的編輯器(最好支持 YAML lint)打開並檢查起始套件存儲庫中提供的 TrilioVault Helm 值文件。

code 05-setup-backup-restore/assets/manifests/triliovault-values-v2.9.2.yaml

最後,使用 Helm 安裝 Kubernetes 的 TrilioVault:

helm install triliovault-operator triliovault-operator/k8s-triliovault-operator \
  --namespace tvk \
  --create-namespace \
  -f 05-setup-backup-restore/assets/manifests/triliovault-values.yaml

–create-namespace \

上述命令將使用 triliovault-values.yaml 中提供的參數安裝 TrilioVault Operator 和 TriloVault Manager(TVM)自定義資源。TVK 版本現在由 05-setup-backup-restore/assets/manifests/triliovault-values.yaml 文件中的 tag 字段管理,因此 helm 命令始終具有 TVK 的最新版本。

  1. 您可以在 values.yaml 中更新以下字段:
  2. installTVK.applicationScope 用於 TVK 安裝的範圍,例如 ClusterNamespaced
  3. installTVK.ingressConfig.host 用於 TVK UI 主機名,例如 tvk-doks.com

installTVK.ComponentConfiguration.ingressController.service.type 用於訪問 TVK UI 的服務類型,例如 NodePortLoadBalancer

helm ls -n tvk

現在,檢查您的 TVK 部署:

NAME                    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                           APP VERSION
triliovault-manager-tvk tvk             1               2022-06-08 08:30:08.490304959 +0000 UTC deployed        k8s-triliovault-2.9.2           2.9.2
triliovault-operator    tvk             1               2022-06-08 11:32:55.755395 +0300 EEST   deployed        k8s-triliovault-operator-2.9.2  2.9.2

輸出類似以下程式碼片段(STATUS 欄應顯示 deployed):

kubectl get deployments -n tvk

接下來,請驗證 TrilioVault 是否運作正常:

NAME                                            READY   UP-TO-DATE   AVAILABLE   AGE
k8s-triliovault-admission-webhook               1/1     1            1           83s
k8s-triliovault-control-plane                   1/1     1            1           83s
k8s-triliovault-exporter                        1/1     1            1           83s
k8s-triliovault-ingress-nginx-controller        1/1     1            1           83s
k8s-triliovault-web                             1/1     1            1           83s
k8s-triliovault-web-backend                     1/1     1            1           83s
triliovault-operator-k8s-triliovault-operator   1/1     1            1           4m22s

輸出類似以下程式碼片段。所有部署的 Pod 必須處於 Ready 狀態。

如果輸出如此,則已成功安裝 TVK。接下來,您將學習如何檢查授權類型和有效性,以及如何更新它。

TrilioVault 應用程式授權

  • 預設情況下,通過 Helm 安裝 TVK 時,不會自動安裝免費試用授權。您隨時可以前往 Trilio 網站,為您的叢集生成新的授權,以滿足您的需求(例如,您可以選擇基本的授權類型,如果您的叢集容量不超過 10 個節點,則可以無限期運行 TrilioVault)。免費試用授權讓您可以在無限叢集節點上運行 TVK 一個月。
  • 對於 DigitalOcean 用戶,Kubernetes 叢集最多可容納 100000 個節點的 TrilioVault 是免費的。他們可以按照以下步驟創建專為 DO 用戶提供的特殊授權。

Starter Kit 範例依賴叢集授權類型才能正常運作。

創建和檢查 TVK 應用程式授權

kubectl apply -f 05-setup-backup-restore/assets/manifests/triliovault/tvk_install_license.yaml

執行以下命令以為您的叢集創建新的授權(它通過 License CRD 進行管理):

上述命令將創建一個作業 job.batch/tvk-license-digitalocean,該作業將運行一個 Pod tvk-license-digitalocean-828rx,從 Trilio 授權伺服器提取授權並將其安裝在 DOKS 叢集上。作業完成後,將在 60 秒內刪除。

kubectl apply -f <YOUR_LICENSE_FILE_NAME>.yaml -n tvk

如果您從 Trilio 的網站下載免費授權,請使用此命令應用它:

kubectl get license -n tvk

請運行以下命令查看授權是否已安裝並在叢集上處於 Active 狀態。

NAME             STATUS   MESSAGE                                   CURRENT NODE COUNT   GRACE PERIOD END TIME   EDITION     CAPACITY   EXPIRATION TIME        MAX NODES
test-license-1   Active   Cluster License Activated successfully.   1                                            FreeTrial   100000     2023-02-25T00:00:00Z   1

輸出類似於以下內容。請注意 STATUS,應為 Active,以及 EDITION 欄位和 EXPIRATION TIME

kubectl describe license test-license-1 -n tvk

授權是通過一個名為 License 的特殊 CRD 進行管理。您可以運行以下命令來檢查它:

Name:         test-license-1
Namespace:    tvk
Labels:       <none>
Annotations:
              generation: 1
              triliovault.trilio.io/creator: system:serviceaccount:tvk:k8s-triliovault
              triliovault.trilio.io/instance-id: b060660d-4851-482b-8e60-4addd260e1d3
              triliovault.trilio.io/updater:
                [{"username":"system:serviceaccount:tvk:k8s-triliovault","lastUpdatedTimestamp":"2022-02-24T06:38:21.418828262Z"}]
API Version:  triliovault.trilio.io/v1
Kind:         License
Metadata:
  Creation Timestamp:  2022-02-24T06:38:21Z
...
Status:
  Condition:
    Message:           License Key changed
    Timestamp:         2022-02-24T06:38:21Z
    Message:           Cluster License Activated successfully.
    Status:            Active
    Timestamp:         2022-02-24T06:38:21Z
  Current Node Count:  1
  Max Nodes:           1
  Message:             Cluster License Activated successfully.
  Properties:
    Active:                        true
    Capacity:                      100000
    Company:                       TRILIO-KUBERNETES-LICENSE-GEN-DIGITALOCEAN-BASIC
    Creation Timestamp:            2022-02-24T00:00:00Z
    Edition:                       FreeTrial
    Expiration Timestamp:          2023-02-25T00:00:00Z
    Kube UID:                      b060660d-4851-482b-8e60-4addd260e1d3
    License ID:                    TVAULT-5a4b42c6-953c-11ec-8116-0cc47a9fd48e
    Maintenance Expiry Timestamp:  2023-02-25T00:00:00Z
    Number Of Users:               -1
    Purchase Timestamp:            2022-02-24T00:00:00Z
    Scope:                         Cluster
...

輸出類似於以下內容。請注意 MessageCapacity 欄位,以及 Edition

上述输出还将告诉您许可证何时到期,到期时间戳字段中,并且范围(在此情况下为集群)。您可以选择基于集群或基于命名空间的许可证类型。

更新 TVK 应用许可证

kubectl apply -f <YOUR_LICENSE_FILE_NAME>.yaml -n tvk

要更新许可证,您将需要从 Trilio 网站请求一个新的,方法是导航至许可页面来替换旧的许可证。填写完表单后,您应该会收到 License YAML 清单,可以使用kubectl将其应用到您的集群上。以下命令假定 TVK 安装在默认的tvk命名空间中(请根据需要替换<>占位符):

然后,您可以检查新的许可证状态,就像您已经学过的一样:
kubectl get license -n tvk

# 首先从 `tvk` 命名空间列出可用的 TVK 许可证
kubectl describe license <YOUR_LICENSE_NAME_HERE> -n tvk

# 从 `tvk` 命名空间获取特定许可证的信息

在下一步中,您将学习如何为 TrilioVault 定义存储后端来存储备份,称为目标。

第2步 – 建立 TrilioVault 目標以存儲備份

A typical Target definition looks like:

apiVersion: triliovault.trilio.io/v1
kind: Target
metadata:
  name: trilio-s3-target
  namespace: tvk
spec:
  type: ObjectStore
  vendor: Other
  enableBrowsing: true
  objectStoreCredentials:
    bucketName: <YOUR_DO_SPACES_BUCKET_NAME_HERE>
    region: <YOUR_DO_SPACES_BUCKET_REGION_HERE>
    url: 'https://<YOUR_DO_SPACES_BUCKET_ENDPOINT_HERE>'
    credentialSecret:
      name: trilio-s3-target
      namespace: tvk
  thresholdCapacity: 10Gi

TrilioVault 需要首先知道備份存儲在哪裡。TrilioVault 使用 target 這個術語來引用存儲後端,並通過一個名為 Target 的特殊 CRD 來管理它。支持以下目標類型:S3NFS。對於 DigitalOcean 和入門套件的目的,依賴於 S3 存儲類型是合理的,因為它便宜且可擴展。為了從增強的保護級別中受益,您可以創建多種目標類型(包括 S3NFS),這樣您的數據就可以在多個地方保持安全,從而實現備份冗余。

  • 在此配置中,
  • spec.type: 用於備份存儲的目標類型(S3 是對象存儲)。
  • spec.vendor: 托管目標的第三方存儲供應商(對於 DigitalOcean Spaces,您需要使用 Other 而不是 AWS)。
  • spec.enableBrowsing: 啟用目標的瀏覽功能。
  • spec.objectStoreCredentials: 定義訪問 S3 存儲所需的憑據(通過 credentialSecret),以及其他參數,如存儲桶區域和名稱。

spec.thresholdCapacity: 存儲備份數據的最大閾值容量。

apiVersion: v1
kind: Secret
metadata:
  name: trilio-s3-target
  namespace: tvk
type: Opaque
stringData:
  accessKey: <YOUR_DO_SPACES_ACCESS_KEY_ID_HERE> 要访问 S3 存储,每个目标都需要知道存储桶凭据。还必须创建一个 Kubernetes Secret:
  secretKey: <YOUR_DO_SPACES_SECRET_KEY_HERE>    # 值必须进行 base64 编码

# 值必须进行 base64 编码

请注意,密钥名称为 trilio-s3-target,并且它由先前解释的 Target CRD 中的 spec.objectStoreCredentials.credentialSecret 字段引用。 secret 可以位于安装 TrilioVault 的相同 namespace 中(默认为 tvk),也可以位于您选择的其他命名空间中。只需确保正确引用命名空间即可。另一方面,请确保通过 RBAC 保护存储 TrilioVault 密钥的命名空间,出于安全原因。

创建 TrilioVault 的目标的步骤:

cd Kubernetes-Starter-Kit-Developers

首先,更改本地计算机上克隆 Starter Kit Git 存储库的目录:

kubectl create secret generic trilio-s3-target \
  --namespace=tvk \
  --from-literal=accessKey="<YOUR_DO_SPACES_ACCESS_KEY_HERE>" \
  --from-literal=secretKey="<YOUR_DO_SPACES_SECRET_KEY_HERE>"

接下来,创建包含您的目标 S3 存储桶凭据的 Kubernetes 密钥(请相应替换 <> 占位符):

code 05-setup-backup-restore/assets/manifests/triliovault/triliovault-s3-target.yaml

–from-literal=accessKey=“<YOUR_DO_SPACES_ACCESS_KEY_HERE>” \

–from-literal=secretKey=“<YOUR_DO_SPACES_SECRET_KEY_HERE>”

kubectl apply -f 05-setup-backup-restore/assets/manifests/triliovault/triliovault-s3-target.yaml

然後,打開並檢查 Starter Kit 存儲庫中提供的目標清單文件,使用您選擇的編輯器(最好支持 YAML lint)。

現在,請相應地替換<>佔位符,為您的 DO Spaces Trilio 桶命名,例如 bucketNameregionurlcredentialSecret

kubectl get target trilio-s3-target  -n tvk

最後,保存清單文件並使用kubectl創建目標對象:

NAME               TYPE          THRESHOLD CAPACITY   VENDOR   STATUS      BROWSING ENABLED
trilio-s3-target   ObjectStore   10Gi                 Other    Available

接下來,TrilioVault 將生成一個名為 trilio-s3-target-validator 的工作程序,負責驗證您的 S3 桶(如可用性、權限等)。如果該工作成功完成,則認為桶是健康的或可用的,然後刪除 trilio-s3-target-validator 工作資源。如果發生了一些不好的事情,S3 目標驗證器工作將保持運行,以便您可以檢查日誌並找到可能的問題。

現在,請繼續檢查之前創建的目標資源是否健康:

輸出類似以下內容。請注意STATUS列的值 - 應該是Available,表示它處於健康狀態。
kubectl get pods -n tvk | grep trilio-s3-target-validator

如果輸出看起來像這樣,則您成功配置了 S3 目標對象。
如果目標對象無法變得健康,您可以檢查 trilio-s3-target-validator Pod 的日誌以找到問題:

# 首先,您需要找到目標驗證器
kubectl logs pod/trilio-s3-target-validator-tio99a-6lz4q -n tvk

# 輸出看起來類似於:

...
INFO:root:2021-11-24 09:06:50.595166: waiting for mount operation to complete.
INFO:root:2021-11-24 09:06:52.595772: waiting for mount operation to complete.
ERROR:root:2021-11-24 09:06:54.598541: timeout exceeded, not able to mount within time.
ERROR:root:/triliodata is not a mountpoint. We can't proceed further.
Traceback (most recent call last):
  File "/opt/tvk/datastore-attacher/mount_utility/mount_by_target_crd/mount_datastores.py", line 56, in main
    utilities.mount_datastore(metadata, datastore.get(constants.DATASTORE_TYPE), base_path)
  File "/opt/tvk/datastore-attacher/mount_utility/utilities.py", line 377, in mount_datastore
    mount_s3_datastore(metadata_list, base_path)
  File "/opt/tvk/datastore-attacher/mount_utility/utilities.py", line 306, in mount_s3_datastore
    wait_until_mount(base_path)
  File "/opt/tvk/datastore-attacher/mount_utility/utilities.py", line 328, in wait_until_mount
    base_path))
Exception: /triliodata is not a mountpoint. We can't proceed further.
...

#trilio-s3-target-validator-tio99a-6lz4q 1/1 Running 0 104s

# 現在,獲取日誌數據

輸出將是這個異常:

接下來,您將發現 TVK 網絡控制台,這是一個有用的附加功能,可以幫助您輕鬆管理備份和還原操作,還有其他許多功能。

步驟 3 – 了解 TVK Web 管理控制台

雖然您可以完全通過kubectl和 CRDs 來從 CLI 管理備份和還原操作,但 TVK 提供了一個Web 管理控制台,以通過 GUI 完成相同的操作。管理控制台通過點擊操作簡化了常見任務,提供了更好的 TVK 集群對象的可視化和檢查,以及創建災難恢復計劃(或 DRP)。

步驟 1 – 安裝 TrilioVault for Kubernetes中涵蓋的基於 Helm 的安裝已經處理了安裝 Web 管理控制台所需的組件。

kubectl get svc -n tvk

獲取TVK Web管理控制台訪問權限

NAME                                                            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
k8s-triliovault-admission-webhook                               ClusterIP   10.245.202.17    <none>        443/TCP                      13m
k8s-triliovault-ingress-nginx-controller                        NodePort    10.245.192.140   <none>        80:32448/TCP,443:32588/TCP   13m
k8s-triliovault-ingress-nginx-controller-admission              ClusterIP   10.3.20.89       <none>        443/TCP                      13m
k8s-triliovault-web                                             ClusterIP   10.245.214.13    <none>        80/TCP                       13m
k8s-triliovault-web-backend                                     ClusterIP   10.245.10.221    <none>        80/TCP                       13m
triliovault-operator-k8s-triliovault-operator-webhook-service   ClusterIP   10.245.186.59    <none>        443/TCP                      16m

要能夠訪問控制台並探索其提供的功能,您需要將TVK的入口控制器服務端口轉發。

首先,您需要從tvk命名空間識別ingress-nginx-controller服務:
installTVK:
  ingressConfig:
    host: "tvk-doks.com"

輸出看起來類似以下內容。搜索k8s-triliovault-ingress-nginx-controller行,並注意它在PORT(S)列上聆聽80端口。

127.0.0.1 tvk-doks.com

TVK正在使用Nginx Ingress Controller將流量路由到管理Web控制台服務。路由是基於主機的,主機名為tvk-doks.com,如在Starter Kit的Helm值文件中定義:

kubectl port-forward svc/k8s-triliovault-ingress-nginx-controller 8080:80 -n tvk

# 通過TVK入口nginx控制器訪問Web控制台時要使用的主機名

在手頭上有上述信息後,請繼續編輯/etc/hosts文件,並添加此條目:
doctl k8s cluster list

接下來,為TVK入口控制器服務創建端口轉發:
doctl kubernetes cluster kubeconfig show <YOUR_CLUSTER_NAME_HERE> > config_<YOUR_CLUSTER_NAME_HERE>.yaml

最後,導出您的DOKS集群的kubeconfig文件。此步驟是必需的,以便Web控制台可以對您進行身份驗證。

DOKS_CLUSTER_NAME="$(doctl k8s cluster list --no-header --format Name)"
doctl kubernetes cluster kubeconfig show $DOKS_CLUSTER_NAME > config_${DOKS_CLUSTER_NAME}.yaml

# 列出可用的集群

# 將集群配置保存為 YAML

如果您只有一個集群,則運行以下命令:

按照這些步驟後,您可以通過在網頁瀏覽器中導航到:http://tvk-doks.com:8080 訪問控制台。當要求kubeconfig文件時,請選擇您在上面的上一個命令中創建的文件。

請保管好生成的kubeconfig文件,因為它包含敏感數據。

  • 探索 TVK Web 控制台用戶界面
  • 從左側探索每個部分,例如:
  • 集群管理: 這顯示了主要集群和其他具有 TVK 實例的集群列表,使用多集群管理功能添加到主要的 OVH 集群中。
  • 備份與恢復: 這是主要儀表板,可讓您對整個叢集進行一般概述,如已發現的命名空間、應用程式、備份計劃清單、目標、鉤子、策略等。

監控: 有兩個選項- TrilioVault 監控Velero 監控 ,如果用戶在其 OVH 叢集上配置了 Velero。

災難恢復: 允許您管理和執行災難恢復操作。

災難恢復: 允許您管理和執行災難恢復操作。

您還可以通過導航到 備份與恢復 -> 目標 -> <命名空間> 頂部的下拉選單中,查看之前創建的 S3 目標。

更進一步,您可以通過點擊右側的 操作 按鈕,然後從彈出菜單中選擇 啟動瀏覽器 選項,瀏覽目標並列出可用的備份。為了使此操作生效,目標必須將 enableBrowsing 標誌設置為 true

有關更多信息和可用功能,請參閱 TVK Web 管理控制台用戶界面 官方文檔。

接下來,您將學習如何針對特定用例執行備份和還原操作。

第四步 – 命名空間備份和還原示例

apiVersion: triliovault.trilio.io/v1
kind: BackupPlan
metadata:
  name: ambassador-helm-release-backup-plan
  namespace: ambassador
spec:
  backupConfig:
    target:
      name: trilio-s3-target
      namespace: tvk
  backupPlanComponents:
    helmReleases:
      - ambassador

在這一步中,您將學習如何從您的 DOKS 集群中為整個命名空間(在本例中為 ambassador)創建一次性備份,並在之後進行還原,確保重新創建所有資源。TVK 具有一項功能,允許您以比僅僅命名空間更高的層次執行備份。

  • 創建 Ambassador Helm 發布的備份
  • 要在命名空間級別(或 Helm 發布)為單個應用程序執行備份,需要先有一個 BackupPlan,然後是一個 Backup CRD。BackupPlan 定義了備份流程的「什麼」、「哪裡」、「到哪裡」和「如何」,但它不執行實際的備份。Backup CRD 負責根據 BackupPlan 規範觸發實際的備份流程。
  • 在此配置中,

A typical Backup CRD looks like below:

apiVersion: triliovault.trilio.io/v1
kind: Backup
metadata:
  name: ambassador-helm-release-full-backup
  namespace: ambassador
spec:
  type: Full
  backupPlan:
    name: ambassador-helm-release-backup-plan
    namespace: ambassador

spec.backupConfig.target.name:告訴 TVK 使用哪個目標名稱來存儲備份。

  • spec.backupConfig.target.namespace:告訴 TVK 目標是在哪個命名空間中創建的。
  • spec.backupComponents: 定義了要備份的資源清單。

在這個配置中,

spec.type: 指定備份類型。

spec.backupPlan: 指定此備份應使用的 BackupPlan。

cd Kubernetes-Starter-Kit-Developers

發起 Ambassador Helm 發行一次性備份的步驟:

code 05-setup-backup-restore/assets/manifests/triliovault/ambassador-helm-release-backup-plan.yaml
code 05-setup-backup-restore/assets/manifests/triliovault/ambassador-helm-release-backup.yaml

首先,確保 Ambassador Edge Stack 已經部署在您的叢集中,按照 Ambassador Ingress 教程中的步驟進行。

kubectl apply -f 05-setup-backup-restore/assets/manifests/triliovault/ambassador-helm-release-backup-plan.yaml
kubectl apply -f 05-setup-backup-restore/assets/manifests/triliovault/ambassador-helm-release-backup.yaml

接下來,將目錄更改為在本地機器上克隆了 Starter Kit Git 儲存庫的目錄:

kubectl get backupplan ambassador-helm-release-backup-plan -n ambassador

然後,使用您選擇的編輯器(最好支持 YAML lint)打開並檢查 Starter Kit 儲存庫中提供的 Ambassador BackupPlan 和 Backup 清單檔案。

NAME                                  TARGET             ...   STATUS
ambassador-helm-release-backup-plan   trilio-s3-target   ...   Available

最後,使用 kubectl 創建 BackupPlan 和 Backup 資源。

kubectl get backup ambassador-helm-release-full-backup -n ambassador

現在,使用 kubectl 檢查 BackupPlan 狀態(針對 ambassador Helm 發行):

NAME                                  BACKUPPLAN                            BACKUP TYPE   STATUS       ...
ambassador-helm-release-full-backup   ambassador-helm-release-backup-plan   Full          InProgress   ...

輸出類似於以下內容。請注意 STATUS 欄位值,應設置為 Available

接下來,使用 kubectl 檢查 Backup 物件狀態:
NAME                                  BACKUPPLAN                            BACKUP TYPE   STATUS      ...   PERCENTAGE
ambassador-helm-release-full-backup   ambassador-helm-release-backup-plan   Full          Available   ...   100

輸出類似於以下內容。請注意 STATUS 欄位值,應設置為 InProgress,以及 BACKUP TYPE 設置為 Full

s3cmd ls s3://trilio-starter-kit --recursive

當所有大使的 Helm 發布元件都上傳到 S3 目標後,您應該得到以下結果:

2021-11-25 07:04           28  s3://trilio-starter-kit/6c68af15-5392-45bb-a70b-b26a93605bd9/
2021-11-25 07:04           28  s3://trilio-starter-kit/6c68af15-5392-45bb-a70b-b26a93605bd9/5ebfffb5-442a-455c-b0de-1db98e18b425/
2021-11-25 07:04          311  s3://trilio-starter-kit/6c68af15-5392-45bb-a70b-b26a93605bd9/5ebfffb5-442a-455c-b0de-1db98e18b425/backup-namespace.json.manifest.00000004
2021-11-25 07:04          302  s3://trilio-starter-kit/6c68af15-5392-45bb-a70b-b26a93605bd9/5ebfffb5-442a-455c-b0de-1db98e18b425/backup.json.manifest.00000004
2021-11-25 07:04          305  s3://trilio-starter-kit/6c68af15-5392-45bb-a70b-b26a93605bd9/5ebfffb5-442a-455c-b0de-1db98e18b425/backupplan.json.manifest.00000004
2021-11-25 07:04           28  s3://trilio-starter-kit/6c68af15-5392-45bb-a70b-b26a93605bd9/5ebfffb5-442a-455c-b0de-1db98e18b425/custom/
2021-11-25 07:04           28  s3://trilio-starter-kit/6c68af15-5392-45bb-a70b-b26a93605bd9/5ebfffb5-442a-455c-b0de-1db98e18b425/custom/metadata-snapshot/
2021-11-25 07:04          330  s3://trilio-starter-kit/6c68af15-5392-45bb-a70b-b26a93605bd9/5ebfffb5-442a-455c-b0de-1db98e18b425/custom/metadata-snapshot/metadata.json.manifest.00000002
...

# 輸出類似於(請注意 `STATUS` 變為 `Available`,而 `PERCENTAGE` 是 `100`)

kubectl get pods -n ambassador | grep metamover

如果輸出看起來像這樣,那麼您成功備份了大使的 Helm 發布。您可以繼續查看 TrilioVault 如何存儲 Kubernetes 元數據,方法是列出 TrilioVault S3 存儲桶內容。例如,您可以使用 s3cmd

ambassador-helm-release-full-backup-metamover-mg9gl0--1-2d6wx   1/1     Running   0          4m32s

輸出類似於以下內容。請注意,列出包含了 JSON 清單和 UID,代表 Kubernetes 對象。

kubectl logs pod/ambassador-helm-release-full-backup-metamover-mg9gl0--1-2d6wx -n ambassador -f

如果備份未能變為可用,您可以檢查 metamover Pod 的日誌以查找問題:

...
{"component":"meta-mover","file":"pkg/metamover/snapshot/parser/commons.go:1366","func":"github.com/trilioData/k8s-triliovault/pkg/metamover/snapshot/parser.(*Component).ParseForDataComponents","level":"info","msg":"Parsing data components of resource rbac.authorization.k8s.io/v1, Kind=ClusterRoleBinding: [edge-stack]","time":"2022-06-14T06:20:56Z"}
{"component":"meta-mover","file":"pkg/metamover/snapshot/parser/commons.go:1366","func":"github.com/trilioData/k8s-triliovault/pkg/metamover/snapshot/parser.(*Component).ParseForDataComponents","level":"info","msg":"Parsing data components of resource rbac.authorization.k8s.io/v1, Kind=RoleBinding: [edge-stack-agent-config]","time":"2022-06-14T06:20:56Z"}
...

輸出看起來類似於:

現在,取得日誌數據:

輸出看起來類似於以下內容。

helm delete ambassador -n ambassador

最後,您還可以通過在 Web 控制台中導航到 資源管理 -> 大使 -> 備份計畫,來檢查備份是否可用。請注意,它處於 Available 狀態,並且大使的 Helm 發布已在 元件詳情 子視圖中備份。

kubectl get all -n ambassador

刪除大使的 Helm 發布和資源

curl -Li http://quote.starter-kit.online/quote/
curl -Li http://echo.starter-kit.online/echo/

現在,請模擬一個災難,刻意刪除 ambassador Helm 發佈:

接下來,檢查命名空間資源是否已被刪除(清單應該為空):

如果要還原相同的命名空間,請確保原始應用程序組件已被刪除。特別是應用程序的 PVC 已被刪除。

apiVersion: triliovault.trilio.io/v1
kind: Restore
metadata:
  name: ambassador-helm-release-restore
  namespace: ambassador
spec:
  source:
    type: Backup
    backup:
      name: ambassador-helm-release-full-backup
      namespace: ambassador
  skipIfAlreadyExists: true

如果要恢复到另一个群集(迁移方案),请确保 TrilioVault for Kubernetes 也在远程命名空间/群集中运行。要恢复到新的群集(其中不存在 Backup CR),source.type 必须设置为 location。请参阅自定义资源定义恢复部分以查看按位置恢复的示例。

  • 当您删除ambassador命名空间时,与 ambassador 服务关联的负载均衡器资源也将被删除。因此,当您恢复ambassador服务时,DigitalOcean 将重新创建 LB。问题在于,您将获得新 IP地址用于 LB,因此您需要调整A 记录以将流量引导到托管在群集上的域中。
  • 要恢复特定的备份,您需要创建一个Restore CRD。典型的 Restore CRD 如下所示:
  • 在此配置中,

spec.source.type:指定要从何种备份类型进行恢复。

spec.source.backup:包含对要从中恢复的备份对象的引用。

code 05-setup-backup-restore/assets/manifests/triliovault/ambassador-helm-release-restore.yaml

spec.skipIfAlreadyExists:指定是否在恢复的命名空间中跳过资源的恢复,如果该资源已存在。

kubectl apply -f 05-setup-backup-restore/assets/manifests/triliovault/ambassador-helm-release-restore.yaml

恢復允許您為應用程序還原上次成功的備份。它用於還原單個命名空間或Helm發布,受備份CRD保護。備份CRD的識別名為ambassador-helm-release-full-backup

kubectl get restore ambassador-helm-release-restore -n ambassador

首先,從Starter Kit Git存儲庫檢查還原CRD示例:

NAME                              STATUS      DATA SIZE   START TIME             END TIME               PERCENTAGE COMPLETED   DURATION
ambassador-helm-release-restore   Completed   0           2021-11-25T15:06:52Z   2021-11-25T15:07:35Z   100                    43.524191306s

然後,使用kubectl創建還原資源:

最後,檢查還原對象的狀態:

輸出看起來類似如下。請注意STATUS列設置為Completed,以及PERCENTAGE COMPLETED設置為100

kubectl get all -n ambassador

如果輸出看起來像這樣,則ambassador Helm發布恢復過程已成功完成。

NAME                                    READY   STATUS    RESTARTS   AGE
pod/ambassador-5bdc64f9f6-42wzr         1/1     Running   0          9m58s
pod/ambassador-5bdc64f9f6-nrkzd         1/1     Running   0          9m58s
pod/ambassador-agent-bcdd8ccc8-ktmcv    1/1     Running   0          9m58s
pod/ambassador-redis-64b7c668b9-69drs   1/1     Running   0          9m58s

NAME                       TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                      AGE
service/ambassador         LoadBalancer   10.245.173.90    157.245.23.93   80:30304/TCP,443:30577/TCP   9m59s
service/ambassador-admin   ClusterIP      10.245.217.211   <none>          8877/TCP,8005/TCP            9m59s
service/ambassador-redis   ClusterIP      10.245.77.142    <none>          6379/TCP                     9m59s

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/ambassador         2/2     2            2           9m59s
deployment.apps/ambassador-agent   1/1     1            1           9m59s
deployment.apps/ambassador-redis   1/1     1            1           9m59s

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/ambassador-5bdc64f9f6         2         2         2       9m59s
replicaset.apps/ambassador-agent-bcdd8ccc8    1         1         1       9m59s
replicaset.apps/ambassador-redis-64b7c668b9   1         1         1       9m59s

在還原後驗證應用程序完整性

kubectl get hosts -n ambassador

檢查所有ambassador命名空間資源是否就位且正在運行:

NAME         HOSTNAME                   STATE   PHASE COMPLETED   PHASE PENDING   AGE
echo-host    echo.starter-kit.online    Ready                                     11m
quote-host   quote.starter-kit.online   Ready                                     11m

輸出看起來類似:

kubectl get mappings -n ambassador

獲取ambassador主機:

NAME                          SOURCE HOST                SOURCE PREFIX                               DEST SERVICE     STATE   REASON
ambassador-devportal                                     /documentation/                             127.0.0.1:8500
ambassador-devportal-api                                 /openapi/                                   127.0.0.1:8500
ambassador-devportal-assets                              /documentation/(assets|styles)/(.*)(.css)   127.0.0.1:8500
ambassador-devportal-demo                                /docs/                                      127.0.0.1:8500
echo-backend                  echo.starter-kit.online    /echo/                                      echo.backend
quote-backend                 quote.starter-kit.online   /quote/                                     quote.backend

輸出看起來類似如下。STATE應為Ready,以及HOSTNAME列指向完全合格的主機名。

獲取ambassador映射:

curl -Li http://quote.starter-kit.online/quote/
curl -Li http://echo.starter-kit.online/echo/

輸出類似以下內容。請注意,echo-backend 被映射到 echo.starter-kit.online 主機和 /echo/ 路徑前綴,quote-backend 也是如此。

現在,您需要更新您的 DNS A 記錄,因為 DigitalOcean 負載均衡器資源已被重新創建,並分配了新的外部 IP。

最後,請檢查後端應用程序是否也對 HTTP 請求作出回應。有關在入門套件教程中使用的後端應用程序,請參閱創建大使邊緣堆棧後端服務

下一步涉及整個集群的備份和還原。

步驟 5 – 整個集群備份和還原示例

A typical ClusterBackupPlan manifest targeting multiple namespaces looks like this:

apiVersion: triliovault.trilio.io/v1
kind: ClusterBackupPlan
metadata:
  name: starter-kit-cluster-backup-plan
  namespace: tvk
spec:
  backupConfig:
    target:
      name: trilio-s3-target
      namespace: tvk
  backupComponents:
    - namespace: ambassador
    - namespace: backend
    - namespace: monitoring

在此步驟中,您將模擬災害恢復方案。將刪除整個 DOKS 集群,然後從先前的備份中恢復重要應用程序。

創建 DOKS 集群備份

cd Kubernetes-Starter-Kit-Developers

這裡的主要想法是通過包括所有重要的命名空間來執行 DOKS 集群備份,這些命名空間包含了您的重要應用程序和配置。

code 05-setup-backup-restore/assets/manifests/triliovault/starter-kit-cluster-backup-plan.yaml
code 05-setup-backup-restore/assets/manifests/triliovault/starter-kit-cluster-backup.yaml

請注意,kube-system(或其他與 DOKS 集群相關的命名空間)未包含在列表中。通常情況下,除非有特殊情況需要在該級別保留一些設置,否則這些都不是必需的。

kubectl apply -f 05-setup-backup-restore/assets/manifests/triliovault/starter-kit-cluster-backup-plan.yaml
kubectl apply -f 05-setup-backup-restore/assets/manifests/triliovault/starter-kit-cluster-backup.yaml

首先,更改您本地機器上克隆的 Starter Kit Git 存儲庫的目錄:

kubectl get clusterbackupplan starter-kit-cluster-backup-plan -n tvk

然後,使用您選擇的編輯器(最好支持 YAML lint)打開並檢查 Starter Kit 存儲庫中提供的 ClusterBackupPlanClusterBackup 清單文件。

NAME                              TARGET             ...   STATUS
starter-kit-cluster-backup-plan   trilio-s3-target   ...   Available

最後,使用 kubectl 創建 ClusterBackupPlanClusterBackup 資源:

kubectl get clusterbackup starter-kit-cluster-backup -n tvk

現在,使用 kubectl 檢查 ClusterBackupPlan 的狀態:

NAME                        BACKUPPLAN                        BACKUP TYPE   STATUS      ...   PERCENTAGE COMPLETE
starter-kit-cluster-backup  starter-kit-cluster-backup-plan   Full          Available   ...   100

輸出看起來類似以下內容。請注意,STATUS 列的值應設置為 Available

接下來,使用 kubectl 檢查 ClusterBackup 的狀態:

輸出看起來類似以下內容。請注意,STATUS 列的值應設置為 Available,同時 PERCENTAGE COMPLETE 設置為 100

如果輸出看起來像上面那樣,則您所有重要的應用程序命名空間都已成功備份。

完整集群備份完成的時間可能會有所不同,具體取決於參與過程的命名空間和相關資源的數量。

您也可以打开网页控制台主仪表板并检查多命名空间备份(请注意,所有已备份的重要命名空间都以绿色突出显示,以蜂窝结构呈现):

doctl kubernetes cluster delete <DOKS_CLUSTER_NAME>

重新创建 DOKS 集群并恢复应用

需要牢记的重要一点是,每当您销毁一个 DOKS 集群然后进行恢复时,TVK 在恢复您的入口控制器时也会创建一个新的负载均衡器,并附带一个新的外部 IP。因此,请务必相应地更新您的 DigitalOcean DNS A 记录

现在,请删除整个 DOKS 集群(确保相应地替换<>占位符):

接下来,按照设置 DigitalOcean Kubernetes中的描述重新创建集群。

要执行恢复操作,您需要按照第 1 步 – 安装 Kubernetes 的 TrilioVault中的说明安装 TVK 应用程序。重要的是要使用相同的 Helm Chart 版本

安裝成功後,按照第2步 – 創建一個 TrilioVault 目標以存儲備份中的描述配置 TVK 目標,並將其指向相同的S3 存儲桶,其中包含您的備份數據。同時,請確保目標瀏覽已啟用。

接下來,按照TrilioVault 應用許可部分中的說明,驗證並激活新的許可證。

要訪問 Web 控制台用戶界面,請參閱訪問 TVK Web 管理控制台部分。

然後,導航到資源管理 -> TVK 命名空間 -> 目標(在 Starter Kit 的情況下,TVK 命名空間是tvk):

繼續前進,通過點擊操作按鈕來瀏覽目標並列出可用的備份。然後,從彈出菜單中選擇啟動瀏覽器選項。為了使此操作正常工作,目標必須將enableBrowsing標誌設置為true

現在,從列表中點擊starter-kit-cluster-backup-plan項目,然後點擊並展開右側子窗口中的starter-kit-cluster-backup項目:

kubectl get all --all-namespaces

要開始還原過程,請點擊還原按鈕。

檢查 DOKS 集群應用程序狀態

curl -Li http://quote.starter-kit.online/quote/
curl -Li http://echo.starter-kit.online/echo/

首先,驗證所有集群 Kubernetes 資源。

然後,確保您的 DNS A 記錄已更新,指向您的新負載平衡器外部 IP。

最後,後端應用程序也應對 HTTP 請求做出回應。請參考創建大使邊緣堆棧後端服務,了解 Starter Kit 教程中使用的後端應用程序。

在下一步中,您將學習如何為您的 DOKS 集群應用程序執行定期(或自動)備份。

kind: Policy
apiVersion: triliovault.trilio.io/v1
metadata:
  name: scheduled-backup-every-5min
  namespace: tvk
spec:
  type: Schedule
  scheduleConfig:
    schedule:
      - "*/5 * * * *" 步驟 6 - 定期備份

根據計劃自動進行備份是一個非常有用的功能。它允許您倒帶時間,將系統還原到以前的工作狀態,如果出現問題。本節提供了一個在 5 分鐘計劃(選擇了 kube-system 命名空間)上自動備份的示例。

apiVersion: triliovault.trilio.io/v1
kind: ClusterBackupPlan
metadata:
  name: kube-system-ns-backup-plan-5min-schedule
  namespace: tvk
spec:
  backupConfig:
    target:
      name: trilio-s3-target
      namespace: tvk
    schedulePolicy:
      fullBackupPolicy:
        name: scheduled-backup-every-5min
        namespace: tvk
  backupComponents:
    - namespace: kube-system
    - namespace: backend

首先,您需要創建一個類型為 SchedulePolicy CRD,以 cron 格式(與 Linux cron 相同)定義備份計劃。計劃策略可以用於 BackupPlanClusterBackupPlan CRD。典型的計劃策略 CRD 如下所示(定義了一個 5 分鐘 的計劃):

# 每 5 分鐘觸發

接下來,您可以將計劃策略應用於 ClusterBackupPlan CRD,例如:

kubectl apply -f 05-setup-backup-restore/assets/manifests/triliovault/scheduled-backup-every-5min.yaml

您可以注意到這是一個基本的 ClusterBackupPlan CRD,通過 spec.backupConfig.schedulePolicy 字段引用了之前定義的 Policy CRD。您可以為完整備份或增量備份創建單獨的策略,因此可以在 spec 中指定 fullBackupPolicyincrementalBackupPolicy

kubectl get policies -n tvk

現在,請使用 Starter Kit 教程提供的示例清單創建計劃 Policy

NAME                          POLICY     DEFAULT
scheduled-backup-every-5min   Schedule   false

將目錄更改為您本地機器上克隆 Starter Kit Git 存儲庫的位置。

檢查是否已創建策略資源:
kubectl apply -f 05-setup-backup-restore/assets/manifests/triliovault/kube-system-ns-backup-plan-scheduled.yaml

輸出類似於以下內容。請注意,類型為 SchedulePOLICY。
kubectl apply -f 05-setup-backup-restore/assets/manifests/triliovault/kube-system-ns-backup-scheduled.yaml

最後,為 kube-system 命名空間的定期備份創建資源:

kubectl get clusterbackupplan kube-system-ns-backup-plan-5min-schedule -n tvk

# 首先為 kube-system 命名空間創建備份計劃

NAME                                       TARGET             ...   FULL BACKUP POLICY            STATUS
kube-system-ns-backup-plan-5min-schedule   trilio-s3-target   ...   scheduled-backup-every-5min   Available

# 為 kube-system 命名空間創建並觸發定期備份

kubectl get clusterbackup kube-system-ns-full-backup-scheduled -n tvk

檢查 kube-system 的預定備份計劃狀態:

NAME                                   BACKUPPLAN                                 BACKUP TYPE   STATUS      ...
kube-system-ns-full-backup-scheduled   kube-system-ns-backup-plan-5min-schedule   Full          Available   ...

輸出類似以下內容。注意 FULL BACKUP POLICY 設置為先前創建的 scheduled-backup-every-5min 政策資源,以及應該為 STATUSAvailable 值。

檢查 kube-system 的預定備份狀態:

輸出類似以下內容。注意 BACKUPPLAN 值設置為先前創建的備份計劃資源,以及應該為 STATUSAvailable 值。

現在,您可以通過查詢集群備份資源並檢查 START TIME 列(kubectl get clusterbackup -n tvk)來確認備份是否按照定期間隔(5 分鐘)執行。它應反映出 5 分鐘的間隔,如下圖所示:

在下一步中,您將學習如何設置備份的保留策略。

第 7 步 – 備份保留策略

apiVersion: triliovault.trilio.io/v1
kind: Policy
metadata:
  name: sample-policy
spec:
  type: Retention
  retentionConfig:
    latest: 2
    weekly: 1
    dayOfWeek: Wednesday
    monthly: 1
    dateOfMonth: 15
    monthOfYear: March
    yearly: 1

保留策略允許您定義要保留的備份數量以及根據合規要求刪除備份的節奏。保留策略 CRD 提供了一個簡單的 YAML 規範,用於定義要保留的備份數量(以天、週、月、年、最新等形式)。

  • 使用保留策略
  • 保留策略可用于BackupPlanClusterBackupPlan CRD。 Retention类型的典型Policy清单如下:
  • 上述保留策略翻译为:
  • 每周,保留每个星期三的一个备份。

每月,在每个月的第15天保留一个备份。

A typical ClusterBackupPlan example configuration that has a retention set looks like:

apiVersion: triliovault.trilio.io/v1
kind: ClusterBackupPlan
metadata:
  name: kube-system-ns-backup-plan-5min-schedule
  namespace: tvk
spec:
  backupConfig:
    target:
      name: trilio-s3-target
      namespace: tvk
    retentionPolicy:
      fullBackupPolicy:
        name: ambassador-backups-retention-policy
        namespace: tvk
  backupComponents:
    - namespace: kube-system
    - namespace: backend

每年,在每年的三月份保留一个备份。

总体而言,应该保留最近的2个备份。

创建保留策略资源的基本流程与定期备份的流程相同。您需要定义一个BackupPlanClusterBackupPlan CRD来引用保留策略,然后拥有一个BackupClusterBackup对象来触发流程。

apiVersion: triliovault.trilio.io/v1
kind: Policy
metadata:
  name: garbage-collect-policy
spec:
  type: Cleanup
  cleanupConfig:
    backupDays: 5

请注意,它使用retentionPolicy字段来引用相关的策略。当然,您可以设置具有两种类型策略的备份计划,以便执行定期备份,并处理保留策略。

使用清理策略

您需要一种清理不再使用的所有对象的方法。为此,您需要引入Cleanup Policy CRD:

上述清理策略必须在TVK安装命名空间中定义。然后,系统会自动为您创建一个定期运行的cron作业,每30分钟运行一次,根据spec字段中指定的backupdays值删除失败的备份。

结论

  • 在本教程中,您学习了如何执行一次性备份以及定期备份,并进行恢复。
  • 本教程中解释的所有基本任务和操作旨在为您提供对TrilioVault for Kubernetes功能的基本介绍和理解。
  • 了解更多

使用Velero备份和恢复DOKS数据

Source:
https://www.digitalocean.com/community/developer-center/how-to-perform-backup-and-restore-using-triliovault-in-doks