1、灾难恢复
可通过定时和只读备份定期备份集群数据,在集群发生故障或升级失败时及时恢复。
若在在发生某些意外情况(例如服务中断)的情况下需要回退到先前的状态,可使用Velero进行以下操作:
(1)在集群上首次运行Velero服务器之后,请设置每日备份(
这将创建一个名为的备份对象
velero schedule create <SCHEDULE NAME> --schedule "0 7 * * *"
(2)发生故障或升级失败时,需要重新根据备份数据创建资源 (3)将备份存储位置更新为只读模式(这可以防止在还原过程中在备份存储中创建或删除备份对象):
# 例如:创建schedule资源,每天10天备份一次,备份过期时间48小时
velero schedule create schedule-backup --schedule "0 10 * * *" --ttl 48h
(4)使用最新的Velero备份还原还原数据:
kubectl patch backupstoragelocation <STORAGE LOCATION NAME> \
--namespace velero \
--type merge \
--patch '{"spec":{"accessMode":"ReadOnly"}}'
(5)还原任务完成后,将备份位置修改为读写模式
velero restore create --from-backup <SCHEDULE NAME>-<TIMESTAMP>
kubectl patch backupstoragelocation <STORAGE LOCATION NAME> \
--namespace velero \
--type merge \
--patch '{"spec":{"accessMode":"ReadWrite"}}'
2、集群迁移
只要您将每个Velero实例指向相同的对象存储,Velero就能帮助您将资源从一个群集迁移到另一个群集。此方案假定您的群集由同一云提供商托管,请注意,Velero本身不支持跨云供应商迁移持久卷快照,如果要在云平台之间迁移卷数据,请启用 restic,它将在文件系统级别备份卷内容。 (1)(集群1)如果你尚未对集群进行备份操作,则需要首先备份整个集群(默认备份保留期限以TTL(有效期)表示,为30天(720小时);您可以通过—ttl参数更改备份过器时间。 (2)(集群2)使用和配置BackupStorageLocations和VolumeSnapshotLocations指向集群1使用的minio位置,并将使用模式配置为只读,可在创建存储位置时以—access-mode=ReadOnly参数指定模式。 (3)(集群2)确保已在集群1创建Velero Backup对象,Velero资源与云存储中的备份文件已同步。
velero backup create <BACKUP-NAME>
# 例如
velero backup create full-backup
velero backup describe <BACKUP-NAME>
- 注意:默认同步间隔是1分钟,您可以使用—backup-sync-period来设置Velero服务端的同步时间间隔。
(5)验证迁移结果 检查集群2的还原任务是否完成
velero restore create --from-backup <BACKUP-NAME>
velero restore get
velero restore describe <RESTORE-NAME-FROM-GET-COMMAND>
- 如果遇到问题,请确保Velero在两个集群中所在的命名空间相同。
3、过滤备份对象
在备份资源时,velero支持按照不同的方式筛选备份对象,主要有以下两种方式:1、包括的备份对象:
备份时仅包括特定资源,不包括所有其他资源,如果同时包含通配符和特定资源,则通配符优先。 (1)备份命名空间及其对象:
--include-namespaces:备份该命名空间下的所有资源,不包括集群资源
--include-resources:要备份的资源类型
--include-cluster-resources:是否备份集群资源
此选项可以具有三个可能的值:
true:包括所有群集范围的资源;
false:不包括群集范围内的资源;
nil (“自动”或不提供)
备份或还原所有命名空间时,将包括集群范围的资源,默认值:true;
使用命名空间过滤时,不包括集群范围的资源,默认值:false;
有些特定的命名空间下的资源(例如PV),在备份pvc时仍会触发备份PV操作,除非使用--include-cluster-resources=false指明不备份集群资源
--selector:通过标签选择匹配的资源备份
(2)恢复两个名称空间及其对象。
velero backup create <backup-name> --include-namespaces <namespace>
(3)备份集群中的所有deployment
velero restore create <backup-name> --include-namespaces <namespace1>,<namespace2>
(4)还原集群中的所有deployment和configmap
velero backup create <backup-name> --include-resources deployments
(5)备份特定命名空间中的deployment
velero restore create <backup-name> --include-resources deployments,configmaps
(6)备份整个集群,包括集群范围内的资源
velero backup create <backup-name> --include-resources deployments --include-namespaces <namespace>
(7)仅还原集群中的命名空间资源
velero backup create <backup-name>
(8)备份名称空间并包括群集范围的资源
velero restore create <backup-name> --include-cluster-resources=false
(9)备份与标签选择器匹配的资源
velero backup create <backup-name> --include-namespaces <namespace> --include-cluster-resources=true
velero backup create <backup-name> --selector <key>=<value>
2、不包括的备份对象
从备份中排除特定资源,通配符匹配的将不会被排除 (10)从集群备份中排除命名空间kube-system
--exclude-namespaces:备份时该命名空间下的资源不进行备份
--exclude-resources:备份时该类型的资源不进行备份
--velero.io/exclude-from-backup=true:当标签选择器匹配到该资源时,若该资源带有此标签,也不进行备份
(11)还原期间排除两个命名空间
velero backup create <backup-name> --exclude-namespaces kube-system
(12)备份时排除Secret
velero restore create <backup-name> --exclude-namespaces <namespace1>,<namespace2>
(13)备份时排除secret和rolebindings
velero backup create <backup-name> --exclude-resources secrets
(14)从备份中排除特定项目 即使单个项目与备份规范中定义的资源/名称空间/标签选择器匹配,也可以将其排除在备份之外,可通过如下命令进行标记:
velero backup create <backup-name> --exclude-resources secrets,rolebindings
(15)指定特定种类资源的备份顺序 可通过使用–ordered-resources参数,按特定顺序备份特定种类的资源,需要指定资源名称和该资源的对象名称列表,资源对象名称以逗号分隔,其名称格式为“命名空间/资源名称”,对于集群范围资源,只需使用资源名称。映射中的键值对以分号分隔,资源类型是复数形式。
kubectl label -n <ITEM_NAMESPACE> <RESOURCE>/<NAME> velero.io/exclude-from-backup=true
velero backup create backupName --include-cluster-resources=true --ordered-resources 'pods=ns1/pod1,ns1/pod2;persistentvolumes=pv4,pv8' --include-namespaces=ns1
velero backup create backupName --ordered-resources 'statefulsets=ns1/sts1,ns1/sts0' --include-namespaces=ns1
4、备份hooks
Velero支持在备份任务执行之前和执行后在容器中执行一些预先设定好的命令。
执行备份时,可以指定一个或多个命令,以在待备份的pod的容器中执行,可以将要执行的命令配置为在任何自定义动作处理之前(pre hook)运行,或者在所有自定义动作完成并且完成了备份动作指定的任何其他项(post hook)之后运行。
注意,钩子不在容器的**shell**内执行。
有两种方法可以指定钩子:pod本身的注释声明和在定义Backup任务时的Spec中声明。1、在pod的注释中声明
您可以在Pod上使用以下注释,以使Velero在备份Pod时执行钩子任务:- Pre hooks
pre.hook.backup.velero.io/container:将要执行命令的容器,默认为pod中的第一个容器,可选的。
pre.hook.backup.velero.io/command:要执行的命令,如果需要多个参数,请将该命令指定为JSON数组。例如:["/usr/bin/uname", "-a"]
pre.hook.backup.velero.io/on-error:如果命令返回非零退出代码如何处理。默认为“Fail”,有效值为“Fail”和“Continue”,可选的。
pre.hook.backup.velero.io/timeout:等待命令执行的时间,如果命令超过超时,则认为该挂钩失败的。默认为30秒,可选的。
- Post hooks
以下示例将引导您同时使用前挂钩和后挂钩来冻结文件系统,冻结文件系统对于确保在制作快照之前完成所有待处理的磁盘I / O操作很有用。 (1)创建待备份的对象
post.hook.backup.velero.io/container:将要执行命令的容器,默认为pod中的第一个容器,可选的。
post.hook.backup.velero.io/command:要执行的命令,如果需要多个参数,请将该命令指定为JSON数组。例如:["/usr/bin/uname", "-a"]
post.hook.backup.velero.io/on-error:如果命令返回非零退出代码如何处理。默认为“Fail”,有效值为“Fail”和“Continue”,可选的。
post.hook.backup.velero.io/timeout:等待命令执行的时间,如果命令超过超时,则认为该挂钩失败的。默认为30秒,可选的。
(2)为待备份的对象添加钩子任务的注解
---
apiVersion: v1
kind: Namespace
metadata:
name: nginx-example
labels:
app: nginx
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nginx-logs
namespace: nginx-example
labels:
app: nginx
spec:
# Optional:
# storageClassName: <YOUR_STORAGE_CLASS_NAME>
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Mi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: nginx-example
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
volumes:
- name: nginx-logs
persistentVolumeClaim:
claimName: nginx-logs
containers:
- image: nginx:1.17.6
name: nginx
ports:
- containerPort: 80
volumeMounts:
- mountPath: "/var/log/nginx"
name: nginx-logs
readOnly: false
- image: ubuntu:bionic
name: fsfreeze
securityContext:
privileged: true
volumeMounts:
- mountPath: "/var/log/nginx"
name: nginx-logs
readOnly: false
command:
- "/bin/bash"
- "-c"
- "sleep infinity"
---
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx
name: my-nginx
namespace: nginx-example
spec:
ports:
- port: 80
targetPort: 80
selector:
app: nginx
type: LoadBalancer
(3)创建备份来测试pre hooks和post hooks,您可以使用Velero日志来验证任务是否正在运行并退出而没有错误。
kubectl annotate pod -n nginx-example -l app=nginx \
pre.hook.backup.velero.io/command='["/sbin/fsfreeze", "--freeze", "/var/log/nginx"]' \
pre.hook.backup.velero.io/container=fsfreeze \
post.hook.backup.velero.io/command='["/sbin/fsfreeze", "--unfreeze", "/var/log/nginx"]' \
post.hook.backup.velero.io/container=fsfreeze
需要在任务中执行多个命令时,可参考以下形式添加注解,同一个命令间的多个参数使用,分割,多个命令之间通过&&分割
velero backup create nginx-hook-test
velero backup get nginx-hook-test
velero backup logs nginx-hook-test | grep hookCommand
pre.hook.backup.velero.io/command='["/bin/bash", "-c", "echo hello > hello.txt && echo goodbye > goodbye.txt"]'
2、在定义备份任务时声明
请参考相关CRD资源信息里的Backup的定义示例5、还原备份数据
Velero可以将资源还原到与其备份来源不同的命名空间中。可以使用—namespace-mappings参数来指定:
velero restore create RESTORE_NAME \
--from-backup BACKUP_NAME \
--namespace-mappings old-ns-1:new-ns-1,old-ns-2:new-ns-2