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

介绍

在本教程中,您将学习如何将TrilioVault for Kubernetes(简称TVK)部署到您的DOKS集群,创建备份,并在出现问题时从备份中恢复。您可以备份整个集群,或选择基于命名空间或标签的备份。

使用Trilio的优势:

  • 完全(或增量)备份集群,并在数据丢失时进行恢复。
  • 从一个集群迁移到另一个集群。
  • 支持Helm发布备份。
  • 运行备份和恢复操作的预处理和后处理挂钩。
  • Web管理控制台,允许您详细检查备份/恢复操作的状态。
  • 定义备份的保留策略。
  • 可以通过专用的TrilioVault Operator管理应用程序生命周期(即TVK本身)。
  • 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 Operator 的发布和升级。
  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

输出应该类似于以下代码片段。如果未安装VolumeSnapshot CRD,请参考安装 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

在这一步中,您将学习如何通过Helm部署TrilioVault用于DOKS,并管理TVK安装。备份数据将存储在先前在先决条件部分创建的DO Spaces存储桶中。

TrilioVault应用可以通过多种方式安装:

  • 通过TrilioVault Operator。您定义一个TrilioVaultManager CRD,告诉TrilioVault操作符如何处理Trilio应用程序组件的安装、后配置步骤和未来升级。
  • 通过由Helm完全管理的triliovault-operator图表(在本教程中介绍)。

使用Helm安装TrilioVault

Starter Kit教程使用Cluster安装类型来安装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 管理器。您可以运行helm show values triliovault-operator/k8s-triliovault-operator并将其导出到文件中以查看所有可用选项。

然后,使用您选择的编辑器(最好支持 YAML lint)打开并检查 Starter kit 存储库中提供的 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 管理器(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 客户提供的特殊许可证。

启动套件示例依赖于 Cluster 许可证类型才能正常运行。

创建和检查 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

然后,打开并检查启动套件存储库中提供的目标清单文件,使用您选择的编辑器(最好支持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 Web 控制台,这是一个非常有用的补充,可以帮助您轻松管理备份和恢复操作,以及许多其他操作。

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

虽然您可以通过 kubectl 和 CRDs 完全通过 CLI 管理备份和恢复操作,但 TVK 提供了一个 Web 管理控制台,通过 GUI 完成相同的操作。管理控制台通过点按操作简化常见任务,提供更好的 TVK 集群对象的可视化和检查,以及创建灾难恢复计划(或 DRPs)。

步骤 1 – 安装用于 Kubernetes 的 TrilioVault 中涵盖的基于 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 控制器将流量路由到管理 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。

灾难恢复:允许您管理和执行灾难恢复操作。

灾难恢复:允许您管理和执行灾难恢复操作。

您还可以通过导航到备份与恢复->目标-> <Namespace> tvk从顶部的下拉菜单中查看之前创建的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:指定此备份应使用的备份计划。

cd Kubernetes-Starter-Kit-Developers

发起一次性备份的大使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

首先,请确保按照大使Ingress教程中的步骤在您的集群中部署了Ambassador Edge Stack。

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

如果输出看起来像这样,那么您成功备份了 ambassador Helm 发布。您可以继续查看 TrilioVault 如何存储 Kubernetes 元数据,方法是列出 TrilioVault S3 存储桶内容。例如,您可以使用 s3cmd:

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

输出类似于以下内容。请注意,列表包含表示 Kubernetes 对象的 JSON 清单和 UID。

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 也在远程命名空间/集群中运行。要恢复到新集群(其中不存在备份 CR),source.type 必须设置为 location。请参考自定义资源定义还原部分以查看按位置恢复的示例。

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

恢复允许您恢复应用程序的最后一次成功备份。它用于恢复由备份CRD保护的单个命名空间或Helm发布。备份CRD由其名称ambassador-helm-release-full-backup标识。

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

首先,检查来自Starter Kit Git存储库的Restore 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创建Restore资源:

最后,检查Restore对象的状态:

输出类似于以下内容。注意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同理。

现在,您需要更新您的DNSA记录,因为DigitalOcean负载均衡器资源已经重新创建,并且分配了一个新的外部IP。

最后,检查后端应用程序是否也响应HTTP请求。请参考创建大使边缘堆栈后端服务有关Starter Kit教程中使用的后端应用程序。

下一步涉及整个集群的备份和恢复。

第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

如果输出看起来像上面那样,那么您所有重要的应用程序命名空间都已成功备份。

完整的集群备份可能需要一段时间才能完成,这取决于涉及的命名空间和相关资源的数量。

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

doctl kubernetes cluster delete <DOKS_CLUSTER_NAME>

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

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

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

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

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

安装成功后,请按照第二步 – 创建用于存储备份的 TrilioVault 目标中的说明配置 TVK 目标,并将其指向与您的备份数据位于同一S3 存储桶。另外,请确保目标浏览已启用。

接下来,请按照TrilioVault 应用许可部分的说明验证并激活新许可证。

要访问 Web 控制台用户界面,请参阅获取 TVK Web 管理控制台访问权限部分。

然后,导航至资源管理 -> TVK 命名空间 -> 目标(如果是入门套件,则 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 教程中使用的后端应用程序,请参阅 创建 Ambassador Edge Stack 后端服务

在下一步中,您将学习如何为您的 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

输出类似于以下内容。注意 POLICY 类型设置为 Schedule。
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 策略资源,以及应为 AvailableSTATUS

检查 kube-system 的预定备份状态:

输出结果类似于以下内容。注意 BACKUPPLAN 的值设置为先前创建的备份计划资源,以及应为 AvailableSTATUS

现在,您可以通过查询集群备份资源并检查 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 安装命名空间中定义。然后,系统会自动为您创建一个定期运行的定时作业,每30分钟运行一次,并根据规范字段中指定的backupdays值删除失败的备份。

结论

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

使用 Velero 备份和还原 DOKS 数据

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