etcd 通常是对整个集群进行备份与恢复,而 velero 可以针对集群中某个命名空间进行备份、恢复与迁移。velero 通常将数据存储在对象存储中,且 velero 需要依赖 kubectl 与集群通讯。
MinIO 为 velero 提供对象存储,可以部署在单独的节点上。
$ yum install -y yum-utils
$ yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
$ yum install docker-ce -y
$ systemctl enable --now docker
# 拉取MinIO镜像
$ docker pull minio/minio:latest
# 部署MinIO
$ docker run --name minion -d \
--restart=always \
-p 9000:9000 -p 9001:9001 \
-e "MINIO_ACCESS_KEY=admin" \ # 设定访问用户
-e "MINIO_SECRET_KEY=z.159357" \ # 设定访问密码
-v /data/minio:/data \
minio/minio:latest \
server /data --console-address ":9001" # 容器内启动服务命令
http://<节点IP>:9001
访问 MinIO 图形管理界面,进入 Buckets → Create Bucket
创建 Bucket:velero 客户端命令依赖于 kubectl 命令,这里部署在 K8s 集群的 Master 节点。
# 下载软件包
$ wget https://mirror.ghproxy.com/https://github.com/vmware-tanzu/velero/releases/download/v1.13.2/velero-v1.13.2-linux-amd64.tar.gz
# 解压并添加命令
$ tar -zxf velero-v1.13.2-linux-amd64.tar.gz
$ cp velero-v1.13.2-linux-amd64/velero /usr/local/bin/
# 命令自动补全
$ echo 'source <(velero completion bash)' >> ~/.bashrc
$ cat > velero_auth <<EOF
[default]
aws_access_key_id = admin
aws_secret_access_key = z.159357
EOF
# 创建velero运行的命名空间
$ kubectl create namespace velero-system
# 安装velero服务端
$ velero install \
--kubeconfig ~/.kube/config \
--namespace velero-system \
--provider aws \
--image uhub.service.ucloud.cn/ian595/velero/velero:v1.13.2 \
--plugins uhub.service.ucloud.cn/ian595/velero/velero-plugin-for-aws:v1.9.2 \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://10.0.0.181:9000 \
--bucket k8s-data \
--secret-file velero_auth \
--use-node-agent \
--default-volumes-to-fs-backup \
--use-volume-snapshots=false
# --kubeconfig: 指定kubeconfig文件,用于连接到K8s集群
# --namespace: velero服务端部署的命名空间
# --provider: 后端存储类型,这里指定的是aws,但可以使用其它OSS
# --image: velero服务端使用的镜像
# --plugins: 插件使用的镜像
# --backup-location-config: 指定备份存储位置的配置
# --bucket: 对象存储中Bucket名称
# --secret-file: 连接到OSS的认证信息存储文件
# --use-node-agent: 用于备份pvc中的数据
# --default-volumes-to-fs-backup: 将Pod卷备份到文件系统备份
# --use-volume-snapshots=false: 是否备份PV中的数据,这需要OSS支持PV快照
$ velero --namespace velero-system version
Client:
Version: v1.13.2
Git commit: 4d961fb6fec384ed7f3c1b7c65c818106107f5a6
Server:
Version: v1.13.2
$ velero uninstall --namespace=velero-system
$ velero --namespace velero-system backup-location get
执行结果:
$ velero backup create backup-ns01-$(date +%Y%m%d%H%M%S) \
--kubeconfig ~/.kube/config \
--include-namespaces ns01 \
--default-volumes-to-fs-backup \
--namespace velero-system
# --include-namespaces: 需要备份的Namespace,可以指定多个
# --default-volumes-to-fs-backup: 备份pod所关联的pvc数据
# --namespace: 指定velero服务端所在的命名空间
$ velero backup create full-backup-$(date +%Y%m%d%H%M%S) \
--kubeconfig ~/.kube/config \
--default-volumes-to-fs-backup \
--namespace velero-system
$ velero --namespace velero-system backup get
# --namespace: 指定velero服务端所在的命名空间
执行结果:
如果恢复的 Pod 中关联了持久卷,那么 velero 会在 Pod 规范中添加一个名为 restore-wait
的初始化容器,这个初始化容器使用的镜像是 velero/velero-restore-helper
$ velero restore create \
--from-backup backup-kube-redis-01 \
--kubeconfig ~/.kube/config \
--namespace velero-system \
--wait
# 每天凌晨3点备份所有命名空间数据
$ velero schedule create all-namespace-backup \ # 备份计划名称
--default-volumes-to-fs-backup \
--schedule "0 3 * * *" \ # 备份时间
--namespace velero-system
# 每小时备份default命名空间,并删除一天前的备份数据
$ velero schedule create default-namespace-backup \
--schedule "0 */1 * * *" \
--include-namespaces default \
--default-volumes-to-fs-backup \
--ttl 24h0m0s \ # 备份过期时间
--namespace velero-system
$ velero --namespace velero-system schedule get
执行结果:
【环境】
需准备两套 K8s 集群,从集群 A 迁移到集群 B 。并在两个集群中部署 velero 服务端。
【实现思路】
1、分别在两个集群安装 velero,并连接到相同的 OSS
2、准备两份 kubeconfig 文件,分别连接到集群 A 和集群 B
3、将集群 A 数据备份到 OSS,再到集群 B 中读取 OSS 中的数据进行恢复
【操作实例】
$ scp root@ClusterA.ian.net:~/.kube/config /opt/clusterA.conf
$ scp root@ClusterB.ian.net:~/.kube/config /opt/clusterB.conf
$ velero backup create clusterA-backup \
--kubeconfig /opt/clusterA.conf \
--default-volumes-to-fs-backup \
--namespace clusterA-velero
$ velero restore create \
--from-backup clusterA-backup \
--kubeconfig /opt/clusterB.conf \
--namespace clusterB-velero \
--wait