当前位置: 首页 > news >正文

kubernetes存储类迁移-备份恢复

背景介绍

kubernetes集群最开始使用了nfs作为存储,随着后续使用过程中数据量逐渐增加,nfs存储性能逐步出现不足,现增加了基于csi的分布式块存储后,需要对原有基于nfs存储类下的pv迁移到新的存储类下。

测试环境

  • k8s集群版本:1.25.12
  • 节点数:4
  • 旧存储类:nfs-storage
  • 新存储类:rook-ceph-block
  • 测试应用:mysql
  • 备份恢复工具:velero
  • 需求:集群管理权限、S3存储

测试方法

  1. 安装minio
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: miniolabels:app.kubernetes.io/name: minio
spec:accessModes:- ReadWriteOnceresources:requests:storage: 20Gi
---
apiVersion: v1
kind: Service
metadata:name: "minio"labels:app.kubernetes.io/name: "minio"
spec:type: NodePortports:- name: tcpport: 9000targetPort: 9000- name: httpport: 9001targetPort: 9001selector:app.kubernetes.io/name: "minio"
---
apiVersion: apps/v1
kind: Deployment
metadata:name: "minio"labels:app.kubernetes.io/name: "minio"
spec:replicas: 1selector:matchLabels:app.kubernetes.io/name: "minio"template:metadata:labels:app.kubernetes.io/name: "minio"spec:containers:- name: minioimage: harbor.gistack.cn/gistack/minio:2023-07-21env:- name: MINIO_ROOT_USERvalue: minioadmin- name: MINIO_ROOT_PASSWORDvalue: minio2023args:- server- /data- --console-address- :9001ports:- name: tcpcontainerPort: 9000protocol: TCP- name: httpcontainerPort: 9001protocol: TCPvolumeMounts:- name: datamountPath: /datavolumes:- name: datapersistentVolumeClaim:claimName: minio
  1. 安装velero
[root@rocky8 ~]# wget https://github.com/vmware-tanzu/velero/releases/download/v1.12.2/velero-v1.12.2-linux-amd64.tar.gz
[root@rocky8 ~]# tar xvf velero-v1.12.2-linux-amd64.tar.gz 
velero-v1.12.2-linux-amd64/LICENSE
velero-v1.12.2-linux-amd64/examples/minio/00-minio-deployment.yaml
velero-v1.12.2-linux-amd64/examples/nginx-app/README.md
velero-v1.12.2-linux-amd64/examples/nginx-app/base.yaml
velero-v1.12.2-linux-amd64/examples/nginx-app/with-pv.yaml
velero-v1.12.2-linux-amd64/velero
[root@rocky8 ~]# cd velero-v1.12.2-linux-amd64/
[root@rocky8 velero-v1.12.2-linux-amd64]# ls
LICENSE  examples  velero
[root@rocky8 velero-v1.12.2-linux-amd64]# echo "[default]
> aws_access_key_id = minioadmin
> aws_secret_access_key = minio2023
> " > credentials-minio
[root@rocky8 velero-v1.12.2-linux-amd64]# ./velero install \
>   --provider aws \
>   --plugins velero/velero-plugin-for-aws:v1.8.0 \
>   --bucket velero \
>   --secret-file ./credentials-minio \
>   --use-node-agent \
>   --use-volume-snapshots=false \
>   --backup-location-config region=cn-beijing,s3ForcePathStyle="true",s3Url=http://192.168.121.2:32432
CustomResourceDefinition/backuprepositories.velero.io: attempting to create resource
CustomResourceDefinition/backuprepositories.velero.io: attempting to create resource client
CustomResourceDefinition/backuprepositories.velero.io: created
CustomResourceDefinition/backups.velero.io: attempting to create resource
CustomResourceDefinition/backups.velero.io: attempting to create resource client
CustomResourceDefinition/backups.velero.io: created
CustomResourceDefinition/backupstoragelocations.velero.io: attempting to create resource
CustomResourceDefinition/backupstoragelocations.velero.io: attempting to create resource client
CustomResourceDefinition/backupstoragelocations.velero.io: created
CustomResourceDefinition/deletebackuprequests.velero.io: attempting to create resource
CustomResourceDefinition/deletebackuprequests.velero.io: attempting to create resource client
CustomResourceDefinition/deletebackuprequests.velero.io: created
CustomResourceDefinition/downloadrequests.velero.io: attempting to create resource
CustomResourceDefinition/downloadrequests.velero.io: attempting to create resource client
CustomResourceDefinition/downloadrequests.velero.io: created
CustomResourceDefinition/podvolumebackups.velero.io: attempting to create resource
CustomResourceDefinition/podvolumebackups.velero.io: attempting to create resource client
CustomResourceDefinition/podvolumebackups.velero.io: created
CustomResourceDefinition/podvolumerestores.velero.io: attempting to create resource
CustomResourceDefinition/podvolumerestores.velero.io: attempting to create resource client
CustomResourceDefinition/podvolumerestores.velero.io: created
CustomResourceDefinition/restores.velero.io: attempting to create resource
CustomResourceDefinition/restores.velero.io: attempting to create resource client
CustomResourceDefinition/restores.velero.io: created
CustomResourceDefinition/schedules.velero.io: attempting to create resource
CustomResourceDefinition/schedules.velero.io: attempting to create resource client
CustomResourceDefinition/schedules.velero.io: created
CustomResourceDefinition/serverstatusrequests.velero.io: attempting to create resource
CustomResourceDefinition/serverstatusrequests.velero.io: attempting to create resource client
CustomResourceDefinition/serverstatusrequests.velero.io: created
CustomResourceDefinition/volumesnapshotlocations.velero.io: attempting to create resource
CustomResourceDefinition/volumesnapshotlocations.velero.io: attempting to create resource client
CustomResourceDefinition/volumesnapshotlocations.velero.io: created
CustomResourceDefinition/datadownloads.velero.io: attempting to create resource
CustomResourceDefinition/datadownloads.velero.io: attempting to create resource client
CustomResourceDefinition/datadownloads.velero.io: created
CustomResourceDefinition/datauploads.velero.io: attempting to create resource
CustomResourceDefinition/datauploads.velero.io: attempting to create resource client
CustomResourceDefinition/datauploads.velero.io: created
Waiting for resources to be ready in cluster...
Namespace/velero: attempting to create resource
Namespace/velero: attempting to create resource client
Namespace/velero: created
ClusterRoleBinding/velero: attempting to create resource
ClusterRoleBinding/velero: attempting to create resource client
ClusterRoleBinding/velero: created
ServiceAccount/velero: attempting to create resource
ServiceAccount/velero: attempting to create resource client
ServiceAccount/velero: created
Secret/cloud-credentials: attempting to create resource
Secret/cloud-credentials: attempting to create resource client
Secret/cloud-credentials: created
BackupStorageLocation/default: attempting to create resource
BackupStorageLocation/default: attempting to create resource client
BackupStorageLocation/default: created
Deployment/velero: attempting to create resource
Deployment/velero: attempting to create resource client
Deployment/velero: created
DaemonSet/node-agent: attempting to create resource
DaemonSet/node-agent: attempting to create resource client
DaemonSet/node-agent: created
Velero is installed! ⛵ Use 'kubectl logs deployment/velero -n velero' to view the status.
[root@rocky8 velero-v1.12.2-linux-amd64]# 
  1. 验证velero备份仓库和设置备份策略
[root@rocky8 velero-v1.12.2-linux-amd64]# ./velero backup-location get
NAME      PROVIDER   BUCKET/PREFIX   PHASE       LAST VALIDATED                  ACCESS MODE   DEFAULT
default   aws        velero          Available   2023-12-29 02:52:26 +0000 UTC   ReadWrite     true
[root@rocky8 velero-v1.12.2-linux-amd64]#cat velero-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: change-storage-class-confignamespace: velerolabels:velero.io/plugin-config: ""velero.io/change-storage-class: RestoreItemAction
data:nfs-storage: rook-ceph-block
  1. 安装示例服务mysql
apiVersion: v1
kind: Service
metadata:name: mysqlnamespace: testlabels:app: mysql
spec:ports:- port: 3306selector:app: mysqlclusterIP: None
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mysql-pv-claimnamespace: testlabels:app: mysql
spec:storageClassName: nfs-storageaccessModes:- ReadWriteOnceresources:requests:storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:name: mysqlnamespace: testlabels:app: mysql
spec:selector:matchLabels:app: mysqlstrategy:type: Recreatetemplate:metadata:labels:app: mysqlspec:containers:- image: mysql:5.7name: mysqlenv:- name: MYSQL_ROOT_PASSWORDvalue: Passw0rd#1ports:- containerPort: 3306name: mysqlvolumeMounts:- name: mysql-persistent-storagemountPath: /var/lib/mysqlvolumes:- name: mysql-persistent-storagepersistentVolumeClaim:claimName: mysql-pv-claim
  1. mysql创建库表并插入数据
mysql> create database test;
Query OK, 1 row affected (0.00 sec)mysql> use test;
Database changed
mysql> create table newtb (id int);
Query OK, 0 rows affected (0.02 sec)mysql> insert into newtb (id) values (1);
Query OK, 1 row affected (0.00 sec)mysql> insert into newtb (id) values (2);
Query OK, 1 row affected (0.00 sec)mysql> insert into newtb (id) values (3);
Query OK, 1 row affected (0.00 sec)mysql> select id from newtb;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.00 sec)mysql> 
  1. 创建备份
[root@rocky8 velero-v1.12.2-linux-amd64]# ./velero backup create backup-test --include-namespaces test --include-resources pod,pv,pvc,deploy --default-volumes-to-fs-backup
Backup request "backup-test" submitted successfully.
Run `velero backup describe backup-test` or `velero backup logs backup-test` for more details.
[root@rocky8 velero-v1.12.2-linux-amd64]# ./velero backup get 
NAME          STATUS       ERRORS   WARNINGS   CREATED                         EXPIRES   STORAGE LOCATION   SELECTOR
backup-test   InProgress   0        0          2023-12-29 03:47:30 +0000 UTC   29d       default            <none>
[root@rocky8 velero-v1.12.2-linux-amd64]#
[root@rocky8 velero-v1.12.2-linux-amd64]# ./velero backup describe backup-test --details
Name:         backup-test
Namespace:    velero
Labels:       velero.io/storage-location=default
Annotations:  velero.io/resource-timeout=10m0svelero.io/source-cluster-k8s-gitversion=v1.25.12velero.io/source-cluster-k8s-major-version=1velero.io/source-cluster-k8s-minor-version=25Phase:  CompletedNamespaces:Included:  testExcluded:  <none>Resources:Included:        *Excluded:        <none>Cluster-scoped:  autoLabel selector:  <none>Or label selector:  <none>Storage Location:  defaultVelero-Native Snapshot PVs:  auto
Snapshot Move Data:          false
Data Mover:                  veleroTTL:  720h0m0sCSISnapshotTimeout:    10m0s
ItemOperationTimeout:  4h0m0sHooks:  <none>Backup Format Version:  1.1.0Started:    2023-12-29 03:47:30 +0000 UTC
Completed:  2023-12-29 03:47:37 +0000 UTCExpiration:  2024-01-28 03:47:30 +0000 UTCTotal items to be backed up:  21
Items backed up:              21Resource List:apps/v1/Deployment:- test/mysqlapps/v1/ReplicaSet:- test/mysql-6d4cc78fd9discovery.k8s.io/v1/EndpointSlice:- test/mysql-hrqs2v1/ConfigMap:- test/kube-root-ca.crtv1/Endpoints:- test/mysqlv1/Event:- test/mysql-6d4cc78fd9-cz54t.17a5306f98ae52c3- test/mysql-6d4cc78fd9-cz54t.17a5306ff9652d00- test/mysql-6d4cc78fd9-cz54t.17a530701c33cf38- test/mysql-6d4cc78fd9-cz54t.17a530701e2834e8- test/mysql-6d4cc78fd9-cz54t.17a5307025673793- test/mysql-6d4cc78fd9.17a5306f98a6f5fd- test/mysql-pv-claim.17a5306fa1d09254- test/mysql-pv-claim.17a5306fa209c18c- test/mysql-pv-claim.17a5306fa30e0e24- test/mysql.17a5306f97c72f22v1/Namespace:- testv1/PersistentVolume:- pvc-54c44a11-77f3-4504-bea4-bb91e3f774acv1/PersistentVolumeClaim:- test/mysql-pv-claimv1/Pod:- test/mysql-6d4cc78fd9-cz54tv1/Service:- test/mysqlv1/ServiceAccount:- test/defaultVelero-Native Snapshots: <none included>kopia Backups:Completed:test/mysql-6d4cc78fd9-cz54t: mysql-persistent-storage
[root@rocky8 velero-v1.12.2-linux-amd64]# 
  1. 查看minio中数据

image.png
image.png

  1. 修改旧pv的删除策略,保证为Retain
[root@rocky8 velero-v1.12.2-linux-amd64]# kubectl get pvc -n test
NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mysql-pv-claim   Bound    pvc-54c44a11-77f3-4504-bea4-bb91e3f774ac   1Gi        RWO            nfs-storage    13m
[root@rocky8 velero-v1.12.2-linux-amd64]# kubectl edit pv pvc-54c44a11-77f3-4504-bea4-bb91e3f774ac -n test
persistentvolume/pvc-54c44a11-77f3-4504-bea4-bb91e3f774ac edited
[root@rocky8 velero-v1.12.2-linux-amd64]# kubectl scale --replicas=0 deploy mysql -n test
deployment.apps/mysql scaled
[root@rocky8 velero-v1.12.2-linux-amd64]# kubectl delete pvc mysql-pv-claim -n test
persistentvolumeclaim "mysql-pv-claim" deleted
[root@rocky8 velero-v1.12.2-linux-amd64]#
[root@rocky8 velero-v1.12.2-linux-amd64]# kubectl get pv -n test
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                 STORAGECLASS   REASON   AGE
pvc-23a440af-5c6e-4cb5-85b7-964f043b0379   20Gi       RWO            Delete           Bound      default/minio         standard                17m
pvc-54c44a11-77f3-4504-bea4-bb91e3f774ac   1Gi        RWO            Retain           Released   test/mysql-pv-claim   nfs-storage             16m
[root@rocky8 velero-v1.12.2-linux-amd64]# 
  1. 使用velero恢复备份
[root@rocky8 velero-v1.12.2-linux-amd64]# velero backup get 
NAME          STATUS      ERRORS   WARNINGS   CREATED                         EXPIRES   STORAGE LOCATION   SELECTOR
backup-test   Completed   0        0          2023-12-29 03:47:30 +0000 UTC   29d       default            <none>
[root@rocky8 velero-v1.12.2-linux-amd64]# velero restore create --from-backup backup-test
Restore request "backup-test-20231229035910" submitted successfully.
Run `velero restore describe backup-test-20231229035910` or `velero restore logs backup-test-20231229035910` for more details.
[root@rocky8 velero-v1.12.2-linux-amd64]# ./velero restore get 
NAME                         BACKUP        STATUS       STARTED                         COMPLETED   ERRORS   WARNINGS   CREATED                         SELECTOR
backup-test-20231229035910   backup-test   InProgress   2023-12-29 03:59:10 +0000 UTC   <nil>       0        0          2023-12-29 03:59:10 +0000 UTC   <none>
[root@rocky8 velero-v1.12.2-linux-amd64]# velero restore get 
NAME                  BACKUP   STATUS      STARTED                         COMPLETED                       ERRORS   WARNINGS   CREATED                         SELECTOR
backup-test-20231229035910   backup-test    Completed   2023-12-29 03:59:10 +0000 UTC   2023-12-29 04:06:10 +0000 UTC   0        0          2023-12-29 03:59:10 +0000 UTC   <none>
[root@rocky8 velero-v1.12.2-linux-amd64]#
  1. 验证mysql数据恢复
[root@rocky8 velero-v1.12.2-linux-amd64]# kubectl get pvc -n test 
NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
mysql-pv-claim   Bound    pvc-dc3f6b8c-53ba-4933-bf46-f8e00a956d7d   1Gi        RWO            rook-ceph-block   9m2s
[root@rocky8 velero-v1.12.2-linux-amd64]#
[root@rocky8 velero-v1.12.2-linux-amd64]# kubectl exec -it -n test deploy/mysql -- bash 
Defaulted container "mysql" out of: mysql, restore-wait (init)
bash-4.2# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.44 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>
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> select * from newtb;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.00 sec)mysql>
http://www.lryc.cn/news/276715.html

相关文章:

  • python智能手机芯片
  • 混淆技术概论
  • pytest安装失败,报错Could not find a version that satisfies the requirement pytest
  • 使用 Maven 的 dependencyManagement 管理项目依赖项
  • 三英战吕布web3游戏项目启动全流程
  • TS中的类
  • 玩转硬件之玩改朗逸中控设备
  • 根据MySql的表名,自动生成实体类,模仿ORM框架
  • Mac上安装tensorflow介绍留存
  • 【赠书第16期】码上行动:用ChatGPT学会Python编程
  • LeetCode 每日一题 2024/1/1-2024/1/7
  • 7+单细胞+空转+实验验证,如何根据内容开展相关经验给你启发
  • Verifiable Credentials可验证证书 2023 终极指南
  • R语言【sp】——SpatialPoints():创建类SpatialPoints或SpatialPointsDataFrame的对象
  • 【Verilog】期末复习——简要说明仿真时阻塞赋值和非阻塞赋值的区别。always语句和initial语句的关键区别是什么?能否相互嵌套?
  • 分享一个idea插件MyBatisX的Bug
  • Linux网络
  • Copilot 插件的使用介绍:如何快速上手
  • kubesphere和k8s的使用分享
  • macos m1如何安装指定版本的redis
  • python 多线程 守护线程
  • 以unity技术开发视角对android权限的讲解
  • 910b上跑Chatglm3-6b进行流式输出【pytorch框架】
  • 2024年江苏省职业院校技能大赛高职学生组软件测试—任务五接口测试题目
  • 螺旋数字矩阵 - 华为OD统一考试
  • 更改ERPNEXT源
  • 配置基本QinQ示例
  • 界面控件DevExpress Blazor Grid v23.2 - 支持全新的单元格编辑模式
  • 深入剖析pcap中的网络异常:TTL过期攻击、ARP中毒、TCP重传与重叠碎片等
  • 网站被挂黑链怎么办