velero结合minio实现对k8s数据备份与恢复

大纲:

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集群之上,负责执行具体的备份和恢复操作

整体架构:


架构.png

支持的对象存储:AWS S3 以及兼容 S3 的存储,比如:ceph存储、Google Cloud 存储 、Aliyun OSS 存储

1.3、工作流程:

基本工作原理:


工作原理.png

Velero client 调用Kubernetes API服务器以创建Backup。
BackupController检测到新的backup,并验证。
BackupController开始backup,通过请求ApiServer获取资源来收集数据以进行备份。
BackupController将要备份的数据上传到一个对象存储服务器,如AMS S3。
默认情况下,velero backup create会生产每一个PV的磁盘快照。您可以通过指定其他参数来调整快照。运行velero backup create --help以查看可用的参数。可以使用选项禁用快照--snapshot-volumes=false。

备份流程.png

思考:与其他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

minio.png

三、部署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验证备份数据:


image.png

image.png

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容