大纲:
velero简介
minio环境准备
velero安装,备份与恢复
一、velero简介
velero是一个有Vmware开源的工具,是一个云原生的灾难恢复和迁移工具,采用Go语言编写,用于安全的备份、恢复和迁移Kubernetes集群资源数据。
velero官网:https://velero.io/
velero-github:https://github.com/vmware-tanzu/velero
1.1、velero的特性:
备份可以按集群资源的子集,按命名空间、资源类型标签选择器进行过滤,从而为备份和恢复的内容提供高度的灵活性
支持复制当前 Kubernetes 集群的资源到其它 Kubernetes 集群
通过聚合 API 服务器公开的资源可以轻松备份和恢复,即使它们存储在单独的 etcd 数据库中
Velero 可以帮助你:
对集群进行备份并在丢失的情况下进行恢复。
将集群资源迁移到其他集群。
将生产集群复制到开发和测试集群。
1.2、velero的组件:
velero由一个客户端和一个服务端组成
客户端:运行在本地的命令行工具,只要配置好kubectl和kubeconfig认证文件就可使用,非常简单
服务端:运行在Kubernetes集群之上,负责执行具体的备份和恢复操作
整体架构:
支持的对象存储:AWS S3 以及兼容 S3 的存储,比如:ceph存储、Google Cloud 存储 、Aliyun OSS 存储
1.3、工作流程:
基本工作原理:
Velero client 调用Kubernetes API服务器以创建Backup。
BackupController检测到新的backup,并验证。
BackupController开始backup,通过请求ApiServer获取资源来收集数据以进行备份。
BackupController将要备份的数据上传到一个对象存储服务器,如AMS S3。
默认情况下,velero backup create会生产每一个PV的磁盘快照。您可以通过指定其他参数来调整快照。运行velero backup create --help以查看可用的参数。可以使用选项禁用快照--snapshot-volumes=false。
思考:与其他k8s备份方式的差别
二、minio环境准备
minio在这里是用来保存velero的备份数据,如果你有其它对象存储服务,也可以用它们来替换minio。
minio是一款高性能、分布式的对象存储系统,采用Go语言实现,兼容Amazon S3接口,客户端与存储服务器之间采用http/https通信协议。
minio官网:https://min.io/
minio中文网站:http://www.minio.org.cn/
minio支持单机部署和分布式部署,这里选择容器方式单机部署。
2.1、安装minio:(要先安装好docker环境)
root@harbor01:~# mkdir -p /data/minio
root@harbor01:~# docker pull minio/minio:RELEASE.2022-04-12T06-55-35Z
RELEASE.2022-04-12T06-55-35Z: Pulling from minio/minio
a9e23b64ace0: Pull complete
38b71301a1d9: Pull complete
160197c068e7: Pull complete
ff6e4f6f8c20: Pull complete
e95e0f7339c1: Pull complete
17f004107a95: Pull complete
cb8e56fa8e8a: Pull complete
Digest: sha256:e7983a527e9e5e7158c3644ef6cdc51dca453819f95facc25eb110478dd57b43
Status: Downloaded newer image for minio/minio:RELEASE.2022-04-12T06-55-35Z
docker.io/minio/minio:RELEASE.2022-04-12T06-55-35Z
# 创建minio容器,如果不指定,则默认用户名与密码为 minioadmin/minioadmin,可以通过环境变量自定义
root@harbor01:~# docker run --name minio \
> -p 9000:9000 \
> -p 9999:9999 \
> -d --restart=always \
> -e "MINIO_ROOT_USER=admin" \
> -e "MINIO_ROOT_PASSWORD=12345678" \
> -v /data/minio/data:/data \
> minio/minio:RELEASE.2022-04-12T06-55-35Z server /data \
> --console-address '0.0.0.0:9999'
0a7f1752b59b9285df518bb048ab3b12bbd3829fbc51d87c21db5478aa6e1f59
root@harbor01:~# docker ps
CONTAINER ID IMAGE COMMAND CRE STATUS PORTS NAMES
0a7f1752b59b minio/minio:RELEASE.2022-04-12T06-55-35Z "/usr/bin/docker-ent…" 26 Up 11 seconds 0.0.0.0:9000->9000/tcp, 0.0.0.0:9999->9999/tcp minio
2.2、访问minio并创建bucket
浏览器访问:http://ip:9000
三、部署velero
3.1、下载velero
wget https://github.com/vmware-tanzu/velero/releases/download/v1.9.3/velero-v1.9.3-linux-amd64.tar.gz
tar -xvf velero-v1.9.3-linux-amd64.tar.gz
cp velero /usr/local/bin/
3.2、配置velero认证环境
# 认证文件
root@ansible:/data/velero# cat velero-auth.txt
[default]
aws_access_key_id = admin
aws_secret_access_key = 12345678
# 准备user-csr文件
root@ansible:/data/velero# cat awsuser-csr.json
{
"CN": "awsuser",
"hosts": [],
"key":{
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
准备证书答发环境(cfssl):
# 安装cfssl
apt install golang-cfssl
# 下载签发所需命令 cfssl cfssl-certionfo cfssljson重命名并cp到/usr/local/bin/
https://github.com/cloudflare/cfssl/releases/download/v1.6.3/cfssljson_1.6.3_linux_amd64
https://github.com/cloudflare/cfssl/releases/download/v1.6.3/cfssl_1.6.3_linux_amd64
https://github.com/cloudflare/cfssl/releases/download/v1.6.3/cfssl-certinfo_1.6.3_linux_amd64
3.3、证书签发
velero --kubeconfig ./awsuser.kubeconfig install --provider aws --plugins lero-plugin-for-aws:v1.3.1 --bucket velerodata --secret-file ./velero-authe-snapshots=false --namespace velero --backup-location-config region=minioe="true",s3Url=http://192.168.50.104:9000
分发证书到apiserver证书路径
cp *.pem /etc/kubernetes/ssl/
3.4、生成k8s集群认证config文件
export KUBE_APISERVER="https://192.168.50.101:6443"
kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/ssl/ca.pem --embed-certs=true --server=${KUBE_APISERVER} --kubeconfig=./awsuser.kubeconfig
设置客户端证书认证:
kubectl config set-credentials awsuser --client-certificate=/etc/kubernetes/ssl/awsuser.pem --client-key=/etc/kubernetes/ssl/awsuser-key.pem --embed-certs=true --kubeconfig=./awsuser.kubeconfig
设置上下文参数:
kubectl config set-context kubernetes --cluster=kubernetes --user=awsuser --kubeconfig=./awsuser.kubeconfig
设置默认上下文
kubectl config use-context kubernetes --kubeconfig=./awsuser.kubeconfig
在k8s集群中创建awsuser账户:
kubectl create clusterrolebinding awsuser --clusterrole=cluster-admin --user=awsuser
验证config文件可用性:
kubectl --kubeconfig awsuser.kubeconfig get node
3.5、部署velero
创建namespace:
kubectl create ns velero
执行安装:
velero --kubeconfig ./awsuser.kubeconfig install --provider aws --plugins velero/velero-plugin-for-aws:v1.3.1 --bucket velerodata --secret-file ./velero-auth.txt --use-volume-snapshots=false --namespace velero --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://192.168.50.104:9000
验证部署:
kubectl get pod -n velero
kubectl logs velero-578458fb6-9n7h9 -n velero --tail=1000 -f
四、velero 备份与恢复
基本工作流程:
备份数据:
本地velero客户端发送备份命令,就会调用API Server创建Backup资源对象
服务端收到通知有新的Backup对象创建并执行验证
服务端开始执行备份过程,向API Server查询需要备份的数据
服务端调用对象存储服务,将备份数据保存到对象对象存储上
恢复数据:
本地velero客户端发送恢复指令,就会调用API Server创建Restore资源对象
服务端收到通知有新的Restore对象创建并执行验证
服务端调用对象存储,将指定的备份文件下载下来
服务端开始执行恢复过程,根据备份数据调用API Server重新创建相关资源对象
4.1、对default ns进行备份:
root@ansible:/data/velero# kubectl get pod
NAME READY STATUS RESTARTS AGE
net-test1 1/1 Running 0 2m30s
net-test2 1/1 Running 0 2m18s
net-test3 1/1 Running 0 2m14s
# 备份
root@ansible:/data/velero# DATE=`date +%Y%m%d%H%M%S`
root@ansible:/data/velero# echo $DATE
20221125144852
root@ansible:/data/velero# velero backup create default-backup-${DATE} \
> --include-namespaces default \
> --kubeconfig=./awsuser.kubeconfig \
> --namespace velero
Backup request "default-backup-20221125144852" submitted successfully.
Run `velero backup describe default-backup-20221125144852` or `velero backup logs default-backup-20221125144852` for more details.
#验证备份
root@ansible:/data/velero# velero backup describe default-backup-20221125144852 --kubeconfig=./awsuser.kubeconfig --namespace velero
Name: default-backup-20221125144852
Namespace: velero
Labels: velero.io/storage-location=default
Annotations: velero.io/source-cluster-k8s-gitversion=v1.21.0
velero.io/source-cluster-k8s-major-version=1
velero.io/source-cluster-k8s-minor-version=21
Phase: Completed
Errors: 0
Warnings: 0
Namespaces:
Included: default
Excluded: <none>
Resources:
Included: *
Excluded: <none>
Cluster-scoped: auto
Label selector: <none>
Storage Location: default
Velero-Native Snapshot PVs: auto
TTL: 720h0m0s
Hooks: <none>
Backup Format Version: 1.1.0
Started: 2022-11-25 14:49:17 +0800 CST
Completed: 2022-11-25 14:49:22 +0800 CST
Expiration: 2022-12-25 14:49:17 +0800 CST
Total items to be backed up: 25
Items backed up: 25
Velero-Native Snapshots: <none included>
minio验证备份数据:
4.2、恢复备份数据:
模拟删除数据:
root@ansible:/data/velero# kubectl get pod
NAME READY STATUS RESTARTS AGE
net-test1 1/1 Running 0 8m41s
net-test2 1/1 Running 0 8m29s
net-test3 1/1 Running 0 8m25s
root@ansible:/data/velero# kubectl delete pod net-test3
pod "net-test3" deleted
root@ansible:/data/velero# kubectl get pod
NAME READY STATUS RESTARTS AGE
net-test1 1/1 Running 0 9m43s
net-test2 1/1 Running 0 9m31s
执行恢复:
root@ansible:/data/velero# velero restore create --from-backup default-backup-20221125144852 --wait --kubeconfig=./awsuser.kubeconfig --namespace velero
Restore request "default-backup-20221125144852-20221125145705" submitted successfully.
Waiting for restore to complete. You may safely press ctrl-c to stop waiting - your restore will continue in the background.
.
Restore completed with status: Completed. You may check for more information using the commands `velero restore describe default-backup-20221125144852-20221125145705` and `velero restore logs default-backup-20221125144852-20221125145705`.
root@ansible:/data/velero# kubectl get pod
NAME READY STATUS RESTARTS AGE
net-test1 1/1 Running 0 11m
net-test2 1/1 Running 0 11m
net-test3 1/1 Running 0 5s
注:velero在恢复时会先检查数据是否存在,不存在的恢复数据(只恢复net-test3,不影响到其他的pod)
思考:怎么备份pv? 与etcd备份的差别
五、Velero常用命令
备份Backup
velero backup get :查看已备份的
velero backup create <backupname>:创建一个backup包含所有资源
velero backup create <backupname> --include-namespaces ns1,ns2:为ns1,ns2命名空间下的资源备份
velero backup create <backupname> --exclude-namespaces ns1,ns2:排除掉ns1,ns2的命名空间,创建备份
velero backup create <backupname> --include-resources resource1,resource2:为指定资源备份
velero backup create --exclude-resources resource1,resource2:不备份指定资源
--storage-location <localpath>:将创建的备份保存到本地路径下
-l, --selector:通过指定label来匹配要back up的资源
除此以外还包括:delete、describe、logs
恢复Restore
velero restore get:查看已经restore的资源
velero restore create restore-1 --from-backup backup-1:从backup-1恢复
velero restore create --from-backup backup-2 --include-resources persistentvolumeclaims,persistentvolumes:仅恢复指定资源,同样使用--exclude-resources:不恢复某资源
velero restore create --from-schedule schedule-1:从创建的schedule恢复
除此以外还包括:delete、describe、logs
六、Schedule定时备份
Schedule是针对backup的,是独立于backup之外的一种资源,但他本身也是一个backup只不过是具有了定时的功能,符合Cron规则。
velero create schedule NAME --schedule="0 */6 * * *":每6小时自动备份一次
velero create schedule NAME --schedule="@every 24h" --include-namespaces web:因为schedule也是一种backup,所以创建backup指定的参数这里也都可以使用
除此以外还包括:delete、describe、logs