一. 什么是Velero
集群备份:Velero 允许您对 Kubernetes 集群中的所有资源(如 Deployment、Service、ConfigMap 等)以及数据卷(PVC)进行备份。您可以执行一次性备份,或通过定期任务实现自动备份,确保集群始终有最新的可用备份。 灾难恢复:如果集群由于硬件故障、系统崩溃或误操作而丢失数据或配置,Velero 可以快速恢复之前备份的资源和数据,减少宕机时间和业务损失。 数据迁移:Velero 可以在不同的 Kubernetes 集群之间迁移资源和数据。例如,您可以将开发环境中的工作负载迁移到生产环境,或者将工作负载从一个云服务商迁移到另一个云服务商。这使得多集群环境下的工作负载迁移更加轻松。
$ kubectl create ns velero
# storage.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: velero-pv
spec:
capacity:
storage: 100Gi
accessModes:
- ReadWriteMany
nfs:
server: 192.168.1.10 #按实际环境为修改
path: /velero-backups/k8s-dev #按实际环境为修改
readOnly: false
persistentVolumeReclaimPolicy: Retain
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: velero-pvc
namespace: velero
spec:
storageClassName: ""
accessModes:
- ReadWriteMany
resources:
requests:
storage: 100Gi
volumeName: velero-pv
$ kubectl create -f storage.yaml
# minio.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: velero
name: minio
labels:
component: minio
spec:
strategy:
type: Recreate
selector:
matchLabels:
component: minio
template:
metadata:
labels:
component: minio
spec:
volumes:
- name: storage
persistentVolumeClaim:
claimName: velero-pvc
- name: config
emptyDir: {}
containers:
- name: minio
image: minio/minio:RELEASE.2023-03-20T20-16-18Z
imagePullPolicy: IfNotPresent
args:
- server
- /data
- --config-dir=/config
- --console-address=:9001
env:
- name: MINIO_ROOT_USER
value: "admin"
- name: MINIO_ROOT_PASSWORD
value: "minio123"
ports:
- containerPort: 9000
- containerPort: 9001
volumeMounts:
- name: storage
mountPath: /data
- name: config
mountPath: "/config"
resources:
limits:
cpu: "2"
memory: 4Gi
requests:
cpu: "0.5"
memory: 0.5Gi
---
apiVersion: v1
kind: Service
metadata:
namespace: velero
name: minio
labels:
component: minio
spec:
type: LoadBalancer # 对于不支持LoadBalancer的环境,可使用Nodeport。
ports:
- name: port-9000
port: 9000
protocol: TCP
targetPort: 9000
- name: console
port: 9001
protocol: TCP
targetPort: 9001
selector:
component: minio
$ kubectl create -f minio.yaml
在部署Velero前需要注意,Velero与k8s集群有兼容性要求,因此需要选择与集群相对应的Velero版本。
$ tar xvf velero-v1.12.4-linux-amd64.tar.gz
$ mv velero-v1.12.4-linux-amd64/velero /usr/bin/
$ chmod +x /usr/bin/velero
$ velero version
Client:
Version: v1.12.4
Git commit: 7d8417b2c58792422ed6dd4b4c0cf3848b0beb56
# credentials-velero
[default]
aws_access_key_id = admin
aws_secret_access_key = minio123
velero install \
# 指定存储提供商,minio用的是s3,所以这里是aws
--provider aws \
# 指定aws插件
--plugins velero/velero-plugin-for-aws:v1.8.2 \
# 指定velero镜像
--image velero/velero:v1.12.4 \
# 指定命名空间
--namespace velero \
# 指定bucket名称
--bucket velero \
# 默认以文件系统方式备份持久化卷
--default-volumes-to-fs-backup \
# 禁用卷快照功能
--use-volume-snapshots=false \
# 指定S3存储桶凭证
--secret-file ./credentials-velero \
# 启用node agent 用于文件系统的备份/恢复操作 (可选)
--use-node-agent \
# 配置备份存储位置的详细信息,填写minio的api地址。
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio:9000
$ kubectl get pod -n velero
NAME READY STATUS RESTARTS AGE
minio-6d47959c59-9s5z6 1/1 Running 0 6h32m
node-agent-c7lql 1/1 Running 0 6h11m
node-agent-fh5jt 1/1 Running 0 6h11m
node-agent-gvd5l 1/1 Running 0 6h11mvelero-5cc44ff6c7-hb8gn 1/1 Running 0 6h11m
velero backup create k8s-dev-backup
$ velero backup create default-backup --include-namespaces default
$ velero backup create deployment-backup --include-resources deployment
备份挂载卷数据
默认情况下,Velero不会备份Pod挂载的PVC卷数据。如果需要进行存储卷备份,需要安装node agent,并在对应的Pod按添加注释:
$ kubectl annotate pod <pod_name> backup.velero.io/backup-volumes=<volume_name>
2. 恢复数据
Velero默认情况下不会对现有资源进行修改,如果目标集群中资源已经存在,则在恢复过程中会跳过该资源。但对于SA(Service Accounts)资源除外,此时Velero 会尝试将备份内容与目标集群中的SA资源进行差异合并。
集群级别恢复
$ velero restore create --from-backup k8s-dev-backup
命名空间恢复
$ velero restore create --from-backup k8s-dev-backup --include-namespaces default
恢复某个类型的资源
$ velero restore create --from-backup k8s-dev-backup --include-namespaces default --include-resources persistentvolumeclaims,persistentvolumes
3. 设置定时备份任务
当搭建好Velero后,可以配置定时任务,这样即可以每天自动进行备份。
$ velero schedule create k8s-dev --schedule="0 1 * * *" --exclude-resources pods --ttl 240h
------------------ END ------------------
关注公众号,获取更多精彩内容