kubernetes Velero 备份与恢复集群

写在前面:如有问题,以你为准,

目前24年应届生,各位大佬轻喷,部分资料与图片来自网络

内容较长,页面右上角目录方便跳转

基础

Velero (以前称为Heptio Ark) 为您提供了备份和恢复Kubernetes集群资源和特久卷的工具。您可以

通过云提供商或本地运行Velero。Velero让您:

  1. 备份集群并在丢失时进行恢复
  2. 将集群资源迁移到其他集群。
  3. 将生产集群复制开发和测试集群。

Velero包括:

  1. 在您的集群上运行的服务器
  2. 在本地运行的命令行客户端

主要功能

  1. 备份容灾
  2. 一键恢复
  3. 集群迁移

存储支持

  • AWS S3
  • Azure Blob
  • Google Cloud Storage
  • Alibaba Cloud OSS
  • MinIO

 

官方文档

Velero Docs - Overview

架构

  1. Velero 客户端调用 Kubernetes API 服务器来创建对象 Backup。
  2. 注意到 BackupController 新 Backup 对象并执行验证。
  3. BackupController 备份过程开始。它通过向 API 服务器查询资源来收集要备份的数据。
  4. 调用 BackupController 对象存储服务(例如 AWS S3)来上传备份文件

实际出现过的场景

集群所在机子坏了,然后通过velero进行了备份,将机子重装并用velero恢复备份

Velero 备份与 etcd 备份的区别

与Etcd备份相比,直接备份Etcd是将集群的全部资源备份起来。

Velero可以对Kubernetes集群内对象级别进行备份。

除了对Kubernetes集群进行整体备份外,Velero还可以通过对Type、Namespace、Label等对象进行分类备份或者恢复

备份有状态数据

velero 有两种备份有状态数据的方式,对比如下

文件复制会进行加密压缩增量备份,压缩比在60%左右,备份文件都是加密后的二进制文件,打开乱码

文件数据是加密的,yaml是不加密的

两种文件复制插件:

Restic(默认) References — restic 0.16.2 documentation

Kopia Architecture | Kopia

 备份最佳实践

  1. 如果你的存储支持快照,高频本地快照 + 低频 restic 备份到 s3
  2. 从应用角度选择合适的备份粒度和备份策略
  3. 多集群环境中共享同一对象存储时要防止冲突

同步机制

由于velero备份会将本次备份任务的元信息上传到s3中,当在集群中删除了备份任务,但是s3中数据为删除,velero会定时将s3的备份任务同步到集群内

  1. 删除长时间未完成的备份或恢复任务,会导致 velero 阻塞无法处理后续任务
  2. 当使用文件复制备份方式时,备份文件系统速度变化快的应用,比如Es,Ck十有八九会备份失败

安装

注:这里为了测试放在了集群的机子里面通过docker跑的,但是实际环境不要放在集群的机子,一旦集群的机子崩了,可能导致数据丢失,而且是docker 一定要将卷挂载到宿主机,保证数据不丢失

先跑一个s3 minio

docker pull minio/minio

docker run -d   -p 9000:9000   -p 9001:9001   --name minio1   -v /home/minio/data:/data   -e "MINIO_ROOT_USER=AKIAIOSFODNN7EXAMPLE"   -e "MINIO_ROOT_PASSWORD=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"   minio/minio server /data --console-address ":9001"

问题:可能docker0 网络有问题,可以跑nginx 测试一下

 ## 下载
 wget https://github.com/vmware-tanzu/velero/releases/download/v1.11.1/velero-v1.11.1-linux-amd64.tar.gz 
 ## 解压
 tar -zxvf velero-v1.11.1-linux-amd64.tar.gz -C /usr/local/bin && mv /usr/local/bin/velero-v1.11.1-linux-amd64/velero /usr/local/bin

其中有一个example目录,里面有一个测试nginx和minio,如果按照上面直接跑docker,就不用这个minio部署方式

该 minio 部署需要修改,控制台访问端口31900

创建一个 velerodata 桶

生成minio认证文件,下面文件aksk根据情况修改

cat >velero-auth.txt << EOF

[default]

aws_access_key_id = minioadmin

aws_secret_access_key = minioadmin

EOF

 

根据情况修改参数
--bucket velerodata
s3Url=http://192.168.100.53:9000
--secret-file ./velero-auth.txt 

velero --kubeconfig  /root/.kube/config   install  \

--use-node-agent  --provider aws    --plugins velero/velero-plugin-for-aws:v1.7.0  \

--bucket velerodata --secret-file ./velero-auth.txt \

--use-volume-snapshots=false  --namespace velero default-volumes-to-restic  \

--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://192.168.100.53:9000

[root@master velero]# kubectl get crd | grep velero

# 查看velero 在kubernetes 创建的资源对象

backuprepositories.velero.io        2024-01-04T08:11:11Z

backups.velero.io                   2024-01-04T08:11:11Z

backupstoragelocations.velero.io    2024-01-04T08:11:11Z

datadownloads.velero.io             2024-01-04T08:11:11Z

datauploads.velero.io               2024-01-04T08:11:12Z

deletebackuprequests.velero.io      2024-01-04T08:11:11Z

downloadrequests.velero.io          2024-01-04T08:11:11Z

podvolumebackups.velero.io          2024-01-04T08:11:11Z

podvolumerestores.velero.io         2024-01-04T08:11:11Z

restores.velero.io                  2024-01-04T08:11:11Z

schedules.velero.io                 2024-01-04T08:11:11Z

serverstatusrequests.velero.io      2024-01-04T08:11:11Z

volumesnapshotlocations.velero.io   2024-01-04T08:11:11Z

[root@master velero]# kubectl get pod -n velero

NAME                     READY   STATUS    RESTARTS   AGE

node-agent-l4vmr         1/1     Running   0          3m33s

node-agent-zm98b         1/1     Running   0          3m33s

velero-b95f88d6b-cgnq5   1/1     Running   0          3m33s

[root@master velero]# kubectl get backupstoragelocations -A

NAMESPACE   NAME      PHASE       LAST VALIDATED   AGE     DEFAULT

velero      default   Available   10s              8m30s   true

命令

命令示例

可以使用 velero 也可以使用 kubectl

# 查看帮助

velero -h

velero get -h

# 创建

velero backup create test1 --include-namespaces=study --default-volumes-to-fs-backup

velero restore create --from-backup test1

# 备份所有资源

velero backup create backup1

# 查看基本信息

velero get backups

velero get restore

kubectl get backup -A

kubectl get restore -A

velero backup-location get

kubectl get backupstoragelocations -A

# 查看详细信息

velero describe backup test1 --details

velero describe restore test1 --details

--details 查看详细信息

可以资源名字,直接查看全部

# 删除

kubectl delete backup -n velero test1 # 假删除,只是删除了资源对象,s3资源没被删

# 下面是真删除

velero delete backup test1

参数

备份与恢复

部署相关组件

kind: Namespace

metadata:

  name: study



---



apiVersion: apps/v1

kind: Deployment

metadata:

  name: nginx-deployment

  namespace: study

spec:

  replicas: 2

  selector:

    matchLabels:

      app: nginx

  template:

    metadata:

      labels:

        app: nginx

    spec:

      containers:

      - name: nginx

        image: nginx:1.17.1

        ports:

        - containerPort: 80



---



apiVersion: v1

kind: Service

metadata:

  name: nginx-service

  namespace: study

spec:

  selector:

    app: nginx

  ports:

    - protocol: TCP

      port: 80

      targetPort: 80



---



apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

  name: nginx-ingress

  namespace: study

spec:

  ingressClassName: nginx

  rules:

  - http:

      paths:

      - path: /

        pathType: Prefix

        backend:

          service:

            name: nginx-service

            port:

              number: 80

创建备份

velero backup create test1 --include-namespaces=study --default-volumes-to-fs-backup

# test3 任务名字

# --include-namespaces=study 指定命名空间

# --default-volumes-to-fs-backup 备份pv

查看备份

[root@master k8s]# velero backup create test1 --include-namespaces=study --default-volumes-to-fs-backup

Backup request "test1" submitted successfully.

Run `velero backup describe test1` or `velero backup logs test1` for more details.

查看 相关命令

kubectl get backup -A

velero backup describe test1

velero backup describe test1 --details # 更详细的信息(资源清单)

velero backup logs test1

s3 内容

定时备份

schedule 通过创建pod来实现

Explain[root@master1 yaml]# velero schedule create schedule-backup --schedule="* * * * *" --include-namespaces=study --default-volumes-to-fs-backup                                                                                                                             

Schedule "schedule-backup" created successfully.  

注:(分时日月周) 不支持秒的

[root@master1 yaml]# kubectl get schedule -A

NAMESPACE   NAME              STATUS    SCHEDULE    LASTBACKUP   AGE   PAUSED

velero      schedule-backup   Enabled   * * * * *                15s

# 每分钟创建一次,命名为:schedule-backup-20230901132958

恢复备份

恢复是将删除的资源进行恢复而不是将资源恢复到某一个时间点

先删除上面的资源

[root@master k8s]# kubectl delete -f ingress-test.yaml

namespace "study" deleted

deployment.apps "nginx-deployment" deleted

service "nginx-service" deleted

ingress.networking.k8s.io "nginx-ingress" deleted

创建恢复任务

velero restore create --from-backup test1

查看恢复任务

[root@master k8s]# kubectl get restores -A

NAMESPACE   NAME                   AGE

velero      test1-20240104040113   50s


kubectl describe restores -A

velero restore logs test1-20240104040113

velero restore describe test1-20240104040113 (最好)

重点信息如下:

Phase:                       Completed

Total items to be restored:  11

Items restored:              11



Started:    2024-01-04 04:01:13 -0500 EST

Completed:  2024-01-04 04:01:14 -0500 EST

查看资源

[root@master k8s]# kubectl get pod -n study

NAME                               READY   STATUS    RESTARTS   AGE

nginx-deployment-765d7cffb-mtvpn   1/1     Running   0          2m47s

nginx-deployment-765d7cffb-s4bz5   1/1     Running   0          2m47s

[root@master k8s]# kubectl get pod,svc,ingress -n study

NAME                                   READY   STATUS    RESTARTS   AGE

pod/nginx-deployment-765d7cffb-mtvpn   1/1     Running   0          2m56s

pod/nginx-deployment-765d7cffb-s4bz5   1/1     Running   0          2m56s



NAME                    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE

service/nginx-service   ClusterIP   10.105.34.88   <none>        80/TCP    2m56s



NAME                                      CLASS   HOSTS   ADDRESS          PORTS   AGE

ingress.networking.k8s.io/nginx-ingress   nginx   *       10.111.123.202   80      2m56s



# curl 192.168.100.51

恢复问题(重点)

实现类似快照

没办法实现,比如deploy从2扩到3,恢复成2是没办法实现的

could not restore, Deployment "nginx-deployment" already exists. Warning: the in-cluster version is different than the backed-up version

会出现上面类似的问题,恢复是将删除的资源进行恢复而不是将资源恢复到某一个快照

容器init

如果容器在init

[root@master1 ~]# kubectl get pod

NAME                                READY   STATUS     RESTARTS   AGE

mysql-dep-5984d97dc4-8fp7p          0/1     Init:0/1   0          10s

nginx-deployment-6787dfdbf6-gf88w   0/1     Init:0/1   0          10s

是因为要进行一些数据调用

velero 从s3 桶里面拉取数据到本地,并进行文件解压缩和解密

这个初始化时间取决于数据量的大小,30多个g恢复要7-8分钟

跨集群问题

是可以恢复,无需关系网卡等问题

其实就是把s3中保存资源yaml和配置重新跑一边

删除备份

root@master k8s]# kubectl get backup -A

NAMESPACE   NAME    AGE

velero      test1   10m

[root@master k8s]# kubectl delete backup -n velero test1

backup.velero.io "test1" deleted



# 这是伪删除,实际数据还在s3上,这个只是删除了资源对象

# 过一分钟又会恢复,因为velero 会定期检测s3中的数据

# 自动加载的资源对象里面,只要s3中的数据不要丢(可能是1分钟)

集群迁移

将另一个集群的业务进行备份,然后将s3中的备份文件放入到新集群的s3中

velero 会定期检测s3中的数据,自动加载的资源对象里面,只要s3中的数据不要丢(可能是1分钟)

也可以在另一个集群安装velero时直接指定备份集群的minio,来实现集群资源迁移

文档资料

一只云原生萌新 - 如何使用Velero备份与恢复K8s集群及应用

Kubernetes 集群备份和恢复 —— 第一弹 ( velero 分享)_哔哩哔哩_bilibili

  • 22
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值