1、介绍
:::warning
官方文档:https://velero.io/docs/v1.4/ 基本工作原理:不管需求是实现什么,比如:集群迁移、恢复、备份,其核心都是通过velero client CLI创建一个backup,然后迁移和恢复等操作都是需要这个backup来完成的。
:::
创建一个backup流程,<font style="color:rgb(21, 167, 167);">velero backup create test-backup</font>
:
- Velero client 调用Kubernetes API服务器以创建Backup。
- BackupController检测到新的backup,并验证。
- BackupController开始backup,通过请求ApiServer获取资源来收集数据以进行备份。
- BackupController将要备份的数据上传到一个对象存储服务器,如AMS S3。
- 默认情况下,velero backup create会生产每一个PV的磁盘快照。您可以通过指定其他参数来调整快照。运行velero backup create —help以查看可用的参数。可以使用选项禁用快照—snapshot-volumes=false。
2、Velero常用命令
1. 备份Backup
<font style="color:rgb(21, 167, 167);">velero backup get</font>
:查看已备份的
<font style="color:rgb(21, 167, 167);">velero backup create <backupname></font>
:创建一个backup包含所有资源
<font style="color:rgb(21, 167, 167);">velero backup create <backupname> --include-namespaces ns1,ns2</font>
:为ns1,ns2命名空间下的资源备份
<font style="color:rgb(21, 167, 167);">velero backup create <backupname> --exclude-namespaces ns1,ns2</font>
:排除掉ns1,ns2的命名空间,创建备份
<font style="color:rgb(21, 167, 167);">velero backup create <backupname> --include-resources resource1,resource2</font>
:为指定资源备份
<font style="color:rgb(21, 167, 167);">velero backup create --exclude-resources resource1,resource2</font>
:不备份指定资源
<font style="color:rgb(21, 167, 167);">--storage-location <localpath></font>
:将创建的备份保存到本地路径下
<font style="color:rgb(21, 167, 167);">-l, --selector</font>
:通过指定label来匹配要back up的资源
2. 恢复Restore
<font style="color:rgb(21, 167, 167);">velero restore get</font>
:查看已经restore的资源
<font style="color:rgb(21, 167, 167);">vel ero restore create restore-1 --from-backup backup-1</font>
:从backup-1恢复
<font style="color:rgb(21, 167, 167);">velero restore create --from-backup backup-2 --include-resources persistentvolumeclaims,persistentvolumes</font>
:仅恢复指定资源,同样使用—exclude-resources:不恢复某资源
<font style="color:rgb(21, 167, 167);">velero restore create --from-schedule schedule-1</font>
:从创建的schedule恢复
3. Schedule定时备份
Schedule是针对backup的,是独立于backup之外的一种资源,但他本身也是一个backup只不过是具有了定时的功能,符合Cron规则。<font style="color:rgb(21, 167, 167);">velero create schedule NAME --schedule="0 */6 * * *"</font>
:每6小时自动备份一次
<font style="color:rgb(21, 167, 167);">velero create schedule NAME --schedule="@every 24h" --include-namespaces web</font>
:因为schedule也是一种backup,所以创建backup指定的参数这里也都可以使用
- 对集群进行备份并在丢失的情况下进行恢复。
- 将集群资源迁移到其他集群。
- 将生产集群复制到开发和测试集群。
- 在集群上运行的服务端
- 本地的CLI客户端
3、安装minio对象存储服务器
:::warning
Velero支持的storage providers:https://velero.io/docs/v1.4/supported-providers/ 这里使用本地安装的对象存储服务器,Minio 安装的Minio需要能被两个集群(集群迁移,一个到另外一个),都能访问到。 minio也可以安装在k8s集群内:戳这里参考 ::: > 若需要在不同kubernetes和存储池集群备份与恢复数据,需要将minio服务端安装在kubernetes集群外,保证在集群发生灾难性故障时,不会对备份数据产生影响,以下为通过二进制的方式在kubernetes集群外安装minio: > > 在待安装minio的服务器上下载二进制包 >plain
wget https://dl.minio.io/server/minio/release/linux-amd64/minio
chmod +x minio
sudo mv minio /usr/local/bin/
# 查看版本信息
minio --version
> 准备对象存储的磁盘,在此跳过此步骤
>
> 使用systemd管理Minio服务,对于使用systemd init系统运行系统的人,请创建用于运行Minio服务的用户和组:
>
plain
sudo groupadd --system minio
sudo useradd -s /sbin/nologin --system -g minio minio
为/data(上述步骤准备好的磁盘挂载位置)目录提供minio用户所有权:
为Minio创建systemd服务单元文件:
sudo chown -R minio:minio /data/minio
创建Minio环境文件/etc/default/minio:
vim /etc/systemd/system/minio.service
[Unit]
Description=Minio
Documentation=https://docs.minio.io
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio
[Service]
WorkingDirectory=/data/minio
User=minio
Group=minio
EnvironmentFile=-/etc/default/minio
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
# Let systemd restart this service always
Restart=always
# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536
# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
# Volume to be used for Minio server.
MINIO_VOLUMES="/data/minio"
# Use if you want to run Minio on a custom port.
MINIO_OPTS="--address :9000"
# Access Key of the server.
MINIO_ACCESS_KEY=minio
# Secret key of the server.
MINIO_SECRET_KEY=minio123
- MINIO_ACCESS_KEY:长度至少为3个字符的访问密钥;
- MINIO_SECRET_KEY:最少8个字符的密钥。
sudo systemctl daemon-reload
sudo systemctl start minio
sudo systemctl status minio
4、安装Velero
1. 下载包
:::warning
Velero Client就是命令行工具,安装版本应该是v1.3.0, or later。 官方提供了多种安装方式:https://velero.io/docs/master/basic-install/ ::: > 复制当前目录下的velero文件至/usr/sbin/目录下,velero是velero的二进制客户端; >plain
# https://github.com/vmware-tanzu/velero/
tar xf velero-v1.9.2-linux-amd64.tar.gz
cp velero-v1.9.2-linux-amd64/velero /usr/local/bin/
加载shell自动完成功能,方便使用
plain
velero completion bash
## 2. 部署服务
### 1)创建Buckets(桶)
:::warning
minio安装在集群外时,需手动创建名为velero的桶,可访问minioIp:port(192.168.6.20:9000),通过web页面创建velero存储桶。
再按照minio安装在进群内的方式安装velero服务端,等待pod成功运行
:::
2)安装velero服务
在本地目录中创建 Velero 特定的凭据文件credentials-velero,内容如下:
[default]
aws_access_key_id = minio
aws_secret_access_key = minio123
部署velero
# 执行如下命令进行velero程序部署:
$ velero install \
--provider aws \
--image velero/velero:v1.9.2 \
--plugins velero/velero-plugin-for-aws:v1.5.0 \
--bucket velero \
--namespace velero \
--secret-file ./credentials-velero \
--use-volume-snapshots=false \
--use-restic \
--default-volumes-to-restic \
--kubeconfig /root/.kube/config \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://192.168.6.20:9000
# 运行结果如下
....
DaemonSet/restic: created
Velero is installed! ⛵ Use 'kubectl logs deployment/velero -n velero' to view the status.
检查是否成功参数说明:
—provider:供应商
—plugins:插件
—bucket velero:指定存储桶
—namespace velero:命名空间
–secret-file:指定认证文件 ;
–use-volume-snapshots=false:禁用快照备份功能;
–use-restic:启用静态备份;
–default-volumes-to-restic:备份所有 pod 卷而不必在 pod 上应用注释;
–kubeconfig /root/.kube/config :指定k8s集群配置文件;
s3Url=http:这里是刚才部署minio存储的api接口,可以通过mino容器查看。
-feature-gates:解决了已知问题到此velero部署完成,注意替换
.
- s3Url=http:port 更具实际的minio端口进行绑定(我这里是自动生成的port,建议NodePort类型配置指定端口)
# 查看是否创建成功
kubectl get pod -nvelero -w
NAME READY STATUS RESTARTS AGE
restic-jx8kc 1/1 Running 0 7m7s
velero-7cfc49d689-wb2v2 1/1 Running 0 7m7s
# 查看日志
kubectl logs deployment/velero -n velero
可以看到相关服务已经正常运行,Job 任务正常完成退出,大量 CRD 被创建。
3)卸载
velero uninstall --namespace velero
kubectl delete namespace/velero clusterrolebinding/velero
kubectl delete crds -l component=velero
3. 创建service
由于minio安装在集群外,pod无法访问外部服务,需要创建一个external类型的服务,用来访问外部minio,yaml内容如下:保存为minio-service.yaml,执行如下命令创建service
kubectl apply -f minio-service.yaml
5、备份
1. 备份整个test名称空间
1)备份pv是Delete策略的清单
velero backup create ns-test-pv-delete --include-namespaces test
可以看到minio中已经成功存储了备份的数据
2)备份pv是Retain策略的清单
:::warning
使用Retain
策略后,模拟灾难时,并删除pv(Retain
策略需要手动释放pv),恢复时会自动创建相关pv
:::
修改pv策略为Retain后备份
velero backup create ns-test-pv-retain --include-namespaces test
6、模拟灾难
:::warning
- Delete策略的不需要手动清理PV(自动清理,不过时间可能较长);恢复时也会自动创建;
- Retain策略的需要手动清理PV(不会自动清理);恢复时也会自动创建,但是恢复后的策略为Delete(可能是sc的默认策略是Delete)
:::
kubectl delete namespaces test
# 删除名称空间(因为存在pvc和pv,并不能完全删除,会将状态变为Terminating)
# 手动删除pvc和pv
kubectl delete pvc mysql-pvc -ntest
kubectl delete pv pvc-c2802913-202b-4d9f-9fb8-bc75e04fda5c
因为动态配置的 PV的默认 回收策略是“删除”,这些命令应该会触发您的云提供商删除支持 PV 的磁盘。删除是异步的,因此这可能需要一些时间。在继续下一步之前,请检查您的云提供商以确认该磁盘不再存在。
7、恢复
1. 恢复整个test名称空间
1)恢复pv是Delete策略的清单
velero restore create --from-backup test-pv-delete
可以看到pod和相关其他资源都创建成功
2)恢复pv是Retain策略的清单
velero restore create --from-backup test-pv-retain
8、诉求上云项目迁移
1. 备份恢复
# 备份整个名称空间
velero backup create yyjczcpt-20221114 --include-namespaces yyjczcpt --ttl=360h
# pv和pvc备份太慢,过滤(只备份deploy、sts、svc、cm等资源)
velero backup create dgms-20221115-2001 --include-resources deploy,sts,svc,cm --include-namespaces dgms --ttl=360h
# 另一套环境恢复
velero restore create --from-backup dgms-20221115-2001
- —ttl=360h:存储时间过后自动清除
2. 查看
velero backup get #备份查看
velero schedule get #查看定时备份
velero restore get #查看可恢复备份
# 查看备份位置信息
velero backup-location get
- 你能检查
velero backup-location get
吗?查看default备份存储位置是否可用。
更多操作命令移步--help
或官网