Flexvolume场景云盘迁移方案

简介: 如果您在阿里云容器服务部署了应用,并且使用云盘数据卷保存数据,您可以有数据迁移、数据回滚、磁盘类型变配等需求,本方案为您提供了Flexvolume、Disk-Controller所运行的集群中,云盘数据管理方案;

介绍:

如果您在阿里云容器服务部署了应用,并且使用云盘数据卷保存数据,您可以有数据迁移、数据回滚、磁盘类型变配等需求,本方案为您提供了Flexvolume、Disk-Controller所运行的集群中,云盘数据管理方案;

适合以下场景:

磁盘轮转:您之前使用了essd云盘,想轮转为ssd的盘;或者反之;
磁盘轮转:您之前使用了加密云盘,想轮转为非加密盘;或者反之;
跨可用区迁移:您之前使用了可用区A的盘,想在可用区B使用;
跨Region迁移:您之前在杭州Region使用的云盘,想在北京Region使用;
数据回滚:您的磁盘定期打了快照,想使用某个版本的快照恢复数据;


方案总体原则是:通过云盘快照技术实现数据的回滚、迁移、变配操作,并保持数据的一致性。

示例应用:

创建一个StatfulSet应用并挂载一块云盘,模板如下:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: "mysql"
  replicas: 3
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        command: ["sh", "-c"]
        args: ["sleep 10000"]
        volumeMounts:
        - name: ssd
          mountPath: /data
  volumeClaimTemplates:
  - metadata:
      name: ssd
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "alicloud-disk-ssd"
      resources:
        requests:
          storage: 20Gi


创建上面应用,并写入验证数据:

# kubectl get pod
mysql-0                       1/1     Running   0          6m40s
mysql-1                       1/1     Running   0          72s
mysql-2                       1/1     Running   0          65s

# kubectl get pvc
ssd-mysql-0    Bound    d-2ze48olpbvnlpofw9wpi   20Gi       RWO            alicloud-disk-ssd   7m3s
ssd-mysql-1    Bound    d-2ze6sw4nc3n9ovquss0s   20Gi       RWO            alicloud-disk-ssd   95s
ssd-mysql-2    Bound    d-2zeddogm2wsjovoch45m   20Gi       RWO            alicloud-disk-ssd   88s

# kubectl exec -ti mysql-0 touch /data/mysql0
# kubectl exec -ti mysql-1 touch /data/mysql1
# kubectl exec -ti mysql-2 touch /data/mysql2

# kubectl exec -ti mysql-0 ls /data
lost+found  mysql0
# kubectl exec -ti mysql-1 ls /data
lost+found  mysql1
# kubectl exec -ti mysql-2 ls /data
lost+found  mysql2

磁盘类型转换场景:

上述MySQL实例中3个pod使用了3个ssd云盘,我们通过轮转的方式将3个云盘变成essd类型,但数据保持一致。轮转过程包括:

将多个云盘分别打成快照;
通过快照创建新的pvc、pv;
pvc、pv名字要符合新的StatefulSet命名规则;


步骤1:创建快照;

从3个pod所对应的pv信息中找到云盘ID,并到到ECS控制台分别创建云盘快照;


假设三个云盘快照ID分别为:

pod-0 -> ssd-mysql-0 -> d-2ze48olpbvnlpofw9wpi -> s-2zeh66llz43m8g65y4um
pod-1 -> ssd-mysql-1 -> d-2ze6sw4nc3n9ovquss0s -> s-2zegk0d8ne75tz0g15zd
pod-2 -> ssd-mysql-2 -> d-2zeddogm2wsjovoch45m -> s-2zec3gco02of30dt6lgb

步骤2:创建新pvc;

老的pvc模板如下:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ssd-mysql-0
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
  storageClassName: alicloud-disk-ssd


创建新的pvc:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  annotations:
    provider.disksnapshot.aliyuncs.com/disk-snapshot-id: s-2zeh66llz43m8g65y4um
  name: essd-mysql-0
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
  storageClassName: alicloud-disk-essd

改动包括:
1)名字改成“essd-mysql-0”;
2)添加annotations,并且value为pod-0,pvc-0对应的云盘快照ID;
3)storageClassName改成 alicloud-disk-essd;

创建pvc:

# kubectl apply -f pvc-0.yaml
essd-mysql-0   Bound    d-2ze1nxm8hrcdmktxuocn   20Gi       RWO            alicloud-disk-essd   18m

同理,创建pvc-1:essd-mysql-1,pvc-2:essd-mysql-2;

essd-mysql-1   Bound    d-2zeh66llz43m8tzeminq   20Gi       RWO            alicloud-disk-essd   2m27s
essd-mysql-2   Bound    d-2ze383b6z44xjm79qoj2   20Gi       RWO            alicloud-disk-essd   2m25s


步骤3:更新应用:

删除老的statefulset,并创建新的statefulset,模板如下:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: "mysql"
  replicas: 3
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        command: ["sh", "-c"]
        args: ["sleep 10000"]
        volumeMounts:
        - name: essd
          mountPath: /data
  volumeClaimTemplates:
  - metadata:
      name: essd
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "alicloud-disk-ssd"
      resources:
        requests:
          storage: 20Gi

相对于老的模板,需要修改两个地方:
1)volumeClaimTemplates里面的name改成 essd;
2)volumeMounts里面的name改成 essd;

# kubectl get pod
mysql-0                       1/1     Running   0          58s
mysql-1                       1/1     Running   0          28s
mysql-2                       1/1     Running   0          23s

# kubectl describe pod mysql-0 |grep ClaimName
    ClaimName:  essd-mysql-0
# kubectl describe pod mysql-1 |grep ClaimName
    ClaimName:  essd-mysql-1
# kubectl describe pod mysql-2 |grep ClaimName
    ClaimName:  essd-mysql-2

# kubectl exec mysql-0 ls /data
lost+found mysql0

# kubectl exec mysql-1 ls /data
lost+found mysql1

# kubectl exec mysql-2 ls /data
lost+found mysql2

综上:mysql 3副本的云盘已经通过快照的方式变成了essd类型;




其他场景文档后续提供。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
Java 数据库连接 Nacos
Nacos报错问题之启动不了如何解决
Nacos是一个开源的、易于部署的动态服务发现、配置管理和服务管理平台,旨在帮助微服务架构下的应用进行快速配置更新和服务治理;在实际运用中,用户可能会遇到各种报错,本合集将常见的Nacos报错问题进行归纳和解答,以便使用者能够快速定位和解决这些问题。
2630 2
|
开发工具 git 开发者
深入解析:取消 Git Pull 操作的完整指南
【2月更文挑战第29天】
2440 0
|
存储 人工智能 算法
秒懂算法 | 矩阵连乘问题
给定n个矩阵{A1,A2,A3,…,An},其中Ai与Ai+1(i=1,2,3,…,n-1)是可乘的。用加括号的方法表示矩阵连乘的次序,不同加括号的方法所对应的计算次序是不同的。
1762 0
秒懂算法 | 矩阵连乘问题
|
5月前
|
人工智能 弹性计算 运维
OpenClaw怎样部署?阿里云推出OpenClaw快速部署方案,一键拥有专属AI助理!
OpenClaw(原Clawdbot/Moltbot)是开源本地优先AI代理平台,集成大模型、多渠道通信与自动化能力,支持问答、报告生成、数据库运维等。阿里云提供5种一键部署方案(轻量服务器/无影云电脑/SDK集成/ECS+计算巢),零配置、低成本、7×24小时稳定运行。
735 4
|
7月前
|
存储 并行计算 数据挖掘
8核64G服务器怎么样?2026年阿里云 8 核 64G 云服务器性能、价格与选型指南
阿里云 8 核 64G 云服务器属于高性能规格,凭借 1:8 的 CPU 与内存黄金配比,能轻松应对高负载业务场景,是中大型企业运行核心业务的主流选择。无论是搭建大型电商平台、运行内存密集型数据库,还是处理实时大数据分析、支撑游戏服务器集群,它都能提供充足的算力和内存支撑。下面从价格、配置、性能三方面详细解析,帮你判断是否适配业务需求。
|
Python
Datetime模块应用:Python计算上周周几对应的日期
Datetime模块应用:Python计算上周周几对应的日期
781 1
|
算法 Java
一些常见的垃圾回收算法
这些是常见的垃圾回收算法,每个算法都有其优点和适用场景。