Velero 是一个开源工具,可以安全地备份和还原,执行灾难恢复以及迁移 Kubernetes 集群资源和持久卷。
Velero 可以在基础架构丢失,数据损坏和/或服务中断的情况下,减少恢复时间。
Velero 通过轻松地将 Kubernetes 资源从一个集群迁移到另一个集群来实现集群可移植性
提供关键数据保护功能,例如定时计划的备份,保留计划以及自定义操作的备份前或备份后钩子。
使用 namespace resources 或 label selector 备份整个集群或部分集群的 Kubernetes 资源和卷。
设置计划以定期间隔自动启动备份。
配置备份前和备份后钩子,以在 Velero 备份之前和之后执行自定义操作。
kubectl本地安装Velero 使用对象存储来存储备份和关联的工件。 它还可以选择与受支持的块存储系统集成,以对您的持久卷进行快照。 在开始安装过程之前,您应该从 兼容的提供程序列表 中识别将要使用的对象存储提供程序和可选的块存储提供程序。
Velero 支持云提供商环境和本地环境的存储提供商。 有关内部部署方案的更多详细信息,请参见 内部部署文档
tar -xvf <RELEASE-TARBALL-NAME>.tar.gzvelero放到$PATH(一般是/usr/local/bin)有两种支持的方法来安装 Velero 服务器组件:
velero install CLI 命令Velero 使用存储提供程序插件与各种存储系统集成,以支持备份和快照操作。 安装和配置 Velero 服务器组件以及相应插件的步骤特定于您选择的存储提供商。 要查找您选择的存储提供商的安装说明,请在 支持的存储提供商 页面上访问提供商的文档链接。
? 注意:
如果您的对象存储提供程序与卷快照提供程序不同,请首先按照对象存储提供程序的安装说明进行操作,然后返回此处并按照说明添加 卷快照提供程序。
https://velero.io/docs/v1.8/customize-installation/#enabling-shell-autocompletion
https://velero.io/docs/v1.8/customize-installation/
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 |
Velero 的 AWS Object Store 插件使用 Amazon 的 Go SDK 连接到 AWS S3 API。 一些第三方存储提供程序也支持 S3 API,并且用户报告了以下提供程序可用于 Velero:
? 请注意,Velero 团队并未定期测试这些存储提供商。
某些存储提供程序(例如 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-serverlabel selector 匹配的任何对象创建备份:
velero backup create test-backup --selector app=iperf3-server
或者,如果要备份除匹配标签backup=ignore的对象以外的所有对象,请执行以下操作:
velero backup create nginx-backup --selector 'backup!=ignore'
(可选)使用app=iperf3-serverlabel 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
Velero 支持使用称为 restic 的免费开源备份工具备份和还原 Kubernetes 卷。 此支持被视为 Beta 质量。 请查看 限制 列表,以了解它是否适合您的用例。
添加了 Restic 集成,为您提供了一个现成的解决方案,用于备份和还原几乎任何类型的 Kubernetes 卷。 这种集成是 Velero 功能的补充,而不是现有功能的替代。 但是,如果您需要为存储平台使用卷快照插件,或者使用的是 EFS,AzureFile,NFS,emptyDir,local 或任何其他没有本机快照概念的卷类型,restic 可能适合您 。
Restic 并不局限于特定的存储平台,这意味着该集成还为将来实现跨卷类型数据迁移的工作铺平了道路。
? 注意:
不支持 hostPath 卷,但是支持 本地卷类型。
了解 Velero 如何 通过 Restic 集成执行备份。
下载 最新的 Velero 版本。
Kubernetes v1.10.0 及更高版本。 Velero 的 Restic 集成需要 Kubernetes MountPropagation 功能,该功能在 Kubernetes v1.10.0 和更高版本中默认启用。
要安装 restic,请使用velero install命令中的--use-restic 标志。 有关安装命令的其他标志的更多详细信息,请参见 安装概述。
velero install --use-restic
在不支持快照的 Velero 支持的存储提供程序上使用 Restic 时,--use-volume-snapshots = false 标志可防止在安装时创建未使用的VolumeSnapshotLocation 。
安装后,某些基于 Kubernetes 的 PaaS / CaaS 平台也需要修改 Restic DaemonSet 规范。 仅当您在 RancherOS,OpenShift,VMware Tanzu Kubernetes Grid Integrated Edition(以前称为 VMware Enterprise PKS)或 Micrsoft Azure 上安装时,才需要本节中的步骤。
要将正确的主机路径安装到 Pod 卷,请在privileged模式下运行 Restic Pod。
将velero ServiceAccount 添加到privilegedSCC:
$ 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 卷插件,而无需授予它们访问privilegedSCC 的权限。
默认情况下,用户维度的 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 卷,但以下情况除外:
使用 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 卷。 支持 本地持久卷。emptyDir 卷),当删除/重新创建 pod(例如,通过 ReplicaSet / Deployment)时,这些卷的下一次备份将是完整的而不是增量的,因为 pod 卷的是 假定生命周期由其 pod 定义。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
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 卷数据。
ResticRepository 自定义资源是否已经存在ResticRepository 控制器进行初始化/检查。PodVolumeBackup 自定义资源。PodVolumeBackup资源完成或失败PodVolumeBackup 由相应节点上的控制器处理:
/var/lib/kubelet/pods的 hostPath 卷挂载以访问 Pod 卷数据restic backupPodVolumeBackup 完成时,主 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) 运行:
velero restore get
然后运行:
velero restore describe <RESTORE-NAME-FROM-GET-COMMAND>
如果遇到问题,请确保 Velero 在两个群集中的相同 namespace 中运行。
按 namespace、类型或标签筛选对象。
当不使用任何筛选选项时,Velero 会将所有对象包括在备份或还原中。
仅包括特定资源,不包括所有其他资源。
如果同时包含通配符和特定资源,则通配符优先。
–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"或不提供):
true。false
--include-cluster-resources = false,否则如果由自定义操作(例如,PVC-> PV)触发某些相关的群集作用域资源,则可能仍会进行备份/还原。备份整个群集,包括群集范围内的资源。
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>
从备份中排除特定资源。
通配符排除将被忽略。
–exclude-namespacesExclude 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 编写.
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,
Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功
基础版云数据库RDS的产品系列包括基础版、高可用版、集群版、三节点企业版,本文介绍基础版实例的相关信息。RDS基础版实例也称为单机版实例,只有单个数据库节点,计算与存储分离,性价比超高。说明RDS基础版实例只有一个数据库节点,没有备节点作为热备份,因此当该节点意外宕机或者执行重启实例、变更配置、版本升级等任务时,会出现较长时间的不可用。如果业务对数据库的可用性要求较高,不建议使用基础版实例,可选择其他系列(如高可用版),部分基础版实例也支持升级为高可用版。基础版与高可用版的对比拓扑图如下所示。优势 性能由于不提供备节点,主节点不会因为实时的数据库复制而产生额外的性能开销,因此基础版的性能相对于
ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear
我使用irb。下面是我写的代码。“斧头”..“bc”我期待"ax""ay""az""ba"bb""bc"但结果只是“斧头”..“bc”我该如何纠正?谢谢。 最佳答案 >puts("ax".."bc").to_aaxayazbabbbc 关于ruby-从结束值创建一系列字符串,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7617092/
(本文是网络的宏观的概念铺垫)目录计算机网络背景网络发展认识"协议"网络协议初识协议分层OSI七层模型TCP/IP五层(或四层)模型报头以太网碰撞路由器IP地址和MAC地址IP地址与MAC地址总结IP地址MAC地址计算机网络背景网络发展 是最开始先有的计算机,计算机后来因为多项技术的水平升高,逐渐的计算机变的小型化、高效化。后来因为计算机其本身的计算能力比较的快速:独立模式:计算机之间相互独立。 如:有三个人,每个人做的不同的事物,但是是需要协作的完成。 而这三个人所做的事是需要进行协作的,然而刚开始因为每一台计算机之间都是互相独立的。所以前面的人处理完了就需要将数据
使用RubyonRails,我使用给定的增量(例如每30分钟)用时间填充“选择”。目前我正在YAML文件中写出所有的可能性,但我觉得有一种更巧妙的方法。我想我想提供一个开始时间、一个结束时间、一个增量,并且目前只提供一个名为“关闭”的选项(想想“business_hours”)。所以,我的选择可能会显示:'Closed'5:00am5:30am6:00am...[allthewayto]...11:30pm谁能想出更好的方法,或者只是将它们全部“拼写”出来的最佳方法? 最佳答案 此答案基于@emh的答案。defcreate_hour