Flexvolume场景云盘迁移方案
介绍:
如果您在阿里云容器服务部署了应用,并且使用云盘数据卷保存数据,您可以有数据迁移、数据回滚、磁盘类型变配等需求,本方案为您提供了Flexvolume、Disk-Controller所运行的集群中,云盘数据管理方案;
适合以下场景:
(福利推荐:阿里云、腾讯云、华为云服务器最新限时优惠活动,云服务器1核2G仅88元/年、2核4G仅698元/3年,点击这里立即抢购>>>)
磁盘轮转:您之前使用了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类型;
其他场景文档后续提供。
你还在原价购买阿里云、腾讯云、华为云、天翼云产品?那就亏大啦!现在申请成为四大品牌云厂商VIP用户,可以3折优惠价购买云服务器等云产品,并且可享四大云服务商产品终身VIP优惠价,还等什么?赶紧点击下面对应链接免费申请VIP客户吧:
相关文章
- 学生数据库管理系统
- SpringDataJpa 用MySQL语句怎么分页,spring全家桶SpringDataJpa 用MySQL语句怎么分页
- Docker创建MySQL容器模板命令
- Elasticsearch对应MySQL的对应关系
- 使用SpringDataJpa保存(save)报错误:SQL Error: 1062, SQLState: 23000 控制台会报:Duplicate entry ‘数‘ for key ‘PRIMA
- Navicat Premium 连接sqlserver数据库时提示安装Client失败,解决方案
- Mysql查询当前用户所有数据库语句(SHOW DATABASES)
- MySQL语句-查看当前数据库有哪些表(SHOW TABLES)
- MySQL5.0版本以上新增的 information_schema 数据库是什么?
- MariaDB数据库备份之逻辑备份
- MariaDB数据库创建用户
- MariaDB数据库给用户授权
- MariaDB数据库刷新权限表命令
- MariaDB数据库删除用户命令
- PhpStudy 2016搭建-sqli-libs靶场
- MySQL手动注入步骤
- Pikachu靶场-SQL注入-数字型注入(post)过关步骤
- Pikachu靶场-SQL注入-字符型注入(get)过关步骤
- 利用SQL注入漏洞实现MySQL数据库读写文件
- Kali-工具-sqlmap常见用法