Velero迁移Kubernetes数据

简介

什么是Velero

Velero 是vmware开源的一个云原生的灾难恢复和迁移工具,它本身也是开源的,采用Go语言编写,可以安全的备份、恢复和迁移Kubernetes集群资源数据;官网https://velero.io/

Velero 支持标准的K8S集群,既可以是私有云平台也可以是公有云,除了灾备之外它还能做资源移转,支持把容器应用从一个集群迁移到另一个集群。Velero 的工作方式就是把kubernetes中的数据备份到对象存储以实现高可用和持久化,默认的备份保存时间为720小时,并在需要的时候进行下载和恢复。

Velero与Etcd备份恢复区别

  • etcd 备份整个Kubernetes集群所有资源。
  • Velero可以有针对性的备份,比如按照namespace单独备份、只备份单独的资源对象等,在恢复的时候可以根据备份只恢复单独的namespace或资源对象,而不影响其它namespace中pod运行服务。
  • velero支持ceph、oss等对象存储,etcd 快照是一个为本地文件。
  • velero支持任务计划实现周期备份,但etcd 快照也可以基于cronjob实现。

Velero架构

image-20250207172040415

Velero备份流程

image-20250207172139661

部署minio对象存储

创建minio数据目录

mkdir -p /data/minio

启动minio对象存储容器

docker run -itd \
-p 9000:9000 \
-p 9001:9001 \
--name minio \
-v ~/minio/data:/data \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=12345678" \
quay.io/minio/minio:RELEASE.2024-03-26T22-10-45Z server /data --console-address ":9001"

浏览器登录:http://192.168.234.132:9001/login

创建bucket

image-20240402155719039

创建用户rke,权限为读写

image-20240402164653043

k8s部署velero

安装velero客户端

wget https://github.com/vmware-tanzu/velero/releases/download/v1.13.1/velero-v1.13.1-linux-amd64.tar.gz
tar xf velero-v1.13.1-linux-amd64.tar.gz
cp velero-v1.13.1-linux-amd64/velero /usr/local/bin/
chmod 777 /usr/local/bin/velero
velero version

配置velero认证环境

创建配置文件

cat >/data/minio/velero-auth.txt<<EOF 
[default]
aws_access_key_id = rke
aws_secret_access_key = 12345678
EOF

安装velero服务端

创建namespace

kubectl create ns velero-system

velero对应plugin版本

Plugin Version Velero Version
v1.9.x v1.13.x
v1.8.x v1.12.x
v1.7.x v1.11.x
v1.6.x v1.10.x
v1.5.x v1.9.x
v1.4.x v1.8.x
v1.3.x v1.7.x

velero plugin版本获取地址:https://github.com/vmware-tanzu/velero-plugin-for-aws/releases

安装velero

velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.9.1 \
--bucket rke \
--secret-file /data/minio/velero-auth.txt \
--use-volume-snapshots=false \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://192.168.234.132:9000

确认velero pod正常运行

$kubectl get pod -n velero
NAME READY STATUS RESTARTS AGE
velero-58f469fc77-lhr5n 1/1 Running 0 4m16s

备份与恢复

部署nginx

apiVersion: apps/v1  
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80

---

apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30001
selector:
app: nginx
kubectl apply -f nginx.yaml

备份

指定资源备份

备份集群资源的同时备份pod

velero backup create backup01 --include-cluster-resources=true --ordered-resources 'pods=default/nginx' --include-namespaces=default

只备份deployment

velero backup create backup-nginx-deployment --ordered-resources 'deployment=default/nginx-deployment' --include-namespaces=default

查看备份结果

$ velero backup get
NAME STATUS ERRORS WARNINGS CREATED EXPIRES STORAGE LOCATION SELECTOR
backup-nginx-deployment Completed 0 0 2024-04-03 11:22:04 +0800 CST 29d default <none>
backup02 Completed 0 1 2024-04-03 11:16:25 +0800 CST 29d default <none>

登录minio查看备份结果

image-20240403113353562

定时备份

Velero支持定时备份,通过Schedule Backup可以实现定时备份,定时备份可以帮助用户按计划备份集群资源,定时备份可以帮助用户节省存储空间,提高集群的可靠性。
Schedule Backup允许使用cron表达式定义定时备份,语法:

velero schedule create NAME --schedule="* * * * *" [flags]

定义一个定时备份,每天3点运行。定时备份名称格式为:<SCHEDULE NAME>-<TIMESTAMP><TIMESTAMP>格式为YYYYMMDDhhmmss

velero schedule create <backup_name> --schedule="0 3 * * *"

定义备份default namespace所有资源,每一个小时执行一次

velero create schedule <backup_name> --schedule="@every 1h" --include-namespaces default

查看定义的定时备份

$ velero schedule get
NAME STATUS CREATED SCHEDULE BACKUP TTL LAST BACKUP SELECTOR PAUSED
default-backup Enabled 2024-04-03 11:35:07 +0800 CST @every 1h 0s n/a <none> false

删除备份

仅删除备份自定义资源,并且不会从对象/块存储中删除任何关联数据

kubectl delete backup <backupName> -n <veleroNamespace>

将删除备份资源,包括对象/块存储中的所有数据

velero backup delete <backupName>

恢复

删除nginx deployment和svc

kubectl delete deployment/nginx-deployment
kubectl delete svc/nginx-service

查询备份存储名称

$ kubectl get backupstoragelocation -n velero
NAME PHASE LAST VALIDATED AGE DEFAULT
default Available 1s 118m true

设置备份存储为只读

kubectl patch backupstoragelocation default \
--namespace velero \
--type merge \
--patch '{"spec":{"accessMode":"ReadOnly"}}'

恢复备份

$ velero restore create --from-backup backup-nginx-deployment
Restore request "backup-nginx-deployment-20240403123904" submitted successfully.
Run `velero restore describe backup-nginx-deployment-20240403123904` or `velero restore logs backup-nginx-deployment-20240403123904` for more details.

查看恢复的pod

$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 1/1 1 1 32s
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 147m
nginx-service NodePort 10.43.160.57 <none> 80:30001/TCP 35s

恢复备份存储为读写

kubectl patch backupstoragelocation default \
--namespace velero \
--type merge \
--patch '{"spec":{"accessMode":"ReadWrite"}}'
文章作者: 慕容峻才
文章链接: https://www.acaiblog.top/velero迁移Kubernetes数据/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 阿才的博客
微信打赏
支付宝打赏