一、简介
Velero 是一个提供 Kubernetes 集群和持久卷的备份、迁移以及灾难恢复等的开源工具。
Velero 是一个云原生的灾难恢复和迁移工具,它本身也是开源的, 采用 Go 语言编写,可以安全的备份、恢复和迁移Kubernetes集群资源和持久卷。
Velero 是一种云原生的Kubernetes优化方法,支持标准的K8S集群,既可以是私有云平台也可以是公有云。除了灾备之外它还能做资源移转,支持把容器应用从一个集群迁移到另一个集群。
使用velero可以对集群进行备份和恢复,降低集群DR造成的影响。velero的基本原理就是将集群的数据以json格式备份到对象存储中,在恢复的时候将数据从对象存储中拉取下来。
组成部分
Velero组件一共分两部分,分别是客户端和服务端。
- 客户端:运行在本地的velero命令行工具,包括安装服务端、备份、定时任务备份、恢复等命令,特别需要注意的是,安装服务端时需要在机器上已配置好kubectl及集群kubeconfig。
- 服务端:运行在Kubernetes集群中(运行在Pod中)。
velero使用场景
- 灾备场景:提供备份恢复k8s集群的能力
- 迁移场景:提供拷贝集群资源到其他集群的能力(两个集群连接同一个对象存储地址)
velero备份与直接对etcd备份区别
- 直接备份 Etcd 是将集群的全部资源备份起来,而 Velero 可以对 Kubernetes 集群内对象级别进行备份。
- 除了对 Kubernetes 集群进行整体备份外,Velero 还可以通过对 Type、Namespace、Label、Pod
等对象进行分类备份或者恢复。
Velero备份恢复思维导图
二、原理
Velero工作原理
每个Velero的操作(如按需备份backup,计划备份schdule,还原restore)都是自定义资源,使用Kubernetes 自定义资源定义(CRD)定义并存储在 etcd中,Velero还包括 对自定义资源执行备份、恢复和所有相关操作的控制器,例如备份控制器BackupController、恢复控制器RestoreController ,诸如此类的控制器在成功部署velero服务器后就生效了,它们负责监听对应的自定义资源(backup,schdule,restore),在监听到这些自定义资源后,验证它们,通过验证的资源将加入到velero的工作队列中,有序的完成它们对应的工作流程。Velero非常灵活,可以备份或还原群集中的所有对象,也可以按类型,命名空间或标签过滤对象。
备份工作流程
当运行velero backup create 时:
- Velero客户端调用Kubernetes API server以创建Backup对象;
- 该BackupController检测到Backup对象被创建并执行验证;
- BackupController开始备份过程,它通过向Kubernetes API server查询资源来收集要备份的数据;
- BackupController调用对象存储服务(例如AWS S3 : MinIO)上载备份文件。
默认情况下,velero backup create支持任何持久卷的磁盘快照,您可以通过指定其他标志来调整快照,运行velero backup create --help可以查看可用的标志,可以使用--snapshot-volumes=false选项禁用快照。
官网原图
恢复工作流程
当运行 velero restore create 时:
- Velero客户端调用Kubernetes API server以创建Restore对象;
- 该RestoreController 检测到Restore对象被创建并执行验证;
- RestoreController 从对象存储服务中获取指定备份信息。然后,它在备份的资源上运行一些预处理,以确保资源能在新的集群上工作。包括:
- 对资源进行排序,以确定Velero的恢复顺序;
- 通过Kubernetes Group Version Resource(GVR)甄别资源。如果资源无法被甄别,Velero将从恢复中排除它;
- 资源过滤筛选(例如选择某个namespace、排除某个namespace);
- 如果已配置--namespacemappings-restore选项,将验证目标命名空间;
- 保存在对象存储上的信息非常多,velero会整理过滤标准资源创建脚本,从恢复出与原来一样名称的资源。
- RestoreController开始逐个恢复符合条件的资源。Velero将当前资源提取到Kubernetes资源对象中。根据您指定的资源类型和恢复选项,Velero将在尝试创建资源之前对资源进行以下修改或对目标集群进行准备:
- RestoreController确保目标命名空间存在。如果目标命名空间不存在,RestoreController将在集群上创建一个新的命名空间;
- 如果资源是PersistentVolume(PV),RestoreController将重命名PV并重新映射其namespace;
- 如果资源是 PersistentVolumeClaim(PVC),RestoreController将修改PVC元数据;
- RestoreController在目标集群上创建资源对象。如果资源是PV,则RestoreController将根据PV的备份方式从持久快照、文件系统备份或CSI快照中恢复PV数据;
- 默认情况下,Velero 执行的是非破坏性还原,意味着它不会删除目标集群上的任何数据。如果备份中的某个资源已经存在于目标集群中,Velero 将跳过该资源;
可以使用 --existing-resource-policy restore 标志来配置 Velero 使用更新策略, 当这个标志被设置为 update 时,Velero 将尝试更新目标集群中的现有资源,以匹配备份中的资源。
三、velero结合MinIo实现备份、恢复、迁移
1. k8s集群搭建
角色 |
ip地址 |
组件 |
k8s-1-master |
192.168.138.145 |
docker,kubectl,kubeadm,kubelet |
k8s-1-node1 |
192.168.138.146 |
docker,kubectl,kubeadm,kubelet |
k8s-2-master |
192.168.138.147 |
docker,kubectl,kubeadm,kubelet |
k8s-2-node1 |
192.168.138.148 |
docker,kubectl,kubeadm,kubelet |
环境初始化
以下操作均需要在四台机器上执行
检查操作系统的版本
# 此方式下安装kubernetes集群要求Centos版本要在7.5或之上
[root@master ~]# cat /etc/redhat-release
Centos Linux 7.5.1804 (Core)
主机名解析
为了方便集群节点间的直接调用,在这个配置一下主机名解析
# 主机名成解析 编辑四台服务器的/etc/hosts文件,添加下面内容
192.168.138.145 k8s-1-master
192.168.138.146 k8s-1-node1
192.168.138.147 k8s-2-master
192.168.138.148 k8s-2-node1
时间同步
kubernetes要求集群中的节点时间必须精确一直,这里使用chronyd服务从网络同步时间
# 启动chronyd服务
[root@master ~]# systemctl start chronyd
[root@master ~]# systemctl enable chronyd
[root@master ~]# date
禁用iptable和firewalld服务
kubernetes和docker 在运行的中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则
# 1 关闭firewalld服务
[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
# 2 关闭iptables服务
[root@master ~]# systemctl stop iptables
[root@master ~]# systemctl disable iptables
禁用selinux
selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题
# 编辑 /etc/selinux/config 文件,修改SELINUX的值为disable
# 注意修改完毕之后需要重启linux服务 SELINUX=disabled
禁用swap分区
swap分区指的是虚拟内存分区,它的作用是物理内存使用完,之后将磁盘空间虚拟成内存来使用,启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备,但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明
# 编辑分区配置文件/etc/fstab,注释掉swap分区一行
# 注意修改完毕之后需要重启linux服务 vim /etc/fstab 注释掉 /dev/mapper/centos-swap swap
# /dev/mapper/centos-swap swap
修改linux的内核参数
# 修改linux的内核采纳数,添加网桥过滤和地址转发功能
# 编辑/etc/sysctl.d/kubernetes.conf文件,添加如下配置:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
# 重新加载配置
[root@master ~]# sysctl -p
# 加载网桥过滤模块
[root@master ~]# modprobe br_netfilter
# 查看网桥过滤模块是否加载成功
[root@master ~]# lsmod | grep br_netfilter
配置ipvs功能
在Kubernetes中Service有两种带来模型,一种是基于iptables的,一种是基于ipvs的两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块
# 1.安装ipset和ipvsadm
[root@master ~]# yum install ipset ipvsadm -y
# 2.添加需要加载的模块写入脚本文件
[root@master ~]# cat <<EOF> /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
# 3.为脚本添加执行权限
[root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules
# 4.执行脚本文件
[root@master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules
# 5.查看对应的模块是否加载成功
[root@master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
安装docker
# 1、切换镜像源
[root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 2、查看当前镜像源中支持的docker版本
[root@master ~]# yum list docker-ce --showduplicates
# 3、安装特定版本的docker-ce
# 必须制定--setopt=obsoletes=0,否则yum会自动安装更高版本
[root@master ~]# yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
# 4、添加一个配置文件
#Docker 在默认情况下使用Vgroup Driver为cgroupfs,而Kubernetes推荐使用systemd来替代cgroupfs
[root@master ~]# mkdir /etc/docker
[root@master ~]# cat <<EOF> /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
}
EOF
# 5、启动dokcer
[root@master ~]# systemctl restart docker
[root@master ~]# systemctl enable docker
安装Kubernetes组件
# 1、由于kubernetes的镜像在国外,速度比较慢,这里切换成国内的镜像源
# 2、编辑/etc/yum.repos.d/kubernetes.repo,添加下面的配置
# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgchech=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
# 3、安装kubeadm、kubelet和kubectl
[root@master ~]# yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y
# 4、配置kubelet的cgroup
#编辑/etc/sysconfig/kubelet, 添加下面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
# 5、设置kubelet开机自启
[root@master ~]# systemctl enable kubelet
准备集群镜像
# 在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看
[root@master ~]# kubeadm config images list
# 下载镜像
# 此镜像kubernetes的仓库中,由于网络原因,无法连接,下面提供了一种替换方案
images=(
kube-apiserver:v1.17.4
kube-controller-manager:v1.17.4
kube-scheduler:v1.17.4
kube-proxy:v1.17.4
pause:3.1
etcd:3.4.3-0
coredns:1.6.5
)
for imageName in ${images[@]};do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done
集群初始化
下面的操作只需要在master节点上执行即可(以集群1为例)
# 创建集群
[root@master ~]# kubeadm init \
--apiserver-advertise-address=192.168.168.145 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.17.4 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
# 创建必要文件
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
下面的操作只需要在node节点上执行即可(以集群1为例,此脚本在创建集群后会自动显示)
kubeadm join 192.168.138.145:6443 --token awk15p.t6bamck54w69u4s8 \
--discovery-token-ca-cert-hash sha256:a94fa09562466d32d29523ab6cff122186f1127599fa4dcd5fa0152694f17117
安装网络插件,只在master节点操作即可
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
使用配置文件启动fannel
kubectl apply -f kube-flannel.yml
等待它安装完毕 发现已经是 集群的状态已经是Ready
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-1-master Ready master 6m v1.17.4
k8s-1-node1 Ready <none> 22s v1.17.4
2. 部署MinIo
此操作在192.168.138.145上进行
创建minio数据目录
mkdir /data/minio -p
dockerhub镜像地址:
https://hub.docker.com/r/minio/minio
镜像下载
docker pull minio/minio:RELEASE.2022-08-08T18-34-09Z
创建minio容器
如果不指定,则默认使用用户名和密码为minioadmin/minioadmin,可以通过环境变量自定义,如下:
docker run -d \
--name minio \
-p 9000:9000 \
-p 9999:9999 \
-v /data/minio:/minio \
--restart=always \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=12345678" \
minio/minio:RELEASE.2022-08-08T18-34-09Z \
server /minio --console-address '0.0.0.0:9999'
浏览器访问
创建存储桶
创建存储桶
输入存储桶名称
创建完成
3. 部署velero客户端
下载velero客户端
本次选择了官网最新的版本https://github.com/vmware-tanzu/velero/releases
wget https://github.com/vmware-tanzu/velero/releases/download/v1.9.5/velero-v1.9.5-linux-amd64.tar.gz
解压velero到/usr/local/bin
tar xf velero-v1.9.5-linux-amd64.tar.gz
cd velero-v1.9.5-linux-amd64/
cp velero /usr/local/bin/
测试使用
velero --help
4. 部署velero服务端控制器
创建访问minio的认证文件
cat << EOF > /root/.velero-auth.txt
[default]
aws_access_key_id = admin
aws_secret_access_key = 12345678
EOF
创建namespace
kubectl create ns velero-system
下载aws访问控制插件
docker pull velero/velero-plugin-for-aws:latest
执行安装velero服务端
#此处指定了velero安装到指定k8s的namespace中,后续操作均需要指定这个namespace
velero install \
--kubeconfig /root/.kube/config \
--namespace velero-system \
--provider aws \
--plugins velero/velero-plugin-for-aws:latest \
--use-volume-snapshots=false \
--use-restic \
--bucket velerodata \
--secret-file /root/.velero-auth.txt \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://192.168.138.145:9000
完成安装后,在velero-system的namespace中出现了两个pod,分别是velero服务端和辅助数据备份的restic。
查看velero pod运行状态日志
kubectl logs deployment/velero -n velero-system
stroage location 必须是valid有效的
5. 使用velero进行资源备份
5.1. 创建用于备份测试的Mysql数据库
创建 ConfigMap 存储 Mysql 配置文件
创建 Kubernetes 的 ConfigMap 资源,用于存储 Mysql 的配置文件 my.cnf 内容:
mysql-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-config
labels:
app: mysql
data:
my.cnf: |-
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
max_connections = 2000
secure_file_priv=/var/lib/mysql
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
通过 Kubectl 工具部署 ConfigMap
kubectl create -f mysql-config.yaml -n mydlqcloud
创建 PV、PVC 绑定 Mysql 存储空间
PV 支持多种存储驱动,不同存储驱动的 PV 配置方式是不同的,需要根据你的存储系统来配置 PV 参数。这里用的是 NFS 存储(共享网络文件存储系统),可以按照以下方式进行配置:
mysql-storage.yaml
## PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql
labels:
app: mysql #设置 pv 的 label 标签
spec:
capacity:
storage: 3Gi #设置 pv 存储资源大小
accessModes:
- ReadWriteOnce
mountOptions:
- hard
- nfsvers=4.1
nfs: #指定使用 NFS 存储驱动
server: 192.168.138.146 #指定 NFS 服务器 IP 地址
path: /nfs1/mysql #指定 NFS 共享目录的位置,且需提前在该目录中创建 mysql 目录
persistentVolumeReclaimPolicy: Retain
---
## PVC
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: mysql
spec:
resources:
requests:
storage: 3Gi #设置 pvc 存储资源大小
accessModes:
- ReadWriteOnce
selector:
matchLabels:
app: mysql #根据 Label 选择对应 PV
通过 Kubectl 工具部署 PV、PVC
通过 kubectl 工具部署 Kubernetes PV、PVC 资源,命令如下:
- -n:指定部署应用的 Namespace 命名空间。
kubectl create -f mysql-storage.yaml -n mydlqcloud
创建 Deployment 部署 Mysql
创建用于 Kubernetes Deployment 来配置部署 Mysql 的参数,需要配置 Mysql 的镜像地址、名称、版本号,还要配置其 CPU 与 Memory 资源的占用,通过环境变量配置 Mysql 的 root 用户默认密码,配置探针监测应用可用性,配置 Volume 挂载之前创建的 PV、PVC、ConfigMap 资源等等,内容如下:
mysql-deploy.yaml
## Service
apiVersion: v1
kind: Service
metadata:
name: mysql
labels:
app: mysql
spec:
type: NodePort
ports:
- name: mysql
port: 3306
targetPort: 3306
nodePort: 30336
selector:
app: mysql
---
## Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
labels:
app: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0.19
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD ## 配置Root用户默认密码
value: "123456"
livenessProbe:
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 3
exec:
command: ["mysqladmin", "-uroot", "-p${MYSQL_ROOT_PASSWORD}", "ping"]
readinessProbe:
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 3
exec:
command: ["mysqladmin", "-uroot", "-p${MYSQL_ROOT_PASSWORD}", "ping"]
volumeMounts:
- name: data
mountPath: /var/lib/mysql
- name: config
mountPath: /etc/mysql/conf.d/my.cnf
subPath: my.cnf
volumes:
- name: data
persistentVolumeClaim:
claimName: mysql
- name: config
configMap:
name: mysql-config
参数简介:
- ports: 配置镜像映射端口。
- env: 镜像环境变量配置,其中 MYSQL_ROOT_PASSWORD 是 Mysql 镜像用于配置 root 用户默认密码变量。
- resources: 配置 CPU、Memory 资源限制,可以通过配置该值来配置 Pod 的 QoS 级别。
- livenessProbe: 配置存活探针,定时检测 Mysql 应用运行状态,如果检测到 Mysql 挂掉将进行重启操作。
- readinessProbe: 配置就绪探针,定时检测 Mysql 应用启动状态,如果启动成功将允许流量涌入,启动失败将进行重启操作。
- command: 探针执行探测时执行的探测命令。
- volumeMounts: 存储卷挂载配置,用于镜像内存储的挂载配置,与 volumes 中对于的 name 进行绑定。
- volumes: 存储卷配置,可配置使用 pvc、hostPath、emptyDir、nfs 等存储,需要配置 name 值与 VolumeMounts 进行绑定。
通过 kubectl 工具部署 Deployment 来创建 Msyql
kubectl create -f mysql-deploy.yaml -n mydlqcloud
查看数据库状态
kubectl get all -n mydlqcloud
使navicat连接数据库
操作新增数据库
新建一个测试数据库,并在该测试库新建一张测试表
5.2. 使用Velero备份数据库
如需使用restic备份pvc上的数据,需要给pod加上注解,语法格式如下:
kubectl -n {namespace} annotate pod {podname} backup.velero.io/backup-volumes={volumes}
#namespace:命名空间
#podname:mysql pod的名称
#volumes:卷名称
其中,volume如下图
执行整理的语句
kubectl -n mydlqcloud annotate pod/mysql-6bf96d86c9-plcp9 backup.velero.io/backup-volumes=data,config
执行备份语句,对mysql所在命名空间备份。
velero backup create pvc-backup-mysql \
--kubeconfig='/root/.kube/config' \
--snapshot-volumes \
--include-namespaces mydlqcloud \
--namespace velero-system
运行指令查看备份结果
velero backup get --namespace velero-system
结果成功且无报错和警告
打开MInIO管理页面可以查看到备份的数据
资源备份结果如图
数据备份结果如图
6. 使用velero进行数据恢复
6.1. 删除Mysql数据库
kubectl delete ns mydlqcloud
此时数据库连接已断开
6.2. 使用Velero恢复数据库
velero restore create --wait \
--from-backup pvc-backup-mysql \
--kubeconfig='/root/.kube/config' \
--include-namespaces mydlqcloud \
--existing-resource-policy=update \
--namespace velero-system
执行完成后查看数据库状态
连接正常
7. 使用velero将数据迁移至其他集群
7.1. 方案原理
将本集群的数据迁移至其他集群,理论上完成3步骤即可:
1.镜像上传
本例中192.168.138.145 集群 和 192.168.138.147 集群 使用了相同的初始化步骤,且网络互通,因此无需上传镜像。
2.部署velero
在192.168.138.147集群上相同的步骤
[此处省略,同第4步]
3.使用velero恢复指定的备份源
如此,两个集群连接同一个对象存储服务,在恢复时,目标集群只需要执行velero restore 命令,即可完成集群迁移。
7.2. 迁移例子
本例使用不带pv的数据库实例演示
no-pv-mysql.yaml
apiVersion: v1
kind: Namespace
metadata:
name: mysql-k8s
---
apiVersion: apps/v1
kind: Deployment #
metadata:
name: mysql2 #名称,全局唯一
namespace: mysql-k8s # 默认空间
spec:
replicas: 1 #Pod 副本的期待数量
selector:
matchLabels:
app: mysql # 符合目标的Pod拥有此标签
template: # 根据此模版创建Pod的副本
metadata:
labels:
app: mysql # Pod副本拥有的标签,对应Selector
spec:
containers: # Pod的内容的定义部分
- name: mysql # 容器的名称
image: mysql # 容器对应的Docker Image
ports:
- containerPort: 3306 # 容器应用监听的端口号
env:
- name: MYSQL_ROOT_PASSWORD # 设置mysql的初始化密码
value: "123456" # 设置mysql的初始化密码
---
apiVersion: v1
kind: Service # 表明是Kubernetes Service
metadata:
name: mysql2 # Service 的全局唯一名称
namespace: mysql-k8s # 默认空间
spec:
type: NodePort
selector:
app: mysql
ports: # Service 提供服务的端口
- port: 3306 # Service 对应的Pod拥有这里定义的标签
在集群1 (192.168.138.145)执行脚本创建
查看状态
连接测试
使用velero备份(192.168.138.145执行)
velero backup create backup-to-other --kubeconfig='/root/.kube/config' --default-volumes-to-restic --include-namespaces mysql-k8s --namespace velero-system
备份时,两台集群对比,147集群尚无此namespace
使用velero恢复(192.168.138.147)
velero restore create --wait \
--from-backup backup-to-other \
--kubeconfig='/root/.kube/config' \
--include-namespaces mysql-k8s \
--existing-resource-policy=update \
--namespace velero-system
如此,恢复出了一模一样名称的mysql应用
参考文献: