一、简介
Velero 是一款云原生时代的灾难恢复和迁移工具,采用 Go 语言编写,并在 github 上进行了开源,利用 velero 用户可以安全的备份、恢复和迁移 Kubernetes 集群资源和持久卷。
1.1 支持的版本列表
1.2 Velero组件
Velero 组件一共分两部分,分别是服务端和客户端。
- 服务端:运行在你 Kubernetes 的集群中
- 客户端:是一些运行在本地的命令行的工具,需要已配置好 kubectl 及集群 kubeconfig 的机器上
1.3 velero备份流程
- velero客户端调用kubernetes API Server创建backup任务
- Backup控制器基于watch机制通过Api Server获取到备份任务
- Backup控制器开始执行备份动作,会通过请求Api Server获取到需要备份的数据
- Backup 控制器将获取到的数据备份到指定的对象存储server端
1.4 Velero后端存储
Velero
支持两种关于后端存储的CRD
,分别是BackupStorageLocation
和VolumeSnapshotLocation
。
1.4.1 BackupStorageLocation
主要用来定义 Kubernetes 集群资源的数据存放位置,也就是集群对象数据,不是 PVC 的数据。主要支持的后端存储是 S3 兼容的存储,比如:Mino 和阿里云 OSS 等。
1.4.2 VolumeSnapshotLocation
主要用来给 PV 做快照,需要云提供商提供插件。阿里云已经提供了插件,这个需要使用 CSI 等存储机制。你也可以使用专门的备份工具 Restic
,把 PV 数据备份到阿里云 OSS 中去(安装时需要自定义选项)。
Restic 是一款 GO 语言开发的数据加密备份工具,顾名思义,可以将本地数据加密后传输到指定的仓库。支持的仓库有 Local、SFTP、Aws S3、Minio、OpenStack Swift、Backblaze B2、Azure BS、Google Cloud storage、Rest Server。
二、准备存储插件
Velero支持很多种存储插件,可查看:Velero Docs - Providers获取插件信息,我们这里使用minio作为S3兼容的对象存储提供程序。您也可以在任意地方部署Minio对象存储,只需要保证K8S集群可以访问到即可。
2.1 准备minio清单
--- |
|
apiVersion: v1 |
|
kind: Service |
|
metadata: |
|
name: minio |
|
namespace: velero |
|
labels: |
|
app: minio |
|
spec: |
|
selector: |
|
app: minio |
|
ports: |
|
- name: api |
|
port: 9000 |
|
protocol: TCP |
|
- name: console |
|
port: 9001 |
|
protocol: TCP |
|
--- |
|
apiVersion: apps/v1 |
|
kind: StatefulSet |
|
metadata: |
|
name: minio |
|
namespace: velero |
|
labels: |
|
app: minio |
|
spec: |
|
replicas: 1 |
|
serviceName: minio |
|
selector: |
|
matchLabels: |
|
app: minio |
|
template: |
|
metadata: |
|
labels: |
|
app: minio |
|
spec: |
|
containers: |
|
- name: minio |
|
image: docker.io/bitnami/minio:2023.3.22 |
|
imagePullPolicy: IfNotPresent |
|
ports: |
|
- containerPort: 9000 |
|
name: api |
|
protocol: TCP |
|
- containerPort: 9001 |
|
name: console |
|
protocol: TCP |
|
env: |
|
- name: MINIO_ROOT_USER |
|
value: "minio" |
|
- name: MINIO_ROOT_PASSWORD |
|
value: "minio123" |
|
- name: MINIO_DEFAULT_BUCKETS |
|
value: "velero" |
|
volumeMounts: |
|
- name: data |
|
mountPath: /data |
|
volumeClaimTemplates: |
|
- metadata: |
|
name: data |
|
spec: |
|
accessModes: [ "ReadWriteOnce" ] |
|
resources: |
|
requests: |
|
storage: 50Gi |
2.2 创建minio应用
# 创建velero命名空间 |
|
$ kubectl create namespace velero |
|
# 创建minio资源 |
|
$ kubectl apply -f minio.yaml |
|
# 查看部署状态 |
|
$ kubectl get sts,pod,svc -n velero |
|
NAME READY AGE |
|
statefulset.apps/minio 1/1 66s |
|
NAME READY STATUS RES |