使用Velero备份与恢复K8s集群及应用

news2024/11/14 13:57:49

作者:红米

环境

3台虚拟机组成一主两从的测试集群,使用NFS作为动态存储。

主机IP系统
k8s-master192.168.1.10centos7.9
k8s-node1192.168.1.11centos7.9
k8s-node2192.168.1.12centos7.9

1、介绍

1.1 简介

请添加图片描述

备份容灾

一键恢复

集群迁移

支持备份pv,备份数据加密,通过两种备份插件实现,通过启动命令upload-type参数更改。

1.2 架构

请添加图片描述

Velero 客户端调用 Kubernetes API 服务器来创建对象Backup。

注意到BackupController新Backup对象并执行验证。

BackupController备份过程开始。它通过向 API 服务器查询资源来收集要备份的数据。

调用BackupController对象存储服务(例如 AWS S3)来上传备份文件。

1.3 备份有状态数据

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

考量维度基于 CSI 快照文件复制
应用性能影响低,CSI 接口调用存储系统快照取决于数据量,占用额外资源
数据可用性依赖于存储系统,需要使用支持快照的CSI对象存储和生产环境隔离,独立可用性,支持跨站点可用性
数据一致性支持 Crash Consistency,配合 hook 机制实现一致性无保障,基于 hook

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

两种文件复制插件:

Restic(默认) https://restic.readthedocs.io/en/latest/100_references.html#terminology

Kopia https://kopia.io/docs/advanced/architecture

1.4 备份最佳实践

  • 如果你的存储支持快照,高频本地快照 + 低频 restic 备份到 s3

  • 从应用角度选择合适的备份粒度和备份策略

  • 多集群环境中共享同一对象存储时要防止冲突

1.5 同步机制

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

1.6 坑

删除长时间未完成的备份或恢复任务,会导致 velero 阻塞无法处理后续任务。

当使用文件复制备份方式时,备份文件系统速度变化快的应用,比如Es,Ck十有八九会备份失败。

2、安装

velero安装比较主流的由以下两种方式,如果喜欢省事就选择第一种,如果需要定制化就用helm安装。

(注意:提前准备好一个对象存储,我这里使用的是minio,地址192.168.1.100:9000 minioadmin/minioadmin)

2.1 通过二进制文件安装

下载二进制文件,并解压到/usr/local/bin下。

## 下载
 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

生成minio认证文件

cat >velero-auth.txt << EOF
[default]
aws_access_key_id = minioadmin
aws_secret_access_key = minioadmin
EOF

安装 (需要提前创建bucket)

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.1.10:9000

查看安装状态

[root@master1 ~]# kubectl get pod -n velero NAME                      READY   STATUS    RESTARTS   AGE
node-agent-86vhf          1/1     Running   0          34s
node-agent-hz624          1/1     Running   0          34s
velero-55568bff5b-rr7sz   1/1     Running   0          34s
[root@master1 ~]# kubectl get crd | grep velerobackuprepositories.velero.io                          2023-08-28T12:58:41Z
backups.velero.io                                     2023-08-28T12:58:41Z
backupstoragelocations.velero.io                      2023-08-28T12:58:41Z
deletebackuprequests.velero.io                        2023-08-28T12:58:41Z
downloadrequests.velero.io                            2023-08-28T12:58:41Z
podvolumebackups.velero.io                            2023-08-28T12:58:41Z
podvolumerestores.velero.io                           2023-08-28T12:58:41Z
restores.velero.io                                    2023-08-28T12:58:41Z
schedules.velero.io                                   2023-08-28T12:58:41Z
serverstatusrequests.velero.io                        2023-08-28T12:58:41Z
volumesnapshotlocations.velero.io                     2023-08-28T12:58:41Z
检查备份数据存储状态

[root@master1 ~]# kubectl get backupstoragelocations -A NAMESPACE   NAME      PHASE       LAST VALIDATED   AGE   DEFAULT
velero      default   Available   3s               10m   true

2.2 通过helm安装

http://www.1024sky.cn/blog/article/77733

3、基本操作

3.1 部署测试应用

部署两个测试应用,用来测试备份与恢复结果,使用minio进行备份数据的存储,

mysql 5.7

nginx

apiVersion: v1kind: PersistentVolumeClaimmetadata:
  name: mysql-pv-claimspec:
  storageClassName: nfs
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi---apiVersion: apps/v1                 #版本kind: Deployment                    #创建资源的类型metadata:                           #资源的元数据
  name: mysql-dep                   #资源的名称,是元数据必填项spec:                               #期望状态
  replicas: 1                       #创建的副本数量(pod数量),不填默认为1
  selector:                         #
    matchLabels:
      app: mysql-pod
  template:                         #定义pod的模板
    metadata:                       #pod的元数据
      labels:                       #labels标签,必填一个
        app: mysql-pod             
    spec:                           #pod的期望状态
      containers:                   #容器
      - name: mysql                 #容器名称
        image: mysql:5.7            #镜像
        imagePullPolicy: IfNotPresent
        ports:                      #容器的端口
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "root"
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim---apiVersion: v1               #版本kind: Service                #创建资源的类型metadata:                    #资源的元数据
  name: mysql-svc            #资源的名称,是元数据必填项
  labels:                    #labels标签  
    app: mysql-svcspec:                        #期望状态
  type: NodePort             #服务类型
  ports:                     #端口
    - port: 3306
      targetPort: 3306       #与containerPort一样
      protocol: TCP
      nodePort: 30306
  selector:
    app: mysql-pod
nginx部署文件

apiVersion: v1kind: PersistentVolumeClaimmetadata:
  name: my-pvcspec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: nfs---apiVersion: apps/v1kind: Deploymentmetadata:
  name: nginx-deploymentspec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      volumes:
        - name: data-volume
          persistentVolumeClaim:
            claimName: my-pvc
      containers:
        - name: nginx
          image: nginx
          volumeMounts:
            - name: data-volume
              mountPath: /var/www/html
          ports:
            - containerPort: 80---apiVersion: v1kind: Servicemetadata:
  name: nginx-servicespec:
  type: NodePort
  ports:
    - port: 80
      targetPort: 80
  selector:
    app: nginx
向两个测试应用写一点文件

-- 创建测试数据库CREATE DATABASE testdb;-- 使用测试数据库USE testdb;-- 创建测试表CREATE TABLE test_table (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50),
  age INT,
  email VARCHAR(100)
);-- 插入测试数据INSERT INTO test_table (name, age, email) VALUES
  ('John Doe', 25, 'john.doe@example.com'),
  ('Jane Smith', 30, 'jane.smith@example.com'),
  ('Mike Johnson', 35, 'mike.johnson@example.com');  

select * from test_table;+----+--------------+------+--------------------------+| id | name         | age  | email                    |+----+--------------+------+--------------------------+|  1 | John Doe     |   25 | john.doe@example.com     ||  2 | Jane Smith   |   30 | jane.smith@example.com   ||  3 | Mike Johnson |   35 | mike.johnson@example.com |+----+--------------+------+--------------------------+

3.2 备份

创建单次的备份任务,备份数据库与nginx

velero backup create test3 --include-namespaces=default --default-volumes-to-fs-backup

3.3 定时备份

这里我们为了测试将备份周期调整成了每分钟一次

[root@master1 yaml]# velero schedule create schedule-backup --schedule="* * * * *" --include-namespaces=default --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

3.4 恢复

首先删除mysql与nginx,我们这里手动删除了nginx与mysql,模拟数据丢失

[root@master1 ~]# kubectl get pod 
No resources found in default namespace.
[root@master1 ~]# kubectl get all 
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   64d
[root@master1 ~]#

开始恢复,创建恢复策略,从我们之前备份过的备份任务恢复

velero restore create --from-backup schedule-backup-20230830131234
[root@master1 ~]# kubectl get backup -A 
NAMESPACE   NAME                             AGE
velero      schedule-backup-20230830131234   5m13s
velero      test1                            21m
velero      test2                            11m
velero      test3                            9m26s
[root@master1 ~]# velero restore create --from-backup schedule-backup-20230830131234
Restore request "schedule-backup-20230830131234-20230830091758" submitted successfully.
Run `velero restore describe schedule-backup-20230830131234-20230830091758` or `velero restore logs schedule-backup-20230830131234-20230830091758` for more details.
[root@master1 ~]# kubectl get restore -A 
NAMESPACE   NAME                                            AGE
velero      schedule-backup-20230830131234-20230830091758   7s
[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

等待一会后发现pod已经全部running

[root@master1 ~]# kubectl get pod   
NAME                                READY   STATUS    RESTARTS   AGE
mysql-dep-5984d97dc4-8fp7p          1/1     Running   0          62s
nginx-deployment-6787dfdbf6-gf88w   1/1     Running   0          62s
[root@master1 ~]# 
[root@master1 ~]# kubectl exec -it mysql-dep-5984d97dc4-8fp7p /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
Defaulted container "mysql" out of: mysql, restore-wait (init)
bash-4.2# 
bash-4.2# ls
bin  boot  dev  docker-entrypoint-initdb.d  entrypoint.sh  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
bash-4.2# mysql -uroot -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.43 MySQL Community Server (GPL)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show databases;+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb             |
+--------------------+
5 rows in set (0.01 sec)mysql> use testdb;Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changedmysql> select * from test_table;+----+--------------+------+--------------------------+
| id | name         | age  | email                    |
+----+--------------+------+--------------------------+
|  1 | John Doe     |   25 | john.doe@example.com     |
|  2 | Jane Smith   |   30 | jane.smith@example.com   |
|  3 | Mike Johnson |   35 | mike.johnson@example.com |
+----+--------------+------+--------------------------+
3 rows in set (0.00 sec)mysql>

数据恢复完成

更多技术信息请查看云掣官网https://yunche.pro/?t=yrgw

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1936280.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CH04_依赖项属性

第4章&#xff1a;依赖项属性 本章目标 理解依赖项属性理解属性验证 依赖项属性 ​ 属性与事件是.NET抽象模型的核心部分。WPF使用了更高级的依赖项属性&#xff08;Dependency Property&#xff09;功能来替换原来.NET的属性&#xff0c;实现了更高效率的保存机制&#xf…

卷积神经网络【CNN】--池化层的原理详细解读

池化层&#xff08;Pooling Layer&#xff09;是卷积神经网络&#xff08;CNN&#xff09;中的一个关键组件&#xff0c;主要用于减少特征图&#xff08;feature maps&#xff09;的维度&#xff0c;同时保留重要的特征信息。 一、池化层的含义 池化层在卷积神经网络中扮演着降…

python调用chrome浏览器自动化如何选择元素

功能描述&#xff1a;在对话框输入文字&#xff0c;并发送。 注意&#xff1a; # 定位到多行文本输入框并输入内容。在selenium 4版本中&#xff0c;元素定位需要填写父元素和子元素名。 textarea driver.find_element(By.CSS_SELECTOR,textarea.el-textarea__inner) from …

ACM中国图灵大会专题 | 图灵奖得主Manuel Blum教授与仓颉团队交流 | 华为论坛:面向全场景应用编程语言精彩回顾

ACM 中国图灵大会&#xff08;ACM Turing Award Celebration Conference TURC 2024&#xff09;于2024年7月5日至7日在长沙举行。本届大会由ACM主办&#xff0c;in cooperation with CCF&#xff0c;互联网之父Vinton Cerf、中国计算机学会前理事长梅宏院士和廖湘科院士担任学术…

linux进程——状态——linux与一般操作系统的状态

前言&#xff1a;博主在之前的文章已经讲解了PCB里面的pid——主要讲解了父子进程PID&#xff0c; 以及fork的相关内容。 本节进入PCB的下一个成员——状态&#xff0c; 状态是用来表示一个进程在内存中的状态的&#xff0c; 进程在内存中肯能处于各种状态&#xff0c; 比如运行…

十七、【机器学习】【非监督学习】- K-均值 (K-Means)

系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…

前端Vue组件化实践:自定义发送短信验证码弹框组件

在前端开发中&#xff0c;随着业务逻辑的日益复杂和交互需求的不断增长&#xff0c;传统的整体式开发方式逐渐暴露出效率低下、维护困难等问题。为了解决这些问题&#xff0c;组件化开发成为了一种流行的解决方案。通过组件化&#xff0c;我们可以将复杂的系统拆分成多个独立的…

使用 OpenCV 和 YOLO 模型进行实时目标检测并在视频流中显示检测结果

文章目录 Github官网简介视频帧推理视频设备ID安装依赖 检测示例分类示例姿势估计 Github https://github.com/ultralytics/ultralytics 官网 https://docs.ultralytics.com/zhhttps://docs.ultralytics.com/zh/quickstart/ 简介 Ultralytics 是一个软件公司&#xff0c;专…

深入浅出WebRTC—NACK

WebRTC 中的 NACK&#xff08;Negative Acknowledgment&#xff09;机制是实时通信中处理网络丢包的关键组件。网络丢包是常见的现象&#xff0c;尤其是在无线网络或不稳定连接中。NACK 机制旨在通过请求重传丢失的数据包来减少这种影响&#xff0c;从而保持通信的连续性和质量…

【VUE】v-if和v-for的优先级

v-if和v-for v-if 用来显示和隐藏元素 flag为true时&#xff0c;dom元素会被删除达到隐藏效果 <div class"boxIf" v-if"flag"></div>v-for用来进行遍历&#xff0c;可以遍历数字对象数组&#xff0c;会将整个元素遍历指定次数 <!-- 遍…

《数据结构:C语言实现双链表》

文章目录 一、链表的分类二、双向链表1、概念与结构 三、双向链表实现1、双向链表要实现的功能2、哨兵位初始化3、双链表头插数据4、判断链表是否为空5、打印链表数据6、尾插数据7、头删数据8、尾删数据9、寻找数据所在结点10、在任意结点之后插入数据11、删除任意结点12、销毁…

debian 更新源

前言 实现一键替换在线源 一键更新源 Debian 全球镜像站以下支持现有debian 11 12 echo "Delete the default source" rm -rf /etc/apt/sources.listecho "Build a new source" cat <<EOF>>/etc/apt/sources.list.d/debian.sources Types:…

Shell的正确使用

目录 shell 介绍 变量名的定义规则 变量名定义&#xff1a; 删除变量 特殊的变量名&#xff1a; 算术运算符 逻辑运算符&#xff1a; (1)整数之间比较 (2)按照文件权限进行判断 (3)按照文件类型判断 (4)多条件判断 常用的特殊字符&#xff1a; 条件选择、判断 if判…

PHP上门按摩专业版防东郊到家系统源码小程序

&#x1f486;‍♀️【尊享级体验】上门按摩专业版&#xff0c;告别东郊到家&#xff0c;解锁全新放松秘籍&#xff01;&#x1f3e0;✨ &#x1f525;【开篇安利&#xff0c;告别传统束缚】&#x1f525; 亲们&#xff0c;是不是厌倦了忙碌生活中的疲惫感&#xff1f;想要享…

NET 语言识别,语音控制操作、语音播报

System.Speech. 》》System.Speech.Synthesis; 语音播报 》》System.Speech.Recognition 语音识别 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Speech.Recog…

[Redis]典型应用——分布式锁

什么是分布式锁&#xff1f; 在一个分布式系统中&#xff0c;也会涉及到多个节点访问同一个公共资源的情况。此时就需要通过锁来做互斥控制&#xff0c;避免出现类似于"线程安全"的问题 举个例子&#xff0c;在平时抢票时&#xff0c;多个用户可能会同时买票&#…

Linux——多路复用之poll

目录 前言 一、poll的认识 二、poll的接口 三、poll的使用 前言 前面我们学习了多路复用的select&#xff0c;知道多路复用的原理与select的使用方法&#xff0c;但是select也有许多缺点&#xff0c;导致他的效率不算高。今天我们来学习poll的使用&#xff0c;看看poll较于…

利用AI与数据分析优化招聘决策

一、引言 在竞争激烈的职场环境中&#xff0c;招聘是组织获取人才、实现战略目标的关键环节。然而&#xff0c;传统的招聘方式往往依赖人力资源部门的主观经验和直觉&#xff0c;难以准确预测招聘效果&#xff0c;评估招聘渠道的效率。随着人工智能&#xff08;AI&#xff09;…

Windows右键新建Markdown文件类型配置 | Typora | VSCode

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 今天毛毛张分享的是如何在右键的新建菜单中添加新建MarkdownFile文件&#xff0c;这是毛毛张分享的关于Typora软件的相关知识的第三期 文章目录 1.前言&#x1f3dd;…

Android车载MCU控制音量和ARM控制音量的区别和优缺点—TEF6686 FM/AM芯片

不要嫌前进的慢&#xff0c;只要一直在前进就好 文章目录 前言一、系统架构图1.MCU控制音量的架构图&#xff08;老方法&#xff09;2.ARM控制音量的架构图&#xff08;新方法&#xff09; 二、为啥控制音量不是用AudioManager而是执着去直接控制TDA7729&#xff1f;三、MCU控制…