TrilioVault Kubernetes备份完全指南:轻松备份与恢复K8s集群
如何使用TrilioVault for Kubernetes备份和还原Kubernetes集群。作者选择了科技多样性基金作为写作捐赠计划的一部分来接受捐款。
引言TrilioVault for Kubernetes (TVK) 是一种云原生解决方案,通过将应用程序的元数据和数据存储在独立的存储库中,来保护您的应用程序。
使用Trilio有一些优点。使用Trilio,您可以对集群进行完整或增量备份,并在数据丢失的情况下将其恢复。您可以从一个集群迁移到另一个集群,并执行备份和恢复操作的预和后钩子。您还可以安排备份,并为备份定义保留政策。最后,您还可以使用Web管理控制台详细检查备份和恢复操作状态(以及其他许多功能)。
本文提供了使用TVK保护本地Kubernetes群集部署或Silicon Cloud Kubernetes服务的说明,包括对群集上部署的有状态或无状态应用程序的保护。在本教程中,您将部署TVK到您的Kubernetes群集,创建群集备份,并从备份中恢复。
如果你正在寻找一个托管的Kubernetes托管服务,请查看我们为增长而构建的简单易用的托管Kubernetes服务。
先决条件 (Xianjue tiaojian)要完成这个教程,你需要以下物品:
- A Silicon Cloud account. If you do not have one, sign up for a new account.
- A Silicon Cloud Kubernetes cluster with multiple namespaces. You can create a cluster by following our documentation on How To Create Clusters.
- Doctl for Silicon Cloud API interaction. To get started, see our guide on How To Install and Configure doctl.
- Kubectl for Kubernetes interaction. For installation and set up, see the Kubernetes product documentation for Install Tools.
- A Silicon Cloud Spaces bucket or any S3-compatible object storage bucket with its access keys. To use a Silicon Cloud Spaces bucket, follow our guides on How to Create Spaces and How to Manage Administrative Access with access keys. Save the access and secret keys in a safe place for later use. You can also use NFS export to store the backup.
- Helm for managing TrilioVault Operator releases and upgrades. For installation, see Step 1 of our tutorial, How To Install Software on Kubernetes Clusters with the Helm 3 Package Manager.
- A TrilioVault license saved as a yaml file. This tutorial uses Cluster-scoped installation, which you may need to select when fetching the license. For Silicon Cloud users, the TVK installation is free for five years. If you are not using a Silicon Cloud Kubernetes cluster, you will need to enroll on the Trilio website to request a TVK license. There are free trials and a free basic version available.
第一步 – 配置 Kubernetes 集群在此步骤中,您将检查Kubernetes集群的配置,以确保TrilioVault能够正常工作。
为了使TrilioVault正常工作并备份您的PersistentVolumeClaim(PVCs),Kubernetes集群需要配置支持容器存储接口(CSI)。默认情况下,Silicon Cloud托管的Kubernetes服务已经安装和配置了CSI驱动程序。您可以使用以下命令检查此配置:
- kubectl get storageclass
输出应该看起来类似于这样:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE do-block-storage (default) dobs.csi.digitalocean.com Delete Immediate true 1d
你可以看到,供应商是dobs.csi.digitalocean.com。
TrilioVault安装还需要volumeSnapshot自定义资源定义(CRD)以实现成功安装。您可以使用以下命令来检查此项:
- kubectl get crd | grep volumesnapshot
如果已经安装了volumeSnapshot,输出将类似于这样:
volumesnapshotclasses.snapshot.storage.k8s.io2022-03-02T07:24:23Z volumesnapshotcontents.snapshot.storage.k8s.io2022-03-02T07:24:23Z volumesnapshots.snapshot.storage.k8s.io2022-03-02T07:24:23Z |
如果还没有安装VolumeSnapshot,请参考安装VolumeSnapshot CRDs的文档。
最后,确保CRD支持v1 API版本,您可以通过运行以下命令来检查。
- kubectl get crd volumesnapshots.snapshot.storage.k8s.io -o yaml
在CRD yaml输出的末尾,您应该看到一个包含v1值的storedVersions列表。
… – 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: – v1
如果没有安装这个,请参考“Installing VolumeSnapshot CRDs”的文档。
在这一步中,您确认了您的Kubernetes配置已准备好安装TrilioVault,您将在下一步中执行此操作。
步骤2 — 安装适用于Kubernetes的TrilioVault
在这个步骤中,您将部署TrilioVault用于本地的Kubernetes集群,并通过Helm管理TVK的安装。备份数据将存储在您在先决条件中创建的兼容S3的存储桶中。
在不同的 Kubernetes 集群分发中,TrilioVault 应用程序可以通过多种方式进行安装。在本教程中,您将通过 triliovault-operator 图表使用 Helm 安装 TrilioVault。
本教程使用聚集范围安装类型来安装 TVK 应用程序。通过这种类型的安装,TVK 可以保护所有命名空间中的应用程序。(相比之下,使用命名空间范围安装,TVK 只能保护部署在该命名空间中的应用程序。)
要安装Kubernetes的TrilioVault,您需要一个许可证,这是先决条件之一,您已经请求过。获取TVK许可证时,您可能需要选择集群范围的安装。
使用Helm安装TrilioVault
要通过Helm安装TrilioVault,请先添加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.10.3 2.10.3 K8s-TrilioVault-Operator 是一个为 Kubernetes 设计的 Operator...
最后,使用helm安装TrilioVault for Kubernetes。
- helm install triliovault-operator triliovault-operator/k8s-triliovault-operator \
- –namespace tvk \
- –set installTVK.ingressConfig.host=“demo-tutorial.tvk-doks.com” \
- –create-namespace
这个命令使用 TrilioVault 安装器和 TriloVault 管理者(TVM)自定义资源,使用 triliovault-values.yaml 中提供的默认参数。
- TVK Operator:TVK 有一个基于 Helm 的 Operator,由一个名为 TrilioVault Manager 的 CRD 管理。TVK Operator 负责应用程序的生命周期管理,并在应用程序组件之一发生故障时进行自动恢复。
- TVK Manager:TVK 应用程序包含多个 CRD 及其控制器。它有自己的 webhook 服务器,用于管理其 CRD 实例的验证和变更。控制器协调对自定义资源执行操作所生成的事件。
本教程使用TrilioVault Helm值文件(triliovault-values.yaml)中的默认值,包括以下内容:
- installTVK.applicationScope:TVK 安装的范围可以是 Cluster(集群)或 Namespaced(命名空间)。此参数保护整个”集群”或”命名空间”中的应用程序,TVK 许可证也是根据安装范围生成的。本教程使用集群范围安装。
- installTVK.ingressConfig.host:TVK UI 主机名的域名,即 demo-tutorial.tvk-doks.com。用户将通过此域名访问 TVK 管理控制台。
- installTVK.ComponentConfiguration.ingressController.service.type:用于访问 TVK UI 的服务类型,如 NodePort 或 LoadBalancer。
注意:
- helm ls -n tvk
这个命令将列出您添加的Helm仓库。
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
triliovault-manager-tvk tvk 1 2022-08-18 08:19:50.409742366 +0000 UTC deployed k8s-triliovault-2.10.3 2.10.3
triliovault-operator tvk 1 2022-08-18 08:15:51.618651231 +0000 UTC deployed k8s-triliovault-operator-2.10.3 2.10.3
状态栏应显示已部署。
接下来,验证TrilioVault是否正常运行。运行下面的命令,它将显示tvk安装的状态:
- kubectl get deployments -n tvk
这个命令将会显示在tvk命名空间中的部署情况。
输出结果将会类似于以下内容:
NAME READY UP-TO-DATE AVAILABLE AGE
triliovault-manager 1/1 1 1 2m10s
triliovault-operator 1/1 1 1 2m45s
...
如果所有部署都显示”READY”状态为”1/1″,”AVAILABLE”为”1″,则表示TrilioVault已成功安装并正在运行。
这是文章《如何使用 TrilioVault for Kubernetes 备份和恢复 Kubernetes 集群》的第3部分(共13部分)。
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
READY列显示可用的部署数量,遵循ready/desired的模式。所有的部署pod都处于就绪状态,这意味着TVK已成功安装。接下来,您将检查TrilioVault许可证的类型和有效性。
检查TrilioVault应用程序的许可证
作为先决条件之一,您要求了一个用于集群范围安装类型的TrilioVault许可证,并将其保存为YAML文件。在本节中,您将应用您的TrilioVault许可证,确认其状态并检查其字段。
作为前提条件的一部分,您从Trilio的网站上下载了一个免费许可证并将其保存为YAML文件。现在,使用以下命令应用它。
- kubectl apply -f your_license_filename.yaml -n tvk
接下来,请检查您的集群上是否安装了许可证并处于激活状态。
- kubectl get license -n tvk
输出结果与以下类似:
NAME STATUS MESSAGE CURRENT NODE COUNT GRACE PERIOD END TIME EDITION CAPACITY EXPIRATION TIME MAX NODES
your_license Active Cluster License Activated successfully. 1 Basic 100 2023-04-25T00:00:00Z 1
请检查状态,应为活动状态。您还可以在版本列中验证您的许可类型,并在到期时间列中查看许可到期时间。
许可证是通过一个名为”License object”的特殊CRD来管理的。您可以通过运行以下命令来检查它,将其中的突出部分替换为您的许可证名称,如前面的输出所示:
- kubectl describe license your_license -n tvk
输出看起来类似于以下内容:
Name: your_license
Namespace: tvk
Labels: <none>
Annotations: generation: 4
triliovault.trilio.io/creator: trilio.user@trilio.io
triliovault.trilio.io/instance-id: 1350188a-9289-49ba-9086-553e8cd7cabe
triliovault.trilio.io/updater: [{"username":"system:serviceaccount:tvk:k8s-triliovault","lastUpdatedTimestamp":"2022-04-21T09:50:40.530365762Z"},{"username":"0c9f7f19-c4...
API Version: triliovault.trilio.io/v1
Kind: License
Metadata:
Creation Timestamp: 2022-04-06T08:07:16Z
...
Status:
Condition:
Message: Cluster License Activated successfully.
Status: Active
Timestamp: 2022-04-06T08:07:17Z
Current CPU Count: 6
Max CP Us: 6
Message: Cluster License Activated successfully.
Properties:
Active: true
Capacity: 100
Company: TRILIO-KUBERNETES-LICENSE-GEN-BASIC
Creation Timestamp: 2022-04-21T00:00:00Z
Edition: Basic
Expiration Timestamp: 2027-04-25T00:00:00Z
Kube UID: 1350188a-9289-49ba-9086-553e8cd7cabe
License ID: TVAULT-7f70e73e-c158-11ec-990f-0cc47a9fd48e
Maintenance Expiry Timestamp: 2027-04-25T00:00:00Z
Number Of Users: -1
Purchase Timestamp: 2022-04-21T00:00:00Z
Scope: Cluster
...
检查消息和容量字段,以及版本。
以上的输出还会告诉您许可证何时在到期时间戳字段过期,以及范围(在此情况下为基于集群)。更多详细信息可以在TrilioVault for Kubernetes许可证文档页找到。
在这一步中,您申请并确认了您的TVK许可证的状态。接下来,您将要探索TVK网络控制台,该控制台将帮助您管理目标、备份、恢复等等。
第三步 – 访问TVK管理控制台
在这一步中,您将访问TVK管理控制台,在此您可以通过图形用户界面创建目标并管理操作,例如备份和还原。虽然您可以通过kubectl和CRDs从命令行界面管理操作,但TVK管理控制台通过点按操作简化了常见任务,并提供了对TVK集群对象的更好可视化和检查。
在之前关于使用Helm安装TrilioVault的章节中,你安装并配置了Web管理控制台所需的组件。为了访问该控制台并探索它所提供的功能,你需要导出Kubernetes集群的kubeconfig文件并对TVK的入口控制器服务进行端口转发。
开始通过导出Kubernetes集群的kubeconfig文件来进行操作。这一步是必需的,以便Web控制台可以进行身份验证。
如果您正在使用Silicon Cloud的Kubernetes服务,您可以按照以下步骤导出您的kubeconfig文件。
列出可用的集群:
- doctl k8s cluster list
将集群配置保存为YAML文件,并将突出显示的值替换为所需集群的名称。
- doctl kubernetes cluster kubeconfig show YOUR_CLUSTER_NAME_ > config_YOUR_CLUSTER_NAME_.yaml
注意
注意:如果您只有一个集群,可以使用以下命令:
DOKS_CLUSTER_NAME="$(doctl k8s cluster list --no-header --format Name)"
doctl kubernetes cluster kubeconfig show $DOKS_CLUSTER_NAME > config_${DOKS_CLUSTER_NAME}.yaml
请务必妥善保管生成的kubeconfig文件,因为文件中包含用于访问集群的令牌和用户详细信息等敏感数据。将文件存储在非公开的位置,并考虑使用密码管理应用程序或加密格式。
现在您已经获得了用于认证的kubeconfig文件,您将设置端口转发来访问管理控制台。
首先,从tvk命名空间中识别ingress-nginx-controller服务。您可以通过运行以下命令列出tvk命名空间中的服务来执行此操作:
kubectl get svc -n tvk
输出的结果类似于以下内容:
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
搜索”k8s-triliovault-ingress-nginx-controller”这一行,并注意到它在PORT(s)列中监听端口80。
TrilioVault的入口服务可以配置为NodePort或LoadBalancer,您可以在TYPE列中看到。如果设置为NodePort,那么您需要确保域名可访问。如果使用NodePort来访问TVK管理控制台,则TrilioVault的入口服务将无法直接连接到外部网络,除非解析用于访问TVK控制台的域名。为解决这个问题,您需要在etc/hosts文件中添加IP地址和域名条目,以解析域名到IP地址。
要做到这一点,打开/etc/hosts文件进行编辑,并添加此条目:
127.0.0.1 demo-tutorial.tvk-doks.com
demo-tutorial.tvk-doks.com 是设置给 TrilioVault ingress Controller 服务的域名。您将使用此域名来访问 TVK 管理控制台。
保存并关闭文件。
接下来,为TVK入口控制器服务创建端口转发:
kubectl port-forward svc/k8s-triliovault-ingress-nginx-controller 8080:80 -n tvk &
您现在可以通过浏览器访问控制台,导航到:http://demo-tutorial.tvk-doks.com:8080。当要求提供kubeconfig文件时,请选择在本节中创建的文件。
注意:TVK使用kubeconfig文件生成身份验证令牌,但不会存储kubeconfig文件中的用户细节。在这一步中,您需要设置访问TVK管理控制台的权限。关于控制台可用功能的更多信息,请参阅TVK Web管理控制台官方文档。
第四步 – 创建一个TrilioVault目标以存储备份数据
TrilioVault需要知道在哪里存储您的备份,也称为目标。支持以下目标类型:S3和NFS。该教程使用S3存储类型。有关更多信息,请参阅TVK文档中的备份目标部分。
为了访问S3存储,每个目标需要知道存储桶的凭证,这些凭证存储在一个秘钥中。在此步骤中,您将为备份创建一个TrilioVault目标,并创建一个用于存储存储桶凭证的秘钥。
要开始,请创建包含目标S3存储桶凭证的Kubernetes秘钥。使用nano或您最喜欢的文本编辑器,创建一个名为trilio-s3-target-secret的文件,并添加以下代码,确保替换掉高亮显示的值,将其替换为您的Silicon Cloud Spaces访问密钥和秘密密钥。
apiVersion: v1
kind: Secret
metadata:
name: trilio-s3-target-secret
namespace: tvk
type: Opaque
stringData:
accessKey: your_bucket_access_key
secretKey: your_bucket_secret_key
该密钥名称为 trilio-s3-target-secret,它将在您为目标创建的下一个清单中的 spec.objectStoreCredentials.credentialSecret 字段中被引用。您可以将密钥放置在 TrilioVault 所在的命名空间中(通常设置为 tvk),或选择您偏好的其他命名空间。只需确保引用的命名空间正确即可。
保存并关闭文件。
要应用此清单并创建密钥,请运行以下命令:
- kubectl apply -f trilio-s3-target-secret.yaml -n tvk
注意:您也可以通过运行以下命令创建密钥,将占位符值替换为您的 Silicon Cloud 存储桶访问密钥和秘密密钥:
kubectl create secret generic trilio-s3-target-secret \
--namespace=tvk \
--from-literal=accessKey="your_bucket_access_key" \
--from-literal=secretKey="your_bucket_secret_key"
您的输出将会是这样的:
secret/trilio-s3-target-secret created
接下来,您将为目标创建清单。创建一个名为 trilio-s3-target.yaml 的新文件,并添加以下代码块。将 bucketName、region 和 url 的突出显示值替换为有关您的 Silicon Cloud 存储桶的信息,您可以在存储桶的控制面板中找到这些信息。
trilio-s3-target.yaml 可以用以下方式进行释义:
天蓝云对象存储目标配置文件
apiVersion: triliovault.trilio.io/v1
kind: Target
metadata:
name: trilio-s3-target
namespace: tvk
spec:
type: ObjectStore
vendor: Other
enableBrowsing: true
objectStoreCredentials:
bucketName: your_bucket_name
region: your_bucket_region # 例如:nyc1 或 us-east-1
url: https://nyc1.digitaloceanspaces.com # 更新区域以匹配您的存储桶
credentialSecret:
name: trilio-s3-target-secret
namespace: tvk
thresholdCapacity: 10Gi
以下是对上述配置的解释:
- spec.type:备份存储目标的类型(S3为ObjectStore)。
- spec.vendor:托管目标的第三方存储供应商(对于Silicon Cloud Spaces,您需要使用Other)。
- spec.enableBrowsing:启用目标浏览功能。
- spec.objectStoreCredentials:定义访问S3存储所需的凭证(通过credentialSecret),以及其他参数如存储桶区域和名称。
- spec.thresholdCapacity:存储备份数据的最大阈值容量。
请注意,credentialSecret名称与您刚刚创建的密钥相匹配。
保存并关闭清单文件。
现在,使用kubectl创建目标对象。
- kubectl apply -f trilio-s3-target.yaml -n tvk
您的输出会是这样的:
target.triliovault.trilio.io/trilio-s3-target created
TrilioVault将生成一个名为trilio-s3-target-validator的工作任务,负责验证您的S3存储桶(例如可用性、权限等)。如果任务成功完成,则表示存储桶是健康的或可用的,并在之后删除trilio-s3-target-validator工作资源。
现在,通过运行以下命令并传入目标的名称来检查之前创建的目标资源是否健康。
- kubectl get target trilio-s3-target -n tvk
输出将会看起来类似于这个:
NAME TYPE THRESHOLD CAPACITY VENDOR STATUS BROWSING ENABLED trilio-s3-target ObjectStore 10Gi Other Available true
状态列的值为”可用”,说明目标处于良好状态。
您还可以使用TVK管理控制台验证目标状态。登录后,选择备份与恢复,然后点击目标进行查看。

如果状态显示为”可用”,则表示您已成功配置了S3目标对象。然而,如果配置存在问题,状态将显示为”不可用”。在这种情况下,S3目标验证任务将持续运行,以便您可以检查日志并找出可能的问题。如果目标对象无法变为健康状态,您可以检查来自trilio-s3-target-validator Pod的日志以找出问题所在。
要查看日志,您首先需要找到目标验证器Pod。
kubectl get pods -n tvk | grep trilio-s3-target-validator
输出结果将会与此类似,但会有一个独特的标识符。
trilio-s3-target-validator-tio99a-6lz4q 1/1 Running 0 104s
使用前面获取的目标验证器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. ...
如果需要额外的调试帮助,或在创建目标过程中遇到问题,可以查阅文档中的故障排除部分,或联系技术支持。
在这一步骤中,您配置了一个TrilioVault目标并创建了一个密钥来提供存储桶凭据。接下来,您将执行备份和恢复操作,从而实现灾难恢复方案。
第五步 – 备份和恢复Kubernetes集群
在这个步骤中,您将对Kubernetes集群执行备份操作。然后,您将删除命名空间,并使用备份将所有重要的应用程序恢复到这些命名空间中。您将通过目标位置执行集群恢复操作。当您需要执行集群迁移时,同样的步骤也适用。
这里的主要思想是通过包含所有重要的命名空间来执行完整的集群备份,这些命名空间包含您的关键应用程序和配置。这不是一个完整的集群备份和恢复,而是一个多命名空间备份和恢复操作。在实践中,这是唯一需要的操作,因为在Kubernetes中所有资源都属于某个命名空间。
创建Kubernetes集群备份
在本节中,您将使用ClusterBackupPlan CRD(自定义资源定义)创建一个多命名空间备份,该备份针对您的Kubernetes集群中的所有重要命名空间。
首先开始集群备份操作,您将创建一个ClusterBackupPlan,它定义了一组需要备份的资源。规范包括备份计划、备份目标和待备份的资源。资源可以以Helm发布、运算符或原始Kubernetes API资源的形式定义。
使用文本编辑器创建一个名为k8s-cluster-backup-plan.yaml的ClusterBackupPlan清单文件。添加以下代码块,这是一个针对多个命名空间的典型清单文件:
k8s-cluster-backup-plan.yaml
这是文章《如何使用 TrilioVault for Kubernetes 备份和恢复 Kubernetes 集群》的第8部分(共13部分)。
apiVersion: triliovault.trilio.io/v1
kind: ClusterBackupPlan
metadata:
name: k8s-cluster-backup-plan
namespace: tvk
spec:
backupConfig:
target:
name: trilio-s3-target
namespace: tvk
backupComponents:
- namespace: wordpress
- namespace: mysqldb
- namespace: etcd
确保备份组件中列出的命名空间在集群上存在。
您可能会注意到备份组件中没有包括kube-system(或其他与Kubernetes集群相关的命名空间)。通常情况下,除非需要在该级别保留某些设置,否则不需要这些命名空间。
保存并关闭文件。
现在使用kubectl创建ClusterBackupPlan的资源。
- kubectl apply -f k8s-cluster-backup-plan.yaml
你的输出会是这样的:
clusterbackupplan.triliovault.trilio.io/k8s-cluster-backup-plan created
现在,使用 kubectl 检查 ClusterBackupPlan 的状态。
- kubectl get clusterbackupplan k8s-cluster-backup-plan -n tvk
输出的外观与这个类似。
NAME TARGET … STATUS k8s-cluster-backup-plan trilio-s3-target … 可用
检查STATUS列的值,应设为可用。
您还可以通过TVK管理控制台查看ClusterBackupPlan的状态。登录后,选择备份与恢复,然后选择备份计划进行查看。

在此时,您已经创建了一个ClusterBackupPlan。接下来,您将创建一个ClusterBackup,它是一个指向spec.clusterBackupPlan.name中实际ClusterBackupPlan的配置。ClusterBackupPlan将始终保持不变;您可以通过将其刷新到多个ClusterBackup的清单文件中来创建多个备份。
现在,创建一个名为 k8s-cluster-backup.yaml 的 ClusterBackup 清单文件。添加以下代码块:
apiVersion: triliovault.trilio.io/v1
kind: ClusterBackup
metadata:
name: k8s-cluster-backup
namespace: tvk
spec:
type: Full
clusterBackupPlan:
name: k8s-cluster-backup-plan
namespace: tvk
保存并关闭文件。
最后,使用kubectl创建ClusterBackup资源。
- kubectl apply -f k8s-cluster-backup.yaml
通过应用ClusterBackup清单,将触发备份流程。
您的输出将如下所示:
clusterbackup.triliovault.trilio.io/k8s-cluster-backup created
现在,使用kubectl检查ClusterBackup的状态。
- kubectl get clusterbackup k8s-cluster-backup -n tvk
输出看起来类似于:
NAME BACKUPPLAN BACKUP TYPE STATUS … PERCENTAGE COMPLETE k8s-cluster-backup k8s-cluster-backup-plan Full Available … 100
检查STATUS列的值,它应该被设置为Available,同时将PERCENTAGE COMPLETE设置为100。
您还可以使用TVK管理控制台查看集群备份状态。从主仪表板上,选择监控,然后在左侧窗格中选择TrilioVault监控。

您还可以打开Web控制台的主仪表板,并检查多个命名空间的备份。从主仪表板中,选择备份和恢复,然后选择命名空间。在右上方,您可以在列表视图和蜂窝结构之间切换。

在这个部分,您创建了一个集群备份。接下来的部分中,您将删除命名空间,然后从备份中恢复它们。
删除命名空间现在您有了集群备份,您将删除名称空间,以便稍后可以从备份中恢复它们。要删除名称空间,请运行以下命令,并根据需要替换已标记的名称空间。
- kubectl delete ns wordpress
- kubectl delete ns mysqldb
- kubectl delete ns etcd
你的输出结果会是这样的:
namespace “wordpress” deleted namespace “mysqldb” deleted namespace “etcd” deleted
现在你的命名空间已经被删除,你将恢复备份。
使用管理控制台恢复备份。在本节中,您将使用TVK Web控制台从备份中恢复所有重要的应用程序。恢复过程将验证备份存储的目标。TVK将通过datamover和metamover pods连接到目标存储库,拉取备份文件。TVK将创建从备份存储中拉取的Kubernetes应用程序。
要开始恢复操作,首先需要重新创建目标清单。由于现有的命名空间已被删除,这些命名空间中创建的目标自定义资源也被删除了。这意味着集群上没有目标自定义资源存在。
根据《创建用于存储备份的TrilioVault存储目标》中所述,将TVK目标进行配置,并将其指向与备份数据位于同一的S3存储桶。确保启用目标浏览功能。
然后,导航到备份和恢复,然后选择带有命名空间的目标: 全部选择。


选择启动浏览器将会打开目标浏览器。

现在,从备份计划列表中点击K8s集群备份计划项。右侧将显示一个子窗口,显示备份的信息,包括状态。
点击并展开右侧子窗口中的”k8s-cluster-backup”项目。

点击”恢复”按钮开始恢复过程。
接下来,您将看到一个弹窗,其中列出了一些用于恢复过程的选项。要了解恢复过程的不同选项,您可以在TrilioVault文档的恢复选项部分找到有关每个标志的详细信息。

在自定义恢复资源创建时输入一个恢复名称。一旦您提供了名称,您可以将备份中的所有重要命名空间映射到要恢复数据的命名空间。在这种情况下,在配置窗格中选择命名空间配置,然后选择所需的命名空间。

一旦还原过程开始,您可以监视其进度。类似于以下的进度窗口将被显示出来。

一段时间过后,当进度完成后,多个命名空间的恢复操作已成功完成。
在这一部分中,您使用管理控制台恢复了您的备份。在下一部分中,您将确认恢复操作已成功完成。
检查DOKS集群应用状态
在这个部分,您将确保恢复操作成功,并且在恢复后可以访问应用程序。首先,运行以下命令从列出的命名空间中检索与应用程序相关的所有对象。
- kubectl get all –namespace wordpress
- kubectl get all –namespace mysqldb
- kubectl get all –namespace etcd
对于每个应用程序,您的输出将与下面的类似。
NAME READY STATUS RESTARTS AGE pod/wordpress-5dcf55f8fc-72h9q 1/1 Running 1 2m21s pod/wordpress-mariadb-0 1/1 Running 1 2m20s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/wordpress LoadBalancer 10.120.1.38 34.71.102.21 80:32402/TCP,443:31522/TCP 2m21s service/wordpress-mariadb ClusterIP 10.120.7.213 <none> 3306/TCP 2m21s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/wordpress 1/1 1 1 2m21s NAME DESIRED CURRENT READY AGE replicaset.apps/wordpress-5dcf55f8fc 1 1 1 2m21s NAME READY AGE statefulset.apps/wordpress-mariadb 1/1 2m21s
输出详细信息显示,WordPress 应用程序部署的 1/1 个容器处于 READY 状态。此外,WordPress 应用程序 Pod 和 WordPress MariaDB Pod 的容器也有 1/1 个处于 RUNNING 状态。这些状态确认应用程序已成功恢复。
在下一步中,您将学习为您的DOKS集群应用程序执行定期(或自动)备份。
第六步 — 安排备份计划
根据预定时间自动创建备份是一个非常实用的功能。如果出现问题,它可以让您回溯时间,将系统恢复到以前的工作状态。TrilioVault默认创建了三个预定策略:每天、每周和每月。
在TVK控制台中,您可以在”备份和恢复”下的”调度策略”中查看默认策略。

调度策略可以用于备份计划(BackupPlan)或集群备份计划(ClusterBackupPlan)的CRD。
创建一个名为scheduled-backup-every-5min.yaml的清单文件,并添加以下代码,这是一个典型的自定义计划策略CRD。
apiVersion: triliovault.trilio.io/v1
kind: Policy
apiVersion: triliovault.trilio.io/v1
metadata:
name: scheduled-backup-every-5min
namespace: tvk
spec:
type: Schedule
scheduleConfig:
schedule:
- "*/5 * * * *" # 每5分钟触发一次
这个清单在tvk命名空间下创建了一个名为scheduled-backup-every-5min的定时备份策略。它将根据备份计划对象来触发每五分钟一次的定时备份。
创建完清单后,您可以使用它来制定日程政策。
- kubectl apply -f scheduled-backup-every-5min.yaml
你的输出结果会是这样:
policy.triliovault.trilio.io/scheduled-backup-every-5min 已创建
为了应用调度策略,您需要将其添加到ClusterBackupPlan CRD中。打开您在第五步创建的ClusterBackupPlan CRD,然后添加标记的行:
apiVersion: triliovault.trilio.io/v1
kind: ClusterBackupPlan
metadata:
name: k8s-cluster-backup-plan
namespace: tvk
spec:
backupConfig:
target:
name: trilio-s3-target
namespace: tvk
schedulePolicy:
fullBackupPolicy:
name: scheduled-backup-every-5min
namespace: tvk
backupComponents:
- namespace: wordpress
- namespace: mysqldb
- namespace: etcd
ClusterBackupPlan CRD通过spec.backupConfig.schedulePolicy字段引用了先前定义的Policy CRD。您可以为完整备份或增量备份创建单独的策略,因此可以在spec中指定fullBackupPolicy或incrementalBackupPolicy。
保存并关闭您的文件。
在此步骤中,您已经安排了备份并向ClusterBackupPlan添加了调度策略。在下一步中,您将学习如何设置备份的保留策略。
步骤7 — 创建备份保留策略
在这一步中,您将创建一个备份保留策略,该策略决定了备份的保留规则。保留策略非常重要,因为存储空间是有限的,如果保留了太多备份对象,成本会变得很高。
保留策略允许您根据合规要求定义要保留的备份数量以及删除备份的频率。保留策略CRD提供了一个YAML规范,用于根据天数、周数、月数、年数或最新备份等条件来定义要保留的备份数量。
TVK还有一个默认的保留策略,您可以在TVK控制台的”备份与恢复”下的”保留策略”中查看。

保留策略可用于BackupPlan或ClusterBackupPlan CRDs。创建一个名为sample-retention-policy.yaml的新文件,并添加以下内容:
apiVersion: triliovault.trilio.io/v1
kind: Policy
metadata:
name: sample-retention-policy
spec:
type: Retention
retentionConfig:
latest: 2
weekly: 1
dayOfWeek: Wednesday
monthly: 1
dateOfMonth: 15
monthOfYear: March
yearly: 1
这是一个典型的保留类型策略清单。以下是对上述配置的解释:
- spec.type: 定义策略类型:保留(Retention)或调度(Schedule)。
- spec.retentionConfig: 描述保留配置,例如用于备份保留的时间间隔以及要保留的数量。
- spec.retentionConfig.latest: 要保留的最新备份数量的最大值。
- spec.retentionConfig.weekly: 一周内要保留的备份数量的最大值。
- spec.retentionConfig.dayOfWeek: 维护每周备份的星期几。
- spec.retentionConfig.monthly: 一个月内要保留的备份数量的最大值。
- spec.retentionConfig.dateOfMonth: 维护每月备份的月份日期。
- spec.retentionConfig.monthOfYear: 为年度备份保留的备份月份。
- spec.retentionConfig.yearly: 一年内要保留的备份数量的最大值。
在上述配置的保留策略中,备份策略将每周保留每个星期三的一个备份;每月保留每个月15日的一个备份;每年保留三月份的一个备份。总体而言,最近的两个备份将可用。
创建保留策略资源的基本流程与定期备份相同。您需要定义一个备份计划(BackupPlan)或集群备份计划(ClusterBackupPlan) CRD来引用保留策略,然后创建一个备份(Backup)或集群备份(ClusterBackup)对象来触发该过程。
要应用保留策略,请打开您的集群备份计划(ClusterBackupPlan) CRD,并将其更新为以下内容:
apiVersion: triliovault.trilio.io/v1
kind: ClusterBackupPlan
metadata:
name: k8s-cluster-backup-plan
namespace: tvk
spec:
backupConfig:
target:
name: trilio-s3-target
namespace: tvk
retentionPolicy:
fullBackupPolicy:
name: sample-retention-policy
namespace: tvk
backupComponents:
- namespace: wordpress
- namespace: mysqldb
- namespace: etcd
清单使用retentionPolicy
字段来引用所讨论的策略。您可以设置一个备份计划,其中同时包含这两种类型的策略,以便可以进行定期备份,并处理保留策略。
在这个步骤中,您为备份设置保留策略。
结论
在本教程中,您安装了适用于Kubernetes的TrilioVault,并使用它来备份和恢复一个集群。您还安排了备份并配置了保留策略。
您使用TrilioVault for Kubernetes成功完成了集群备份的基本任务,因此现在您已经具备了通过TrilioVault产品文档中的以下内容来探索其他主题和材料的能力。
- TVK自定义资源定义(CRD)API文档。
- 如何为备份操作集成前置/后置钩子(Hooks),其中包含各种数据库的示例。
- 多集群管理
- Helm发布备份,展示了Helm发布备份策略的示例。
- 不可变备份,限制目标存储上的备份被覆盖。
- 备份加密,解释如何在目标存储上加密和保护敏感数据。
- 恢复转换(Restore Transforms)
- 灾难恢复计划
如果想要了解更多关于Kubernetes的内容,请查阅Silicon Cloud Kubernetes(DOKS)的产品文档和其他教程。