一、安装
1.1 环境
- k8s:rke 1.26.6
- velero:1.9.1
1.2 资源包
velero:https://github.com/vmware-tanzu/velero/releases/tag/v1.9.1
1.3 步骤
1.3.1 安装minio对象存储
- 下载velero安装包,上传到可以使用kubectl的节点
- 解压
tar xf velero-v1.9.1-linux-amd64.tar.gz
- 安装对象存储minio,在k8s集群内安装,yaml文件在velero的examples文件夹下
kubectl apply -f velero-v1.9.1-linux-amd64/examples/minio/00-minio-deployment.yaml
安装完成会有两个pod,一个svc,如下:
[root@master98 velero]# k get po -n velero
NAME READY STATUS RESTARTS AGE
minio-8649b94fb5-br9rk 1/1 Running 0 21m
minio-setup-gfdgd 0/1 Completed 1 21m
要想访问minio web控制界面,可以查看minio pod 的日志,会有一个动态的端口。再创建一个nodeport将该端口放出来即可。
[root@master98 ~]# k logs -n velero minio-7f46d5bc87-l96bb
WARNING: MINIO_ACCESS_KEY and MINIO_SECRET_KEY are deprecated.
Please use MINIO_ROOT_USER and MINIO_ROOT_PASSWORD
API: http://10.42.1.144:9000 http://127.0.0.1:9000
Console: http://10.42.1.144:35051 http://127.0.0.1:35051
Documentation: https://docs.min.io
WARNING: Console endpoint is listening on a dynamic port (35051), please use --console-address ":PORT" to choose a static port.
You are running an older version of MinIO released 2 years ago
Update:
Run `mc admin update`
[root@master98 ~]# cat minio-nodeport.yaml
apiVersion: v1
kind: Service
metadata:
namespace: velero
name: minio-nodeport
labels:
component: minio
spec:
type: NodePort
ports:
- port: 35051
targetPort: 35051
protocol: TCP
selector:
component: minio
也可以在安装时通过 –console-address “:PORT” 命令去指定控制端口,但目前指定了暂未生效。
1.3.2 安装velero
- 创建minio访问文件,存放账密,用于velero访问minio。
cat credentials-velero [default] aws_access_key_id=minio aws_secret_access_key=minio123
- 安装velero,生成yaml。 内网可以自己改镜像,修改restic pod定义中的hostPath。原因是restic pod中需要配置宿主机kubelet pods路径,默认/var/lib/kubelet/pods,如果kubelet实际安装的不是该路径,则需要修改。
velero install \ --image velero/velero:v1.9.1 \ --plugins velero/velero-plugin-for-aws:v1.5.0 \ --provider aws \ --bucket velero \ --namespace velero \ --secret-file ./credentials-velero \ --velero-pod-cpu-request 200m \ --velero-pod-mem-request 200Mi \ --velero-pod-cpu-limit 1000m \ --velero-pod-mem-limit 1000Mi \ --use-volume-snapshots=false \ --use-restic \ --restic-pod-cpu-request 200m \ --restic-pod-mem-request 200Mi \ --restic-pod-cpu-limit 1000m \ --restic-pod-mem-limit 1000Mi \ --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio.velero.svc:9000 \ --dry-run -o yaml > velero.yaml
- 创建资源
kubectl apply -f velero.yaml
安装完成后出现restic、velero两个pod可以正常running,如下:
[root@master98 velero-v1.9.1-linux-amd64]# k get po -n velero
NAME READY STATUS RESTARTS AGE
minio-8649b94fb5-br9rk 1/1 Running 0 31m
minio-setup-gfdgd 0/1 Completed 1 31m
restic-mnp7r 1/1 Running 0 26m
velero-564df46b89-lqrcm 1/1 Running 0 26m
可以查看pod日志,看是否正常启动。
1.3.3 自定义存储位置
获取安装好的crd
[root@node-131 ~]# k get crd
NAME CREATED AT
alertmanagers.monitoring.coreos.com 2021-07-14T15:23:57Z
backups.velero.io 2023-10-30T02:52:13Z
backupstoragelocations.velero.io 2023-10-30T02:52:13Z
bgpconfigurations.crd.projectcalico.org 2021-07-14T15:14:52Z
bgppeers.crd.projectcalico.org 2021-07-14T15:14:52Z
blockaffinities.crd.projectcalico.org 2021-07-14T15:14:52Z
clusterinformations.crd.projectcalico.org 2021-07-14T15:14:52Z
deletebackuprequests.velero.io 2023-10-30T02:52:13Z
可以看到backupstoragelocations资源,使用如下可以直接编辑
[root@node-131 ~]# k edit backupstoragelocations.velero.io -n velero
...
spec:
config:
region: minio
s3ForcePathStyle: "true"
s3Url: http://minio.velero.svc:9000
default: true
objectStorage:
bucket: velero
provider: aws
...
修改 s3Url 字段即可
1.4 问题总结
1.4.1 使用velero v1.11.1安装会报
An error occurred: unknown flag: --use-restic
尝试解决: velero安装命令去掉该参数。
velero修改velero的deployment参数,注释掉相关参数。
**后续问题:**velero pod无法正常启动,查看日志报如下:
Waited for 1.04571947s due to client-side throttling, not priority and fairness, request: GET:https://10.43.0.1:443/apis/coordination.k8s.io/v1?timeout=32s
An error occurred: [custom resource ResticRepository not found in Velero API group velero.io/v1, Velero custom resources not found - apply examples/common/00-prereqs.yaml to update the custom resource definitions]
**再次尝试解决:**怀疑是版本问题,导致使用不同的参数,所以换velero版本到1.9.1,成功running!
二、使用
2.1 单次备份
2.1.1 备份k8s基础资源(不包括持久卷)
单次备份执行以下命令
velero backup create <backupName>
该命令会默认备份集群所有资源(持久卷不会备份),如果需要备份指定namespace下的资源,则可以加–include-namespaces参数,例如
velero backup create <backupName> --include-namespaces ns1,ns2
其他参数如下:
- –include-namespaces:备份该命名空间下的所有资源,不包括集群资源。
- –include-resources:要备份的资源类型。
- –include-cluster-resources:是否备份集群资源此选项可以具有三个可能的值: true:包括所有群集范围的资源; false:不包括群集范围内的资源; nil (“自动”或不提供)
备份或还原所有命名空间时,将包括集群范围的资源,默认值:true;
使用命名空间过滤时,不包括集群范围的资源,默认值:false;
有些特定的命名空间下的资源(例如PV),在备份pvc时仍会触发备份PV操作,除非使用–include-cluster-resources=false指明不备份集群资源
–selector:通过标签选择匹配的资源备份
命名执行后,客户端会将备份任务提交给服务端执行,可通过下面命令查看任务状态
velero backup get
备份有效期默认是30天,到期自动删除,可以通过参数–ttl指定。如果需要手动删除,则执行命令
velero backup delete <backupName>
如果当前备份任务正在执行,删除操作不会立即执行,它会等到任务结束(无论成功或失败)才会执行。如果在测试阶段需要立即停止任务,则可以执行以下命令,但该命令不会删除在Minio中已经备份好的部分数据,需要手动删除
kubectl delete backup <backupName> -n velero
其他备份参数可执行–help命令查看
2.1.2 备份持久卷
Velero持久卷备份有两种模式:opt-in和opt-out
- opt-out就是默认备份所有持久卷,对于不要备份需要指明
- opt-in就是默认不备份任何持久卷,对于要备份的需要指明
这里主要介绍常用的opt-in模式,opt-out模式参考https://link.zhihu.com/?target=https%3A//velero.io/docs/v1.9/restic/%23backup 官方文档,使用方法类似。
首先对需要备份的持久卷对应的pod添加annotation
kubectl -n <namespace> annotate pod/<pod> backup.velero.io/backup-volumes=<volume_name1>,<volume_name2>
然后执行备份命令即可
velero backup create <backupName>
2.2 周期备份
Velero提供周期备份的命令,参数与单次备份基本一致,这里不再赘述,详细参数可通过–help查看。
velero schedule create <backupName> --schedule="0 */12 * * *"
2.3 灾难恢复
- 将备份存储位置更新为只读模式(这可以防止在还原过程中在备份存储中创建或删除备份对象)
kubectl patch backupstoragelocation <STORAGE LOCATION NAME> \ --namespace velero \ --type merge \ --patch '{"spec":{"accessMode":"ReadOnly"}}'
- 使用最新的Velero备份还原还原数据:
velero restore create --from-backup <SCHEDULE NAME>-<TIMESTAMP>
- 还原任务完成后,将备份位置修改为读写模式
kubectl patch backupstoragelocation <STORAGE LOCATION NAME> \ --namespace velero \ --type merge \ --patch '{"spec":{"accessMode":"ReadWrite"}}'
2.4 集群迁移
2.4.1 前提条件
将每个velero实例指向相同的对象存储
2.4.2 步骤
- 集群1 创建备份
velero backup create <BACKUP-NAME>
- 集群2 使用和配置
BackupStorageLocations
和VolumeSnapshotLocations
指向集群1使用的minio位置,并将使用模式配置为只读,可在创建存储位置时以--access-mode=ReadOnly
参数指定模式。 - 集群2 确保已在集群1创建Velero Backup对象,Velero资源与云存储中的备份文件已同步。
velero backup describe <BACKUP-NAME>
- 集群2 确认
<BACKUP-NAME>
的备份存在且任务执行完成后,就可以使用以下方法还原所有内容:velero restore create --from-backup <BACKUP-NAME>
- 验证迁移结果检查集群2的还原任务是否完成
velero restore get velero restore describe <RESTORE-NAME-FROM-GET-COMMAND>
三、卸载
执行以下命令卸载velero
注意:如果minio也在velero名称空间下,会把minio也删掉!
kubectl delete namespace/velero clusterrolebinding/velero
kubectl delete crds -l component=velero
转载来自: