介绍
在本教程中,您将学习如何将TrilioVault for Kubernetes(简称TVK)部署到您的DOKS集群,创建备份,并在出现问题时从备份中恢复。您可以备份整个集群,或选择基于命名空间或标签的备份。
使用Trilio的优势:
- 完全(或增量)备份集群,并在数据丢失时进行恢复。
- 从一个集群迁移到另一个集群。
- 支持Helm发布备份。
- 运行备份和恢复操作的预处理和后处理挂钩。
- Web管理控制台,允许您详细检查备份/恢复操作的状态。
- 定义备份的保留策略。
- 可以通过专用的TrilioVault Operator管理应用程序生命周期(即TVK本身)。
- Velero集成。
- 您可以备份和恢复基于运营商的应用程序。
有关更多信息,请参阅官方文档中的TVK CRD。
目录
- 先决条件
- 步骤 1 – 安装用于 Kubernetes 的 TrilioVault
- 步骤 2 – 创建用于存储备份的 TrilioVault 目标
- 步骤 3 – 了解 TVK Web 管理控制台
- 步骤 4 – 命名空间备份和还原示例
- 步骤 5 – 完整集群备份和还原示例
- 步骤 6 – 定时备份
- 步骤 7 – 备份保留策略
- 结论
先决条件
要完成本教程,您需要以下内容:
- A DO Spaces Bucket and access keys. Save the access and secret keys in a safe place for later use.
- A Git client to clone the Starter Kit repository.
- Helm,用于管理 TrilioVault Operator 的发布和升级。
- Doctl,用于与 DigitalOcean API 进行交互。
- Kubectl,用于 Kubernetes 交互。
要使 TrilioVault 正常工作并备份您的 PVCs,需要配置 DOKS 以支持容器存储接口(CSI)。默认情况下,它已经安装并配置了驱动程序。您可以使用以下命令进行检查:
输出应该类似于以下代码片段。请注意,提供程序是 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)。您可以使用以下命令进行检查:
输出应该类似于以下代码片段。如果未安装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 支持 v1beta1
和 v1
两个 API 版本。您可以运行以下命令来检查 API 版本:
在 CRD YAML 的末尾,您应该看到一个包含 v1beta1
和 v1
值的 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存储库并将目录更改为您的本地副本:
接下来,添加TrilioVault Helm存储库,并列出可用的图表:
输出类似以下内容:
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 值文件。
最后,使用 Helm 安装 Kubernetes 的 TrilioVault:
–create-namespace \
上述命令使用triliovault-values.yaml
中提供的参数安装 TrilioVault Operator 和 TriloVault 管理器(TVM)自定义资源。TVK 版本现在由05-setup-backup-restore/assets/manifests/triliovault-values.yaml
文件中的tag
字段管理,因此 helm 命令始终具有 TVK 的最新版本。
- 您可以在
values.yaml
中更新以下字段: installTVK.applicationScope
用于 TVK 安装的范围,例如Cluster
或Namespaced
installTVK.ingressConfig.host
用于 TVK UI 主机名,例如tvk-doks.com
installTVK.ComponentConfiguration.ingressController.service.type
用于访问 TVK UI 的服务类型,例如NodePort
或LoadBalancer
现在,检查您的 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
):
接下来,验证 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。接下来,您将学习如何检查许可证类型和有效性,以及如何续订许可证。
- 默认情况下,通过 Helm 安装 TVK 时,并不会自动安装免费试用许可证。您可以随时访问 Trilio 网站并为您的集群生成一个适合您需求的新许可证(例如,您可以选择基本许可证类型,让您在集群容量不超过 10 个节点时无限制地运行 TrilioVault)。免费试用许可证可让您在无限制的集群节点上运行 TVK 一个月。
- 对于 DigitalOcean 用户,Kubernetes 集群最多可容纳 100000 个节点的用户,TrilioVault 是免费的。他们可以按照以下步骤创建专门为 DO 客户提供的特殊许可证。
启动套件示例依赖于 Cluster 许可证类型才能正常运行。
运行以下命令为您的集群创建新许可证(通过 License CRD 进行管理):
上述命令将创建一个作业 job.batch/tvk-license-digitalocean
,该作业将运行一个 Pod tvk-license-digitalocean-828rx
,以从 Trilio 许可证服务器获取许可证并将其安装在 DOKS 集群上。作业完成后,将在 60 秒内删除。
如果您从 Trilio 的网站下载免费许可证,请使用此命令应用它:
请运行以下命令查看许可证是否已在您的集群中安装并处于 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
。
许可证通过名为 License
对象的特殊 CRD 进行管理。您可以运行以下命令检查它:
输出类似于以下内容。注意 Message
和 Capacity
字段,以及 Edition
。
上述输出还会告诉您许可证何时到期,在 到期时间戳
字段中,以及 范围
(在本例中为 集群
)。您可以选择集群范围许可证类型或基于命名空间的许可证。
要续订许可证,您将需要从 Trilio 网站请求一个新的许可证,方法是导航到 许可证页面 以替换旧的许可证。填写完表单后,您应该会收到 License YAML 清单,可以使用 kubectl
应用到您的集群中。以下命令假定 TVK 安装在默认的 tvk
命名空间中(请根据需要替换 <>
占位符):
# 从 `tvk` 命名空间获取有关特定许可证的信息
在下一步中,您将学习如何为 TrilioVault 定义存储后端以存储备份,称为目标。
A typical Target
definition looks like:
TrilioVault 首先需要知道在哪里存储您的备份。TrilioVault 使用 目标(target)
术语引用存储后端,并通过名为 目标(Target)
的特殊 CRD 进行管理。支持以下目标类型:S3
和 NFS
。针对 DigitalOcean 和入门套件的目的,依赖于 S3
存储类型是合理的,因为它便宜且可扩展。为了获得更高级别的保护,您可以创建多种目标类型(包括 S3
和 NFS
),以便将数据安全地保存在多个位置,从而实现备份冗余。
- 在此配置中,
spec.type
: 用于备份存储的目标类型(S3 是对象存储)。spec.vendor
: 托管目标的第三方存储供应商(对于 DigitalOcean Spaces,您需要使用Other
而不是AWS
)。spec.enableBrowsing
: 启用目标的浏览。spec.objectStoreCredentials
: 定义访问S3
存储所需的凭据(通过credentialSecret
),以及其他参数,如存储桶区域和名称。
spec.thresholdCapacity
: 存储备份数据的最大阈值容量。
# 值必须是base64编码
请注意,秘钥名称为trilio-s3-target
,并且被先前解释的Target CRD的spec.objectStoreCredentials.credentialSecret
字段引用。该secret
可以在安装了 TrilioVault 的相同namespace
中(默认为 tvk),或者在您选择的其他命名空间中。只需确保正确引用命名空间。另一方面,请确保为安全原因通过 RBAC 保护存储 TrilioVault 秘钥的命名空间。
创建 TrilioVault 的目标的步骤:
首先,更改您本地机器上克隆了 Starter Kit Git 存储库的目录:
接下来,创建包含目标 S3 存储桶凭据的 Kubernetes 秘钥(请相应替换<>
占位符):
–from-literal=accessKey=“<YOUR_DO_SPACES_ACCESS_KEY_HERE>” \
–from-literal=secretKey=“<YOUR_DO_SPACES_SECRET_KEY_HERE>”
然后,打开并检查启动套件存储库中提供的目标清单文件,使用您选择的编辑器(最好支持YAML lint)。
现在,请相应地替换<>
占位符,以用于您的DO Spaces Trilio存储桶,例如bucketName
、region
、url
和credentialSecret
。
最后,保存清单文件并使用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目标验证器作业将继续运行,以便您可以检查日志并找到可能的问题。
现在,请继续检查之前创建的目标资源是否健康:
# 输出类似于:
...
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 管理控制台所需的组件。
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 的入口控制器服务进行端口转发。
输出结果类似于以下内容。搜索 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 值文件中所定义:
# 通过 TVK 入口 nginx 控制器访问 Web 控制台时要使用的主机名
最后,导出您的 DOKS 集群的 kubeconfig
文件。这一步是必需的,以便 Web 控制台可以对您进行身份验证。
# 列出可用的集群
# 将集群配置保存为 YAML
如果您只有一个集群,则运行以下命令:
按照这些步骤操作后,您可以通过浏览器访问控制台,导航到:http://tvk-doks.com:8080。当要求提供kubeconfig
文件时,请选择您在上述最后一个命令中创建的文件。
请保管好生成的kubeconfig
文件,因为其中包含敏感数据。
- 探索 TVK Web 控制台用户界面
- 从左侧的每个部分进行探索,例如:
- 集群管理: 显示主要集群和其他集群的列表,这些集群具有 TVK 实例,使用多集群管理功能添加到主 OVH 集群中。
- 备份与恢复:这是主要的仪表板,为您提供整个集群的概览,例如发现的命名空间、应用程序、备份计划列表、目标、钩子、策略等。
监控:有两个选项-TrilioVault监控和Velero监控,如果用户在其OVH集群上配置了Velero。
灾难恢复:允许您管理和执行灾难恢复操作。
灾难恢复:允许您管理和执行灾难恢复操作。
您还可以通过导航到备份与恢复->目标-> <Namespace> tvk从顶部的下拉菜单中查看之前创建的S3目标。
更进一步,您可以通过单击右侧的操作按钮,然后从弹出菜单中选择启动浏览器选项来浏览目标并列出可用的备份。为此工作,目标必须将enableBrowsing
标志设置为true
。
有关更多信息和可用功能,请参阅TVK Web管理控制台用户界面官方文档。
接下来,您将学习如何针对特定用例执行备份和恢复操作。
在这一步中,您将学习如何从您的 DOKS 集群中创建一个整个命名空间的一次性备份(在本例中是ambassador
),并在之后恢复它,确保所有资源都被重新创建。TVK 有一个功能,允许您在比命名空间更高的级别执行备份。
- 创建 Ambassador Helm 发布备份
- 要在命名空间级别(或 Helm 发布)执行单个应用程序的备份,需要 BackupPlan 和 Backup CRD。BackupPlan 是备份过程的“什么”,“在哪里”,“到哪里”和“如何”定义,但它不执行实际备份。Backup CRD 负责触发实际的备份过程,由 BackupPlan 规范指示。
- 在这个配置中,
A typical Backup CRD looks like below:
spec.backupConfig.target.name
:告诉 TVK 使用哪个目标名称来存储备份。
spec.backupConfig.target.namespace
:告诉 TVK 目标是在哪个命名空间中创建的。spec.backupComponents
:定义要备份的资源列表。
在此配置中,
spec.type
:指定备份类型。
spec.backupPlan
:指定此备份应使用的备份计划。
发起一次性备份的大使Helm发布步骤:
首先,请确保按照大使Ingress教程中的步骤在您的集群中部署了Ambassador Edge Stack。
接下来,将目录更改为您本地机器上克隆的Starter Kit Git存储库所在的位置:
然后,使用您选择的编辑器(最好支持YAML lint)打开并检查Starter Kit存储库中提供的Ambassador BackupPlan和Backup清单文件。
NAME TARGET ... STATUS
ambassador-helm-release-backup-plan trilio-s3-target ... Available
最后,使用kubectl
创建BackupPlan和Backup资源。
现在,使用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
。
在所有大使 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`)
如果输出看起来像这样,那么您成功备份了 ambassador
Helm 发布。您可以继续查看 TrilioVault 如何存储 Kubernetes 元数据,方法是列出 TrilioVault S3 存储桶内容。例如,您可以使用 s3cmd:
ambassador-helm-release-full-backup-metamover-mg9gl0--1-2d6wx 1/1 Running 0 4m32s
输出类似于以下内容。请注意,列表包含表示 Kubernetes 对象的 JSON 清单和 UID。
如果备份未能变为可用状态,您可以检查来自 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"}
...
输出类似于:
现在,获取日志数据:
输出类似于以下内容。
最后,您还可以通过导航到 资源管理 -> 大使 -> 备份计划 检查备份是否在 Web 控制台中可用。请注意,它处于 Available
状态,并且大使 Helm 发布已备份在 组件详细信息 子视图中。
现在,继续模拟一次灾难,故意删除ambassador
Helm 发布:
接下来,检查命名空间资源是否已被删除(列表应为空):
- 最后,验证
echo
和quote
后端服务的端点是否为DOWN
。请参考创建大使边缘堆栈后端服务,了解在入门套件教程中使用的后端应用程序。您可以使用curl
进行测试(或者您可以使用您的网络浏览器): - 恢复大使 Helm 发布备份
- 重要
如果恢复相同的命名空间,请确保已删除原始应用程序组件。特别是应用程序的 PVC 已被删除。
如果恢复到另一个集群(迁移场景),请确保 TrilioVault for Kubernetes 也在远程命名空间/集群中运行。要恢复到新集群(其中不存在备份 CR),source.type
必须设置为 location
。请参考自定义资源定义还原部分以查看按位置恢复的示例。
- 当您删除
ambassador
命名空间时,与 ambassador 服务关联的负载均衡器资源也将被删除。因此,当您恢复ambassador
服务时,DigitalOcean 将重新创建 LB。问题在于,您将获得新 IP地址用于 LB,因此您需要调整A 记录
以将流量引导到托管在集群上的域名。 - 要恢复特定备份,您需要创建一个
Restore
CRD。典型的还原 CRD 如下所示: - 在此配置中,
spec.source.type
:指定要从何种备份类型进行还原。
spec.source.backup
:包含要从中进行还原的备份对象的引用。
spec.skipIfAlreadyExists
:指定是否跳过对已存在于已还原命名空间中的资源进行还原。
恢复允许您恢复应用程序的最后一次成功备份。它用于恢复由备份CRD保护的单个命名空间或Helm发布。备份CRD由其名称ambassador-helm-release-full-backup
标识。
首先,检查来自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
。
如果输出看起来像这样,则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
检查所有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
输出类似于:
获取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映射:
输出看起来类似以下内容。注意echo-backend
被映射到echo.starter-kit.online
主机和/echo/
源前缀,quote-backend
同理。
现在,您需要更新您的DNSA记录
,因为DigitalOcean负载均衡器资源已经重新创建,并且分配了一个新的外部IP。
最后,检查后端应用程序是否也响应HTTP请求。请参考创建大使边缘堆栈后端服务有关Starter Kit教程中使用的后端应用程序。
下一步涉及整个集群的备份和恢复。
A typical ClusterBackupPlan
manifest targeting multiple namespaces looks like this:
在这一步中,您将模拟灾难恢复场景。整个DOKS集群将被删除,然后重要的应用程序将从先前的备份中恢复。
这里的主要想法是通过包含所有重要的命名空间来执行 DOKS 集群备份,这些命名空间包含了您的关键应用程序和配置。
请注意,列表中不包括 kube-system
(或其他与 DOKS 集群相关的命名空间)。通常情况下,除非有特殊情况需要保留某些设置,否则这些命名空间不是必需的。
首先,更改本地计算机上克隆了 Starter Kit Git 仓库的目录:
然后,使用您选择的编辑器(最好支持 YAML lint)打开并检查 Starter Kit 仓库中提供的 ClusterBackupPlan
和 ClusterBackup
清单文件:
NAME TARGET ... STATUS
starter-kit-cluster-backup-plan trilio-s3-target ... Available
最后,使用 kubectl
创建 ClusterBackupPlan
和 ClusterBackup
资源:
现在,使用 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 控制台主仪表板并检查多个命名空间备份(注意,已备份的所有重要命名空间都以绿色突出显示,以蜂窝结构呈现):
需要牢记的重要一点是,每当销毁 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项目:
要开始恢复过程,请单击恢复按钮。
首先,验证所有集群 Kubernetes 资源。
然后,请确保您的 DNS A 记录已更新为指向您的新负载均衡器外部 IP。
最后,后端应用程序也应该响应 HTTP 请求。有关 Starter Kit 教程中使用的后端应用程序,请参阅 创建 Ambassador Edge Stack 后端服务。
在下一步中,您将学习如何为您的 DOKS 集群应用程序执行定期(或自动)备份。
根据时间表自动进行备份是一个非常有用的功能。它允许您倒带时间并将系统恢复到以前的工作状态,如果发生故障。本节提供了一个自动备份的示例,使用 5 分钟的时间表(选择了 kube-system
命名空间)。
首先,您需要创建一个类型为 Schedule
的 Policy
CRD,以 cron 格式定义备份计划(与 Linux
cron 相同)。计划策略可用于 BackupPlan
或 ClusterBackupPlan
CRD。典型的计划策略 CRD 如下所示(定义了一个 5 分钟
的计划):
# 每 5 分钟触发一次
接下来,您可以将调度策略应用于 ClusterBackupPlan
CRD,例如:
您可以注意到这是一个基本的 ClusterBackupPlan
CRD,通过 spec.backupConfig.schedulePolicy
字段引用了前面定义的 Policy
CRD。您可以为完整备份或增量备份创建单独的策略,因此可以在 spec 中指定 fullBackupPolicy
或 incrementalBackupPolicy
。
现在,请使用 Starter Kit 教程提供的示例清单创建调度 Policy
。
NAME POLICY DEFAULT
scheduled-backup-every-5min Schedule false
将目录更改为您本地机器上克隆 Starter Kit Git 存储库的位置。
最后,为 kube-system
命名空间的定期备份创建资源:
# 首先为 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 命名空间创建并触发定期备份
检查 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
策略资源,以及应为 Available
的 STATUS
。
检查 kube-system
的预定备份状态:
输出结果类似于以下内容。注意 BACKUPPLAN
的值设置为先前创建的备份计划资源,以及应为 Available
的 STATUS
。
现在,您可以通过查询集群备份资源并检查 START TIME
列(kubectl get clusterbackup -n tvk
)来检查备份是否按照常规间隔(5 分钟)执行。它应该反映在下图中突出显示的 5 分钟增量:
在下一步中,您将学习如何为您的备份设置保留策略。
保留策略允许您定义保留备份的数量以及根据合规性要求删除备份的频率。保留策略 CRD 提供了一个简单的 YAML 规范,用于根据天数、周数、月数、年数、最新等来定义保留备份的数量。
- 使用保留策略
- 保留策略可用于
BackupPlan
或ClusterBackupPlan
CRD。Retention
类型的典型Policy
映射如下: - 上述保留策略翻译为:
- 每周,在每个 星期三 保留一个备份。
每月,在 15号 保留一个备份。
A typical ClusterBackupPlan
example configuration that has a retention set looks like:
每年,在每个 三月 保留一个备份。
总体而言,应该保留 最近的2个 备份。
创建保留策略资源的基本流程与创建定期备份的方式相同。您需要定义一个 BackupPlan
或 ClusterBackupPlan
CRD 来引用保留策略,然后有一个 Backup
或 ClusterBackup
对象来触发该过程。
请注意,它使用一个 retentionPolicy
字段来引用相关策略。当然,您可以拥有同时设置了两种类型策略的备份计划,以便执行定期备份,以及处理保留策略。
使用清理策略
您需要一种方式来回收所有不再使用的对象。为此,您需要引入Cleanup Policy
CRD:
上述清理策略必须在 TVK 安装命名空间中定义。然后,系统会自动为您创建一个定期运行的定时作业,每30分钟运行一次,并根据规范字段中指定的backupdays
值删除失败的备份。
结论
- 在本教程中,您学会了如何执行一次性和定期备份,以及如何还原所有内容。
- 本教程中解释的所有基本任务和操作,旨在为您提供对 TrilioVault for Kubernetes 能力的基本介绍和理解。
- 了解更多