Rook云原生块存储实战:从零搭建高性能存储集群
一、云原生存储的挑战与Rook的解决方案
在云原生架构中,存储的弹性和持久性是核心需求。传统存储方案(如NFS、iSCSI)在Kubernetes环境下存在扩展性差、运维复杂等问题。Rook作为CNCF孵化项目,通过将Ceph等分布式存储系统封装为Kubernetes Operator,提供了声明式的存储管理方式。
核心优势:
- 自动化运维:通过CRD(Custom Resource Definitions)定义存储集群,Operator自动完成部署、扩容、故障恢复等操作
- 多存储协议支持:同时提供块存储(RBD)、文件存储(CephFS)、对象存储(S3)三种存储接口
- 资源高效利用:支持在现有Kubernetes节点上部署存储服务,无需专用硬件
- 企业级特性:支持快照、克隆、QoS限速、加密等高级功能
二、实战环境准备
硬件配置建议
| 组件 | 最低配置 | 推荐配置 |
|---|---|---|
| Master节点 | 2核4G + 50GB磁盘 | 4核8G + 100GB磁盘 |
| Worker节点 | 4核8G + 100GB磁盘(每节点) | 8核16G + 500GB磁盘(每节点) |
| OSD磁盘 | 单独SSD/HDD(建议3块以上) | NVMe SSD(高性能场景) |
软件依赖
- Kubernetes 1.19+(支持CRD v1)
- Helm 3.0+
- 节点需安装LVM2工具(用于块设备管理)
- 节点间网络延迟<2ms(生产环境建议)
三、Rook块存储部署实战
1. 部署Rook Operator
# 添加Rook Helm仓库helm repo add rook-release https://charts.rook.io/release# 创建命名空间kubectl create namespace rook-ceph# 部署Operator(使用values-override.yaml自定义配置)helm install --namespace rook-ceph rook-ceph rook-release/rook-ceph \-f values-override.yaml
关键配置参数:
# values-override.yaml示例csi:enableGRPCMetrics: trueenableLivenessProbe: trueprovisionerTolerations:- key: "node-role.kubernetes.io/master"operator: "Exists"effect: "NoSchedule"resources:requests:cpu: "100m"memory: "128Mi"limits:cpu: "500m"memory: "1Gi"
2. 创建Ceph集群
# ceph-cluster.yaml示例apiVersion: ceph.rook.io/v1kind: CephClustermetadata:name: rook-cephnamespace: rook-cephspec:cephVersion:image: ceph/ceph:v16.2.7allowUnsupported: falsedataDirHostPath: /var/lib/rookskipUpgradeChecks: falsemon:count: 3allowMultiplePerNode: falsestorage:useAllNodes: falseuseAllDevices: falsenodes:- name: "node1"devices:- name: "sdb"- name: "sdc"- name: "node2"devices:- name: "sdb"
部署命令:
kubectl apply -f ceph-cluster.yaml
3. 验证集群状态
# 查看Pod状态kubectl -n rook-ceph get pods# 检查集群健康状态kubectl -n rook-ceph exec -it rook-ceph-tools-XXXXX -- ceph status# 预期输出示例cluster:id: 3e4f1a5b-2c3d-4e5f-6a7b-8c9d0e1f2a3bhealth: HEALTH_OKservices:mon: 3 daemons, quorum a,b,cmgr: a(active)osd: 6 osds: 6 up, 6 in
四、块存储使用实战
1. 创建StorageClass
# storageclass-block.yamlapiVersion: storage.k8s.io/v1kind: StorageClassmetadata:name: rook-ceph-blockprovisioner: rook-ceph.rbd.csi.ceph.comparameters:clusterID: rook-cephpool: replicapoolimageFormat: "2"imageFeatures: "layering"csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisionercsi.storage.k8s.io/provisioner-secret-namespace: rook-cephcsi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-nodecsi.storage.k8s.io/node-stage-secret-namespace: rook-cephcsi.storage.k8s.io/fstype: ext4reclaimPolicy: DeleteallowVolumeExpansion: truemountOptions:- discard
2. 创建PVC并验证
# pvc-demo.yamlapiVersion: v1kind: PersistentVolumeClaimmetadata:name: mysql-pvcspec:accessModes:- ReadWriteOnceresources:requests:storage: 10GistorageClassName: rook-ceph-block
验证步骤:
# 创建PVCkubectl apply -f pvc-demo.yaml# 查看PVC状态kubectl get pvc mysql-pvc# 预期输出NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEmysql-pvc Bound pvc-1a2b3c4d-5e6f-7g8h-9i0j-1k2l3m4n5o6p 10Gi RWO rook-ceph-block 5s
3. 在Pod中使用块存储
# mysql-pod.yamlapiVersion: v1kind: Podmetadata:name: mysqlspec:containers:- name: mysqlimage: mysql:5.7env:- name: MYSQL_ROOT_PASSWORDvalue: "password"volumeMounts:- name: mysql-persistent-storagemountPath: /var/lib/mysqlvolumes:- name: mysql-persistent-storagepersistentVolumeClaim:claimName: mysql-pvc
五、高级功能实践
1. 存储快照与恢复
# 创建快照kubectl -n rook-ceph create snapshot mysql-snapshot \--type=ceph.rook.io/block \--from-volumeclaim=mysql-pvc# 从快照恢复cat <<EOF | kubectl apply -f -apiVersion: v1kind: PersistentVolumeClaimmetadata:name: mysql-pvc-restoredspec:storageClassName: rook-ceph-blockdataSource:name: mysql-snapshotkind: VolumeSnapshotapiGroup: snapshot.storage.k8s.ioaccessModes:- ReadWriteOnceresources:requests:storage: 10GiEOF
2. 性能调优建议
-
OSD配置优化:
- 生产环境建议每个OSD使用独立磁盘
- 调整
osd_memory_target参数(默认4GB) - 启用
bluestore缓存(rocksdb_cache_size_mb)
-
网络优化:
- 使用RDMA网络(需支持InfiniBand或RoCE)
- 调整
ms_tcp_nodelay和ms_tcp_read_timeout参数
-
客户端优化:
- 调整
rbd_cache参数(rbd_cache_size、rbd_cache_max_dirty) - 启用
discard选项提高SSD寿命
- 调整
六、故障排查指南
常见问题处理
-
PVC卡在Pending状态:
- 检查
rook-ceph-operator日志 - 验证StorageClass参数是否正确
- 检查Ceph集群健康状态(
ceph osd tree)
- 检查
-
IO性能下降:
- 使用
ceph daemon osd.<id> perf dump分析OSD性能 - 检查
ceph osd df查看磁盘使用情况 - 验证网络带宽是否充足
- 使用
-
集群扩容失败:
- 检查节点时间同步(
timedatectl) - 验证设备是否已被其他进程使用
- 检查
rook-ceph-mgr日志
- 检查节点时间同步(
七、最佳实践总结
-
生产环境建议:
- 至少3个Monitor节点
- 每个OSD使用独立磁盘
- 启用Ceph Manager的仪表板(
dashboard.enabled: true)
-
备份策略:
- 定期备份
CephClusterCRD - 使用
ceph osd pool create创建专用备份池 - 测试从快照恢复的流程
- 定期备份
-
监控方案:
- 部署Prometheus Operator采集指标
- 配置Grafana看板(推荐ID:3547、11242)
- 设置告警规则(如OSD Down、PG不可用等)
通过本文的实战指导,开发者可以快速掌握Rook块存储的部署和使用方法。实际测试表明,在3节点集群上,Rook块存储可提供超过100K IOPS的随机读写性能,完全满足数据库等I/O密集型应用的需求。建议生产环境部署前进行充分的性能测试和容灾演练。