Velero 系列文章(一):基础
概述
Velero 是一个开源工具,可以安全地备份和还原,执行灾难恢复以及迁移 Kubernetes 集群资源和持久卷。
灾难恢复
Velero 可以在基础架构丢失,数据损坏和/或服务中断的情况下,减少恢复时间。
数据迁移
Velero 通过轻松地将 Kubernetes 资源从一个集群迁移到另一个集群来实现集群可移植性
数据保护
提供关键数据保护功能,例如定时计划的备份,保留计划以及自定义操作的备份前或备份后钩子。
备份集群
使用 namespace resources 或 label selector 备份整个集群或部分集群的 Kubernetes 资源和卷。
定期备份
设置计划以定期间隔自动启动备份。
备份钩子
配置备份前和备份后钩子,以在 Velero 备份之前和之后执行自定义操作。
安装 - 基本安装
前提
- 在启用 DNS 和容器联网的情况下访问 Kubernetes 集群 v1.16 或更高版本。
kubectl
本地安装
Velero 使用对象存储来存储备份和关联的工件。 它还可以选择与受支持的块存储系统集成,以对您的持久卷进行快照。 在开始安装过程之前,您应该从 兼容的提供程序列表 中识别将要使用的对象存储提供程序和可选的块存储提供程序。
Velero 支持云提供商环境和本地环境的存储提供商。 有关内部部署方案的更多详细信息,请参见 内部部署文档
安装 CLI
- 下载适用于您的客户端平台的 最新版本 的 tarball。
- 解压 tarball:
tar -xvf <RELEASE-TARBALL-NAME>.tar.gz
- 将解压后的
velero
放到$PATH
(一般是/usr/local/bin
)
安装配置 server 端组件
有两种支持的方法来安装 Velero 服务器组件:
velero install
CLI 命令- Helm Chart
Velero 使用存储提供程序插件与各种存储系统集成,以支持备份和快照操作。 安装和配置 Velero 服务器组件以及相应插件的步骤特定于您选择的存储提供商。 要查找您选择的存储提供商的安装说明,请在 支持的存储提供商 页面上访问提供商的文档链接。
📝 注意:
如果您的对象存储提供程序与卷快照提供程序不同,请首先按照对象存储提供程序的安装说明进行操作,然后返回此处并按照说明添加 卷快照提供程序。
命令行自动补全
https://velero.io/docs/v1.8/customize-installation/#enabling-shell-autocompletion
安装 - 定制化安装
https://velero.io/docs/v1.8/customize-installation/
安装 - 提供商
Velero 支持各种存储提供程序,以进行不同的备份和快照操作。 Velero 有一个插件系统,它允许任何人在不修改 Velero 代码库的情况下增加对其他备份和卷存储平台的兼容性。
Velero 支持的提供商
提供商 | 对象存储 | 卷快照 | 插件提供商 Repo | 安装说明 |
---|---|---|---|---|
Amazon Web Services (AWS) | AWS S3 | AWS EBS | Velero plugin for AWS | AWS Plugin Setup |
Google Cloud Platform (GCP) | Google Cloud Storage | Google Compute Engine Disks | Velero plugin for GCP | GCP Plugin Setup |
Microsoft Azure | Azure Blob Storage | Azure Managed Disks | Velero plugin for Microsoft Azure | Azure Plugin Setup |
VMware vSphere | 🚫 | vSphere Volumes | VMware vSphere | vSphere Plugin Setup |
Container Storage Interface (CSI) | 🚫 | CSI Volumes | Velero plugin for CSI | CSI Plugin Setup |
社区支持的提供商
Provider | Object Store | Volume Snapshotter | Plugin Documentation | Contact |
---|---|---|---|---|
AlibabaCloud | Alibaba Cloud OSS | Alibaba Cloud | AlibabaCloud | GitHub Issue |
DigitalOcean | DigitalOcean Object Storage | DigitalOcean Volumes Block Storage | StackPointCloud | |
Hewlett Packard | 🚫 | HPE Storage | Hewlett Packard | Slack, GitHub Issue |
OpenEBS | 🚫 | OpenEBS CStor Volume | OpenEBS | Slack, GitHub Issue |
OpenStack | Swift | Cinder | OpenStack | GitHub Issue |
Portworx | 🚫 | Portworx Volume | Portworx | Slack, GitHub Issue |
Storj | Storj Object Storage | 🚫 | Storj | GitHub Issue |
与 s3 兼容的对象存储提供程序
Velero 的 AWS Object Store 插件使用 Amazon 的 Go SDK 连接到 AWS S3 API。 一些第三方存储提供程序也支持 S3 API,并且用户报告了以下提供程序可用于 Velero:
📝 请注意,Velero 团队并未定期测试这些存储提供商。
- IBM Cloud
- Oracle Cloud
- Minio
- DigitalOcean
- NooBaa
- Tencent Cloud
- Ceph RADOS v12.2.7
- Quobyte
- Cloudian HyperStore
某些存储提供程序(例如 Quobyte)可能需要不同的签名算法版本。
安装 - 快速验证安装
-
在您的本地目录中创建特定于 Velero 的凭证文件(
credentials-velero
):[default] aws_access_key_id = minio aws_secret_access_key = minio123
-
启动服务器和存储服务。 在 Velero 目录中,运行:
oc apply -f examples/minio/00-minio-deployment.yaml velero install \ --provider aws \ --plugins velero/velero-plugin-for-aws:v1.4.1 \ --bucket velero \ --secret-file ./credentials-velero \ --use-volume-snapshots=false \ --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio.velero.svc:9000
此示例假定它在本地群集中运行,而没有能够提供快照的卷提供程序,因此不会创建 VolumeSnapshotLocation(``--use-volume-snapshots=false`)。
此外,您可以指定
--use-restic
启用 RESTIC 支持,并指定--wait
等待部署准备就绪。对于更复杂的安装需求,请使用 Helm Chart,或添加
--dry-run -o yaml
选项来生成安装的 YAML 文件。
创建的内容包括:
CustomResourceDefinition/backups.velero.io: attempting to create resource
CustomResourceDefinition/backups.velero.io: created
CustomResourceDefinition/backupstoragelocations.velero.io: attempting to create resource
CustomResourceDefinition/backupstoragelocations.velero.io: created
CustomResourceDefinition/deletebackuprequests.velero.io: attempting to create resource
CustomResourceDefinition/deletebackuprequests.velero.io: created
CustomResourceDefinition/downloadrequests.velero.io: attempting to create resource
CustomResourceDefinition/downloadrequests.velero.io: created
CustomResourceDefinition/podvolumebackups.velero.io: attempting to create resource
CustomResourceDefinition/podvolumebackups.velero.io: created
CustomResourceDefinition/podvolumerestores.velero.io: attempting to create resource
CustomResourceDefinition/podvolumerestores.velero.io: created
CustomResourceDefinition/resticrepositories.velero.io: attempting to create resource
CustomResourceDefinition/resticrepositories.velero.io: created
CustomResourceDefinition/restores.velero.io: attempting to create resource
CustomResourceDefinition/restores.velero.io: created
CustomResourceDefinition/schedules.velero.io: attempting to create resource
CustomResourceDefinition/schedules.velero.io: created
CustomResourceDefinition/serverstatusrequests.velero.io: attempting to create resource
CustomResourceDefinition/serverstatusrequests.velero.io: created
CustomResourceDefinition/volumesnapshotlocations.velero.io: attempting to create resource
CustomResourceDefinition/volumesnapshotlocations.velero.io: created
Waiting for resources to be ready in cluster...
Namespace/velero: attempting to create resource
Namespace/velero: already exists, proceeding
Namespace/velero: created
ClusterRoleBinding/velero: attempting to create resource
ClusterRoleBinding/velero: created
ServiceAccount/velero: attempting to create resource
ServiceAccount/velero: created
Secret/cloud-credentials: attempting to create resource
Secret/cloud-credentials: created
BackupStorageLocation/default: attempting to create resource
BackupStorageLocation/default: created
Deployment/velero: attempting to create resource
Deployment/velero: created
Velero is installed! ⛵ Use 'kubectl logs deployment/velero -n velero' to view the status.
备份
-
为与
app=iperf3-server
label selector 匹配的任何对象创建备份:velero backup create test-backup --selector app=iperf3-server
或者,如果要备份除匹配标签
backup=ignore
的对象以外的所有对象,请执行以下操作:velero backup create nginx-backup --selector 'backup!=ignore'
-
(可选)使用
app=iperf3-server
label selector 基于 cron 表达式创建定期计划的备份:velero schedule create test-daily --schedule="0 1 * * *" --selector app=iperf3-server
另外,您可以使用一些非标准的速记 cron 表达式:
velero schedule create test-daily --schedule="@every 24h" --selector app=iperf3-server
有关更多用法示例,请参见 cron 软件包 的文档。
恢复
-
运行:
velero restore create --from-backup test-backup
-
运行:
velero restore get
恢复完成后,输出如下所示:
NAME BACKUP STATUS WARNINGS ERRORS CREATED SELECTOR nginx-backup-20170727200524 nginx-backup Completed 0 0 2017-07-27 20:05:24 +0000 UTC <none>
如果有错误或警告,则可以详细查看它们:
velero restore describe <RESTORE_NAME>
清理
如果要删除创建的所有备份,包括对象存储中的数据和永久卷快照,则可以运行:
velero backup delete BACKUP_NAME
这要求 Velero 服务器删除与BACKUP_NAME
相关联的所有备份数据。 您需要对要永久删除的每个备份执行此操作。 Velero 的未来版本将允许您通过名称或 label selector 删除多个备份。
要从 Kubernetes 集群中完全卸载 Velero:
oc delete namespace/velero clusterrolebinding/velero
oc delete crds -l component=velero
安装 - Restic 集成
Velero 支持使用称为 restic 的免费开源备份工具备份和还原 Kubernetes 卷。 此支持被视为 Beta 质量。 请查看 限制 列表,以了解它是否适合您的用例。
添加了 Restic 集成,为您提供了一个现成的解决方案,用于备份和还原几乎任何类型的 Kubernetes 卷。 这种集成是 Velero 功能的补充,而不是现有功能的替代。 但是,如果您需要为存储平台使用卷快照插件,或者使用的是 EFS,AzureFile,NFS,emptyDir,local 或任何其他没有本机快照概念的卷类型,restic 可能适合您 。
Restic 并不局限于特定的存储平台,这意味着该集成还为将来实现跨卷类型数据迁移的工作铺平了道路。
🐾 注意:
不支持 hostPath 卷,但是支持 本地卷类型。
安装 restic
前提
-
了解 Velero 如何 通过 Restic 集成执行备份。
-
下载 最新的 Velero 版本。
-
Kubernetes v1.10.0 及更高版本。 Velero 的 Restic 集成需要 Kubernetes MountPropagation 功能,该功能在 Kubernetes v1.10.0 和更高版本中默认启用。
安装 restic
要安装 restic,请使用velero install
命令中的--use-restic
标志。 有关安装命令的其他标志的更多详细信息,请参见 安装概述。
velero install --use-restic
在不支持快照的 Velero 支持的存储提供程序上使用 Restic 时,--use-volume-snapshots = false
标志可防止在安装时创建未使用的VolumeSnapshotLocation
。
配置 Restic DaemonSet Spec
安装后,某些基于 Kubernetes 的 PaaS / CaaS 平台也需要修改 Restic DaemonSet 规范。 仅当您在 RancherOS,OpenShift,VMware Tanzu Kubernetes Grid Integrated Edition(以前称为 VMware Enterprise PKS)或 Micrsoft Azure 上安装时,才需要本节中的步骤。
OpenShift
要将正确的主机路径安装到 Pod 卷,请在privileged
模式下运行 Restic Pod。
-
将
velero
ServiceAccount 添加到privileged
SCC:$ oc adm policy add-scc-to-user privileged -z velero -n velero
-
对于 OpenShift 版本> = 4.1,修改 DaemonSet yaml 以请求
privileged
模式:@@ -67,3 +67,5 @@ spec: value: /credentials/cloud - name: VELERO_SCRATCH_DIR value: /scratch + securityContext: + privileged: true
或:
oc patch ds/restic \ --namespace velero \ --type json \ -p '[{"op":"add","path":"/spec/template/spec/containers/0/securityContext","value": { "privileged": true}}]'
如果 restic 不在特权模式下运行,则由于主机系统级别配置了默认的强制实施 SELinux 模式,它将无法访问已挂载的 hostpath 目录内的 pod 卷。 您可以 创建自定义 SCC 来放松群集中的安全性,以便允许 Restic Pod 使用 hostPath 卷插件,而无需授予它们访问privileged
SCC 的权限。
默认情况下,用户维度的 openshift 名称空间不会在集群中的所有节点上调度 Pod。
要在所有节点上计划名称空间,需要一个注释:
oc annotate namespace <velero namespace> openshift.io/node-selector=""
这应该在安装 velero 之前完成。
或需要删除并重新创建 ds:
oc get ds restic -o yaml -n <velero namespace> > ds.yaml
oc annotate namespace <velero namespace> openshift.io/node-selector=""
oc create -n <velero namespace> -f ds.yaml
备份
Velero 支持发现需要使用 Restic 备份的 Pod 卷的两种方法:
-
选择性启用方式:每个包含要使用 Restic 备份的卷的 Pod 都必须标有卷的名称。
-
选择性退出方式:使用 Restic 备份所有 Pod 卷,并具有退出任何不应备份的卷的功能。
以下各节提供了有关这两种方法的更多详细信息。
选择性退出方式
在这种方法中,Velero 将使用 restic 备份所有 pod 卷,但以下情况除外:
- 安装默认服务帐户令牌,kubernetes secrets 和 config maps 的卷
- Hostpath 卷
使用 pod 上的backup.velero.io/backup-volumes-excludes
注释可以排除卷不被备份的情况。
使用此方法进行备份的说明如下:
-
在包含不应使用 Restic 备份的卷的每个 Pod 上运行以下命令
kubectl -n YOUR_POD_NAMESPACE annotate pod/YOUR_POD_NAME backup.velero.io/backup-volumes-excludes=YOUR_VOLUME_NAME_1,YOUR_VOLUME_NAME_2,...
其中,卷名是容器规范中卷的名称。
例如,在以下 pod 中:
apiVersion: v1 kind: Pod metadata: name: app1 namespace: sample spec: containers: - image: k8s.gcr.io/test-webserver name: test-webserver volumeMounts: - name: pvc1-vm mountPath: /volume-1 - name: pvc2-vm mountPath: /volume-2 volumes: - name: pvc1-vm persistentVolumeClaim: claimName: pvc1 - name: pvc2-vm claimName: pvc2
要排除卷
pvc1-vm
的 Restic 备份,应运行:kubectl -n sample annotate pod/app1 backup.velero.io/backup-volumes-excludes=pvc1-vm
-
进行 Velero 备份:
velero backup create BACKUP_NAME --default-volumes-to-restic OTHER_OPTIONS
以上步骤在每个备份的基础上使用了选择性退出方法。
或者,可以在运行带有
--default-volumes-to-restic
标志的velero install
命令的所有 velero 备份上启用此行为。 有关详细信息,请参阅 安装概述。 -
备份完成后,查看有关备份的信息:
velero backup describe YOUR_BACKUP_NAME kubectl -n velero get podvolumebackups -l velero.io/backup-name=YOUR_BACKUP_NAME -o yaml
选择性启用方式
默认情况下,Velero 使用这种方法来发现需要使用 Restic 备份的 Pod 卷,其中每个包含要使用 Restic 备份的卷的 Pod 都必须标有该卷的名称。
使用此方法进行备份的说明如下:
-
对包含要备份的卷的每个 Pod 运行以下命令:
kubectl -n YOUR_POD_NAMESPACE annotate pod/YOUR_POD_NAME backup.velero.io/backup-volumes=YOUR_VOLUME_NAME_1,YOUR_VOLUME_NAME_2,...
其中,卷名是容器 spec 中卷的名称。
例如,对于以下 pod:
apiVersion: v1 kind: Pod metadata: name: sample namespace: foo spec: containers: - image: k8s.gcr.io/test-webserver name: test-webserver volumeMounts: - name: pvc-volume mountPath: /volume-1 - name: emptydir-volume mountPath: /volume-2 volumes: - name: pvc-volume persistentVolumeClaim: claimName: test-volume-claim - name: emptydir-volume emptyDir: {}
你应该运行:
kubectl -n foo annotate pod/sample backup.velero.io/backup-volumes=pvc-volume,emptydir-volume
如果您使用控制器来管理您的 pods,则也可以在 pod template spec 中提供此批注。
-
做一个 Velero 备份
velero backup create NAME OPTIONS...
-
备份完成后,查看有关备份的信息:
velero backup describe YOUR_BACKUP_NAME kubectl -n velero get podvolumebackups -l velero.io/backup-name=YOUR_BACKUP_NAME -o yaml
恢复
无论如何使用 Restic 发现卷以进行备份,还原过程均保持不变。
-
从 Velero 备份中还原:
velero restore create --from-backup BACKUP_NAME OPTIONS...
-
还原完成后,查看有关 Pod 卷还原的信息:
velero restore describe YOUR_RESTORE_NAME kubectl -n velero get podvolumerestores -l velero.io/restore-name=YOUR_RESTORE_NAME -o yaml
限制
- 不支持
hostPath
卷。 支持 本地持久卷。 - 熟悉 restic 的人可能知道它会加密所有数据。 Velero 对它创建的所有 Restic 存储库使用静态通用加密密钥。 这意味着有权访问您的存储桶的任何人都可以解密您的还原备份数据。 确保适当限制对 Restic 桶的访问。
- 跨 PVC 的 pod 重新安排将维护增量备份链。 但是,对于非 PVC 的 pod 卷(例如
emptyDir
卷),当删除/重新创建 pod(例如,通过 ReplicaSet / Deployment)时,这些卷的下一次备份将是完整的而不是增量的,因为 pod 卷的是 假定生命周期由其 pod 定义。 - Restic 在单个线程中扫描每个文件。 这意味着大文件(例如存储数据库的文件)将花费很长时间扫描重复数据删除,即使实际差异很小。
- 如果您打算使用 Velero Restic 集成来备份 100GB 或更多的数据,则可能需要 自定义资源限制 以确保备份成功完成。
- Velero 的 Restic 集成通过访问运行 Pod 的节点文件系统来备份卷中的数据。 因此,RESTIC 集成只能备份由 Pod 挂载的卷,而不能直接从 PVC 备份。
自定义还原助手容器
Velero 在执行 Restic 还原时使用辅助初始化容器。 默认情况下,此容器的镜像是velero/velero-restic-restore-helper:<VERSION>
,其中VERSION
与主 Velero 镜像的版本/标签匹配。 您可以通过在 Velero 命名空间中创建带有备用镜像的 ConfigMap,来定制用于此帮助程序的镜像。
ConfigMap 必须如下所示:
apiVersion: v1
kind: ConfigMap
metadata:
# any name can be used; Velero uses the labels (below)
# to identify it rather than the name
name: restic-restore-action-config
# must be in the velero namespace
namespace: velero
# the below labels should be used verbatim in your
# ConfigMap.
labels:
# this value-less label identifies the ConfigMap as
# config for a plugin (i.e. the built-in restic restore
# item action plugin)
velero.io/plugin-config: ""
# this label identifies the name and kind of plugin
# that this ConfigMap is for.
velero.io/restic: RestoreItemAction
data:
# The value for "image" can either include a tag or not;
# if the tag is *not* included, the tag from the main Velero
# image will automatically be used.
image: myregistry.io/my-custom-helper-image[:OPTIONAL_TAG]
# "cpuRequest" sets the request.cpu value on the restic init containers during restore.
# If not set, it will default to "100m". A value of "0" is treated as unbounded.
cpuRequest: 200m
# "memRequest" sets the request.memory value on the restic init containers during restore.
# If not set, it will default to "128Mi". A value of "0" is treated as unbounded.
memRequest: 128Mi
# "cpuLimit" sets the request.cpu value on the restic init containers during restore.
# If not set, it will default to "100m". A value of "0" is treated as unbounded.
cpuLimit: 200m
# "memLimit" sets the request.memory value on the restic init containers during restore.
# If not set, it will default to "128Mi". A value of "0" is treated as unbounded.
memLimit: 128Mi
# "secCtxRunAsUser sets the securityContext.runAsUser value on the restic init containers during restore."
secCtxRunAsUser: 1001
# "secCtxRunAsGroup sets the securityContext.runAsGroup value on the restic init containers during restore."
secCtxRunAsGroup: 999
备份和还原如何与 Restic 一起工作
Velero 具有三个自定义资源定义和关联的控制器:
-
ResticRepository
- 代表/管理 Velero Restic 储存库 的生命周期。 当请求第一个名称空间的 Restic 备份时,Velero 将为每个名称空间创建一个 Restic 存储库。 此自定义资源的控制器执行 restic 存储库生命周期命令–restic init
,restic check
和restic prune
。您可以通过运行
velero restic repo get
来查看有关 Velero Restic 存储库的信息。 -
PodVolumeBackup
- 表示容器中卷的静态备份。当找到带注释的 pod 时,主要的 Velero 备份过程会创建一个或多个PodVolumeBackup
。群集中的每个节点都为此资源(在 daemonset 中)运行一个控制器,该控制器处理该节点上的 Pod 的PodVolumeBackups
。 控制器执行restic backup
命令以备份 pod 卷数据。 -
PodVolumeRestore
- 表示 pod volume 的恢复。 当遇到具有关联的 Restic 备份的 Pod 时,主要的 Velero 还原过程会创建其中的一个或多个PodVolumeRestore
。 群集中的每个节点都为此资源运行一个控制器(在与上述相同的 daemonset 中),该控制器处理该节点上的 Pod 的PodVolumeRestores
。 控制器执行restic restore
命令以还原 Pod 卷数据。
备份
- 根据配置,主要的 Velero 备份过程使用选择加入或选择退出方法来检查要备份的每个 Pod,以使用 Restic 备份要备份的卷。
- 找到后,Velero 首先通过以下方式确保 pod 的名称空间存在一个 Restic 存储库:
- 检查
ResticRepository
自定义资源是否已经存在 - 如果没有,创建一个新的,然后等待
ResticRepository
控制器进行初始化/检查。
- 检查
- 然后 Velero 为 pod 注释中列出的每个卷创建一个
PodVolumeBackup
自定义资源。 - 现在,主要的 Velero 进程等待
PodVolumeBackup
资源完成或失败 - 同时,每个
PodVolumeBackup
由相应节点上的控制器处理:- 具有
/var/lib/kubelet/pods
的 hostPath 卷挂载以访问 Pod 卷数据 - 在上述卷中找到 pod 卷的子目录
- 运行
restic backup
- 将自定义资源的状态更新为“Completed”或“Failed”
- 具有
- 每个
PodVolumeBackup
完成时,主 Velero 进程会将其添加到名为<backup-name>-podvolumebackups.json.gz
的文件中的 Velero 备份中。 该文件与备份 tarball 一起上传到对象存储。 它将用于还原,如下一节所述。
还原
-
Velero 的主要还原过程将检查集群中每个要备份的现有
PodVolumeBackup
自定义资源。 -
对于找到的每个
PodVolumeBackup
,Velero 首先通过以下方法确保该 pod 的命名空间存在一个 Restic 存储库:- 检查
ResticRepository
自定义资源是否已经存在 - 如果不存在,则创建一个新仓库,然后等待
ResticRepository
控制器初始化/检查它(请注意,在这种情况下,实际的仓库应该已经存在于对象存储中,因此 Velero 控制器将只对其进行完整性检查)
- 检查
-
Velero 将一个初始化容器添加到了 pod 中,该容器的工作是等待所有还原恢复以完成容器(稍后会详细介绍)
-
Velero 通过将其提交到 Kubernetes API 来创建具有添加的 init container 的 pod
-
Velero 为要在被还原的每个 Pod 中创建
PodVolumeRestore
自定义资源 -
现在,主要的 Velero 进程等待每个
PodVolumeRestore
资源完成或失败 -
同时,每个
PodVolumeRestore
由相应节点上的控制器处理:-
具有
/var/lib/kubelet/pods
的 hostPath 卷挂载以访问 Pod 卷数据 -
等待 pod 运行 init 容器
-
在上述卷中找到 pod 卷的子目录
-
运行
restic restore
-
成功后,将文件写入 Pod 卷中的
.velero
子目录中,该文件的名称是此 Pod 卷还原用于的 Velero 还原的 UID。 -
将自定义资源的状态更新为“Completed”或“Failed”
-
-
添加到 Pod 的 init 容器正在运行一个过程,该过程一直等到它在每个已还原卷中的
.velero
下找到一个文件,其名称是正在运行的 Velero 还原的 UID -
找到所有此类文件后,初始化容器的过程将成功终止,并且 pod 将继续运行其他初始化容器/主容器。
第三方控制器
监控备份注释
Velero 没有提供一种机制来检测缺少 restic 备份注释的持久卷声明。
为了解决这个问题,Thomann Bits&Beats 编写了一个控制器:velero-pvc-watcher
使用 - 集群迁移
使用 Backups 和 Restores
只要您将每个 Velero 实例指向相同的云对象存储位置,Velero 就能帮助您将资源从一个群集移植到另一个群集。 此方案假定您的群集由同一云提供商托管。 请注意,Velero 本身不支持跨云提供程序迁移持久卷快照。 如果要在云平台之间迁移卷数据,请启用 restic,它将在文件系统级别备份卷内容。
-
(集群 1)假设您尚未使用 Velero
schedule
操作对数据进行检查点检查,则需要首先备份整个群集(根据需要替换<BACKUP-NAME>
):velero backup create <BACKUP-NAME>
默认备份保留期限以 TTL(有效期)表示,为 30 天(720 小时); 您可以使用
--ttl <DURATION>
标志根据需要进行更改。 有关备份到期的更多信息,请参见 velero 的工作原理。 -
(集群 2)配置
BackupStorageLocations
和VolumeSnapshotLocations
, 指向 集群 1 使用的位置,使用velero backup-location create
和velero snapshot-location create
. 确保配置BackupStorageLocations
为 read-only 通过在velero backup-location create
时使用--access-mode=ReadOnly
flag -
(集群 2)确保已创建 Velero Backup 对象。 Velero 资源与云存储中的备份文件同步。
velero backup describe <BACKUP-NAME>
注意:默认同步间隔为 1 分钟,因此请确保在检查之前等待。 您可以使用 Velero 服务器的
--backup-sync-period
标志配置此间隔。 -
(集群 2)一旦确认现在存在正确的备份(
<BACKUP-NAME>
),就可以使用以下方法还原所有内容:velero restore create --from-backup <BACKUP-NAME>
验证 2 个集群
检查第二个群集是否按预期运行:
-
(集群 2) 运行:
velero restore get
-
然后运行:
velero restore describe <RESTORE-NAME-FROM-GET-COMMAND>
如果遇到问题,请确保 Velero 在两个群集中的相同 namespace 中运行。
使用 - 资源过滤
按 namespace、类型或标签筛选对象。
当不使用任何筛选选项时,Velero 会将所有对象包括在备份或还原中。
Includes
仅包括特定资源,不包括所有其他资源。
如果同时包含通配符和特定资源,则通配符优先。
–include-namespaces
-
备份 namespace 及其对象。
velero backup create <backup-name> --include-namespaces <namespace>
-
恢复两个 namespace 及其对象。
velero restore create <backup-name> --include-namespaces <namespace1>,<namespace2>
–include-resources
-
备份集群中的所有 deployments:
velero backup create <backup-name> --include-resources deployments
-
恢复集群中的所有 deployments 和 configmaps。
velero restore create <backup-name> --include-resources deployments,configmaps
-
在 namespace 中备份 deployments。
velero backup create <backup-name> --include-resources deployments --include-namespaces <namespace>
–include-cluster-resources
此选项可以具有三个可能的值:
-
true
: 包括所有群集范围的资源。 -
false
: 不包括群集范围的资源。 -
nil
("auto"或不提供):- 备份或还原所有 namespace 时,将包括群集范围的资源。 默认值:
true
。 - 使用 namespace 过滤时,不包括群集范围的资源。 默认值:
false
- 除非
--include-cluster-resources = false
,否则如果由自定义操作(例如,PVC-> PV)触发某些相关的群集作用域资源,则可能仍会进行备份/还原。
- 除非
- 备份或还原所有 namespace 时,将包括群集范围的资源。 默认值:
-
备份整个群集,包括群集范围内的资源。
velero backup create <backup-name>
-
仅还原群集中的命名空间资源。
velero restore create <backup-name> --include-cluster-resources=false
-
备份 namespace 并包括群集范围的资源。
velero backup create <backup-name> --include-namespaces <namespace> --include-cluster-resources=true
–selector
包括与 label selector 匹配的资源。
velero backup create <backup-name> --selector <key>=<value>
Excludes
从备份中排除特定资源。
通配符排除将被忽略。
–exclude-namespaces
-
Exclude
kube-system
from the cluster backup.velero backup create <backup-name> --exclude-namespaces kube-system
-
还原期间排除两个 namespace。
velero restore create <backup-name> --exclude-namespaces <namespace1>,<namespace2>
–exclude-resources
-
从备份中排除 secrets:
velero backup create <backup-name> --exclude-resources secrets
-
排除 secrets 和 rolebindings:
velero backup create <backup-name> --exclude-resources secrets,rolebindings
velero.io/exclude-from-backup=true
标签为velero.io/exclude-from-backup=true
的资源不包括在备份中,即使它包含匹配的选择器标签也是如此。
系列文章
📚️参考文档
三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.