logo

开源云原生Rook实战:块存储从入门到进阶

作者:起个名字好难2025.09.19 10:40浏览量:0

简介:本文通过实战演示,详细介绍开源云原生存储Rook的块存储功能部署、配置及使用方法,帮助开发者快速掌握Rook块存储技术。

开源云原生Rook实战:块存储从入门到进阶

引言

随着云原生技术的普及,存储方案的选择成为企业构建现代化应用的关键环节。Rook作为一款开源的云原生存储编排工具,能够将Ceph等存储系统无缝集成到Kubernetes环境中,提供块存储、文件存储对象存储三种存储类型。其中,块存储因其高性能、低延迟的特性,在数据库、中间件等I/O密集型场景中表现尤为突出。本文将通过实战演示,详细介绍Rook块存储的部署、配置及使用方法,帮助开发者快速掌握这一技术。

一、Rook块存储的核心优势

1.1 原生Kubernetes集成

Rook通过CRD(Custom Resource Definitions)将存储资源抽象为Kubernetes原生对象,开发者可通过kubectl直接管理存储卷,无需学习额外的存储系统命令。例如,创建块存储卷仅需定义一个BlockPool资源,Rook会自动完成底层Ceph集群的配置。

1.2 动态卷供应

传统存储方案需预先分配LUN或卷,而Rook支持动态卷供应(Dynamic Provisioning)。当PVC(PersistentVolumeClaim)请求存储时,Rook会自动创建对应的PV(PersistentVolume),极大简化了存储管理流程。

1.3 高可用与弹性扩展

Rook基于Ceph的分布式架构,支持数据多副本、纠删码存储,确保数据高可用。同时,通过横向扩展OSD(Object Storage Daemon)节点,可轻松应对存储容量与性能的线性增长需求。

二、实战环境准备

2.1 硬件与软件要求

  • Kubernetes集群:至少3个Worker节点(推荐Ubuntu 20.04+),每个节点需配置额外磁盘用于OSD存储。
  • Rook版本:本文基于Rook v1.12(最新稳定版),需确保与Kubernetes版本兼容。
  • 存储设备:每个Worker节点需准备一块未格式化的磁盘(如/dev/sdb),用于Ceph OSD存储。

2.2 部署Rook Operator

首先,通过Git克隆Rook仓库并部署Operator:

  1. git clone --single-branch --branch v1.12.0 https://github.com/rook/rook.git
  2. cd rook/deploy/examples
  3. kubectl create -f crds.yaml -f common.yaml -f operator.yaml

验证Operator状态:

  1. kubectl -n rook-ceph get pods
  2. # 预期输出:rook-ceph-operator-xxxxxx 1/1 Running

三、块存储实战:从创建到使用

3.1 创建Ceph集群

定义Cluster.yaml文件,指定存储节点和设备:

  1. apiVersion: ceph.rook.io/v1
  2. kind: CephCluster
  3. metadata:
  4. name: rook-ceph
  5. namespace: rook-ceph
  6. spec:
  7. cephVersion:
  8. image: quay.io/ceph/ceph:v17.2.6
  9. storage:
  10. useAllNodes: false
  11. nodes:
  12. - name: node1
  13. devices:
  14. - name: "/dev/sdb"
  15. - name: node2
  16. devices:
  17. - name: "/dev/sdb"
  18. - name: node3
  19. devices:
  20. - name: "/dev/sdb"

应用配置并验证集群状态:

  1. kubectl create -f cluster.yaml
  2. kubectl -n rook-ceph get cephcluster rook-ceph
  3. # 等待状态变为"Healthy"

3.2 创建块存储池与存储类

定义BlockPool.yamlStorageClass.yaml

  1. # BlockPool.yaml
  2. apiVersion: ceph.rook.io/v1
  3. kind: CephBlockPool
  4. metadata:
  5. name: replicapool
  6. namespace: rook-ceph
  7. spec:
  8. replicated:
  9. size: 3
  10. failureDomain: host
  11. # StorageClass.yaml
  12. apiVersion: storage.k8s.io/v1
  13. kind: StorageClass
  14. metadata:
  15. name: rook-ceph-block
  16. provisioner: rook-ceph.rbd.csi.ceph.com
  17. parameters:
  18. clusterID: rook-ceph
  19. pool: replicapool
  20. imageFormat: "2"
  21. imageFeatures: layering
  22. csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
  23. csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
  24. csi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-node
  25. csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
  26. reclaimPolicy: Delete
  27. allowVolumeExpansion: true

应用配置后,可通过kubectl get sc验证存储类是否创建成功。

3.3 动态创建块存储卷

定义PVC请求存储:

  1. apiVersion: v1
  2. kind: PersistentVolumeClaim
  3. metadata:
  4. name: mysql-pvc
  5. spec:
  6. accessModes:
  7. - ReadWriteOnce
  8. storageClassName: rook-ceph-block
  9. resources:
  10. requests:
  11. storage: 10Gi

应用后,Rook会自动创建PV并绑定到PVC。通过kubectl get pvc可查看卷状态。

3.4 在Pod中使用块存储

以MySQL为例,挂载块存储卷:

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: mysql
  5. spec:
  6. selector:
  7. matchLabels:
  8. app: mysql
  9. template:
  10. metadata:
  11. labels:
  12. app: mysql
  13. spec:
  14. containers:
  15. - name: mysql
  16. image: mysql:5.7
  17. env:
  18. - name: MYSQL_ROOT_PASSWORD
  19. value: "password"
  20. volumeMounts:
  21. - name: mysql-data
  22. mountPath: /var/lib/mysql
  23. volumes:
  24. - name: mysql-data
  25. persistentVolumeClaim:
  26. claimName: mysql-pvc

部署后,通过kubectl exec进入Pod验证数据持久化:

  1. kubectl exec -it mysql-xxxxxx -- bash
  2. mysql -uroot -ppassword -e "CREATE DATABASE testdb;"
  3. # 重启Pod后验证数据库是否仍存在

四、进阶优化与故障排查

4.1 性能调优

  • 调整副本数:在BlockPool.yaml中修改replicated.size以平衡性能与冗余。
  • 使用纠删码:对于冷数据,可配置纠删码池(Erasure Coded Pool)节省空间。
  • 内核参数优化:在Worker节点调整/etc/sysctl.conf中的vm.dirty_ratiovm.dirty_background_ratio,减少I/O延迟。

4.2 常见问题排查

  • PVC卡在Pending状态:检查StorageClass配置是否正确,尤其是provisionersecretName字段。
  • OSD启动失败:通过kubectl -n rook-ceph logs rook-ceph-osd-xxx查看日志,常见原因包括磁盘权限问题或LVM冲突。
  • 数据恢复演练:模拟节点故障,验证Ceph的自动数据重建功能是否正常工作。

五、总结与展望

通过本文的实战演示,开发者已掌握Rook块存储的核心操作流程,包括集群部署、存储类创建、动态卷供应及Pod挂载。Rook的云原生特性使其成为Kubernetes环境下存储方案的理想选择,尤其适合需要高性能、高可用的I/O密集型应用。未来,随着Ceph Quincy等新版本的发布,Rook在性能优化、多云支持等方面将进一步增强,值得持续关注。

行动建议

  1. 在测试环境重复本文步骤,熟悉各组件配置。
  2. 尝试将Rook块存储用于生产级数据库(如MySQL、PostgreSQL),监控I/O性能。
  3. 探索Rook的文件存储(CephFS)和对象存储(RGW)功能,构建统一存储平台。

相关文章推荐

发表评论