logo

如何在Kubernetes中快速部署基于Rook-Ceph的分布式块存储

作者:菠萝爱吃肉2025.09.18 18:51浏览量:0

简介:本文详细介绍了在Kubernetes集群中通过Rook-Ceph快速部署分布式块存储的完整流程,涵盖环境准备、Rook-Ceph安装、存储池配置及实际应用示例,助力开发者高效实现持久化存储管理。

如何在Kubernetes中快速部署基于Rook-Ceph的分布式块存储

摘要

随着容器化技术的普及,Kubernetes已成为分布式应用的标准运行环境。然而,如何为Kubernetes提供高效、可靠的持久化存储一直是开发者关注的焦点。Rook-Ceph作为Kubernetes原生存储方案,通过将Ceph分布式存储系统与Kubernetes无缝集成,提供了灵活、可扩展的块存储、文件存储对象存储服务。本文将详细介绍如何在Kubernetes中快速部署基于Rook-Ceph的分布式块存储,涵盖环境准备、Rook-Ceph安装、存储池配置及实际应用示例,帮助开发者高效实现持久化存储管理。

一、Rook-Ceph简介

Rook是一个开源的云原生存储编排工具,旨在将存储系统(如Ceph、EdgeFS等)转换为Kubernetes上的自管理、自扩展和自修复的存储服务。Rook-Ceph是Rook对Ceph存储系统的具体实现,它通过自定义资源定义(CRD)和Operator模式,简化了Ceph集群在Kubernetes中的部署和管理。

Ceph是一个统一的分布式存储系统,提供块存储(RBD)、文件存储(CephFS)和对象存储(RADOSGW)三种接口。其核心优势在于高扩展性、高可用性和数据冗余保护,非常适合作为Kubernetes的持久化存储后端。

二、环境准备

1. Kubernetes集群要求

  • 版本要求:Kubernetes 1.16或更高版本(推荐1.20+)。
  • 节点资源:至少3个工作节点(推荐每个节点4核CPU、8GB内存以上)。
  • 存储设备:每个节点至少一块未挂载的裸盘(如/dev/sdb),用于OSD(对象存储设备)。
  • 网络要求:节点间网络延迟低(建议同一可用区),开放端口6789(Monitor)、6800-7300(OSD)。

2. 工具安装

  • Helm:用于安装Rook-Ceph(推荐Helm 3+)。
    1. curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
    2. chmod 700 get_helm.sh
    3. ./get_helm.sh
  • kubectl:配置好Kubernetes集群访问权限。

3. 存储设备准备

在每个节点上执行以下命令,确认可用磁盘:

  1. lsblk -o NAME,ROTA,SIZE,MOUNTPOINT | grep -v "sda1" | grep -v "boot"

确保输出中包含未挂载的磁盘(如sdb)。

三、部署Rook-Ceph集群

1. 添加Rook Helm仓库

  1. helm repo add rook-release https://charts.rook.io/release
  2. helm repo update

2. 创建命名空间

  1. kubectl create namespace rook-ceph

3. 部署Rook-Ceph Operator

  1. helm install rook-ceph rook-release/rook-ceph -n rook-ceph \
  2. --set operatorNamespace=rook-ceph \
  3. --set enableDiscoveryDaemon=true

此命令会部署Rook-Ceph Operator,并自动发现节点上的可用磁盘。

4. 验证Operator状态

  1. kubectl -n rook-ceph get pods | grep rook-ceph-operator

输出应显示Running状态。

四、创建Ceph集群

1. 应用Ceph集群CRD

下载并修改cluster.yaml(示例文件通常位于Rook GitHub仓库的cluster/examples/kubernetes/ceph目录):

  1. curl -O https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/cluster.yaml

关键配置项:

  • storage.useAllNodes: true(使用所有节点)
  • storage.nodes: 显式指定节点和磁盘(如name: node1, devices: [ {name: "sdb"} ]
  • mon.count: 3(Monitor数量,奇数)
  • dashboard.enabled: true(启用Web仪表盘)

应用配置:

  1. kubectl apply -f cluster.yaml -n rook-ceph

2. 验证Ceph集群状态

  1. kubectl -n rook-ceph get pods | grep ceph

等待所有Pod(Monitor、OSD、MGR、MDS)进入Running状态。

检查集群健康状态:

  1. kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- ceph status

输出应显示HEALTH_OK

五、配置分布式块存储

1. 创建存储池和存储类

下载并修改storageclass.yaml

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

应用配置:

  1. kubectl apply -f storageclass.yaml

2. 测试块存储

创建PVC:

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

应用并验证:

  1. kubectl apply -f pvc.yaml
  2. kubectl get pvc

六、实际应用示例

1. 部署MySQL并使用Ceph块存储

  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: ceph-block-pvc

应用配置并验证数据持久性:

  1. kubectl apply -f mysql.yaml
  2. kubectl exec -it mysql-<pod-id> -- mysql -uroot -ppassword -e "CREATE DATABASE test;"

七、高级配置与优化

1. 性能调优

  • OSD调优:修改cluster.yaml中的resources部分,为OSD分配更多CPU/内存。
  • 存储池配置:根据业务需求选择不同的副本策略(如erasure-coded节省空间)。

2. 监控与告警

  • 集成Prometheus和Grafana:通过Rook提供的ServiceMonitor监控Ceph集群指标。
  • 配置告警规则:针对HEALTH_WARN/HEALTH_ERR状态触发告警。

八、总结

通过Rook-Ceph,开发者可以在Kubernetes中快速部署企业级分布式块存储,实现存储资源的自动化管理和弹性扩展。本文从环境准备到实际应用,详细介绍了部署流程和关键配置,帮助读者高效构建高可用、低延迟的持久化存储解决方案。未来,随着Kubernetes和Ceph生态的持续演进,Rook-Ceph将成为容器化存储的首选方案之一。

相关文章推荐

发表评论