logo

快速部署指南:K8s中Rook-Ceph分布式块存储实践

作者:问题终结者2025.09.18 18:51浏览量:0

简介:本文详细介绍如何在Kubernetes集群中快速部署基于Rook-Ceph的分布式块存储系统,涵盖环境准备、Rook-Ceph安装、存储类配置及验证测试全流程,助力开发者构建高可用、弹性扩展的存储解决方案。

一、为什么选择Rook-Ceph作为K8s分布式存储?

1.1 Ceph的核心优势

Ceph作为开源分布式存储系统,具备三大核心能力:

  • 统一存储层:支持块存储(RBD)、文件存储(CephFS)和对象存储(RADOSGW)三种接口。
  • 弹性扩展:通过CRUSH算法实现数据自动分布,支持EB级存储容量。
  • 高可用性:采用多副本和纠删码机制,确保数据零丢失。

1.2 Rook的集成价值

Rook作为Kubernetes的存储编排工具,解决了原生Ceph部署的复杂性:

  • 自动化运维:通过Operator模式管理Ceph集群生命周期。
  • K8s原生集成:将Ceph资源抽象为CRD(Custom Resource Definitions),如ClusterPoolStorageClass
  • 简化配置:提供默认配置模板,支持通过Values文件自定义参数。

1.3 典型应用场景

  • 有状态应用存储:为MySQL、MongoDB等数据库提供持久化存储。
  • CI/CD流水线:存储构建缓存和制品库。
  • 大数据分析:作为Hadoop/Spark的底层存储。

二、部署前环境准备

2.1 硬件要求

组件 最低配置 推荐配置
Kubernetes节点 3节点(1Master+2Worker) 5节点(3Master+2Worker)
CPU 4核/节点 8核/节点
内存 8GB/节点 16GB/节点
磁盘 1块100GB系统盘+1块200GB数据盘 2块500GB SSD(RAID1系统盘+JBOD数据盘)

2.2 软件依赖

  1. # 验证K8s版本(需≥1.19)
  2. kubectl version --short | grep "Server Version"
  3. # 安装Helm(v3.x)
  4. curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
  5. chmod 700 get_helm.sh
  6. ./get_helm.sh
  7. # 安装Ceph客户端工具(可选)
  8. sudo apt-get install ceph-common -y # Ubuntu示例

2.3 存储节点预处理

  1. 磁盘标记:确保数据盘未被分区或格式化
    1. lsblk -o NAME,ROTA,FSTYPE,MOUNTPOINT | grep -v "ROTA=1"
  2. 关闭交换分区:避免内存交换影响性能
    1. sudo swapoff -a
    2. sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

三、Rook-Ceph部署实战

3.1 创建Rook命名空间

  1. kubectl create namespace rook-ceph

3.2 部署Rook Operator

  1. # 添加Rook Helm仓库
  2. helm repo add rook-release https://charts.rook.io/release
  3. helm repo update
  4. # 安装Operator(使用默认配置)
  5. helm install rook-ceph rook-release/rook-ceph \
  6. --namespace rook-ceph \
  7. --set operatorNamespace=rook-ceph \
  8. --set image.tag=v1.12.0 \ # 指定稳定版本
  9. --set configDir=/var/lib/rook

3.3 创建Ceph集群

  1. 准备Cluster CRD

    1. # ceph-cluster.yaml
    2. apiVersion: ceph.rook.io/v1
    3. kind: CephCluster
    4. metadata:
    5. name: rook-ceph
    6. namespace: rook-ceph
    7. spec:
    8. cephVersion:
    9. image: quay.io/ceph/ceph:v18.2.6
    10. mon:
    11. count: 3
    12. allowMultiplePerNode: false
    13. storage:
    14. useAllNodes: false
    15. useAllDevices: false
    16. nodes:
    17. - name: "node1"
    18. devices:
    19. - name: "sdb" # 替换为实际设备名
    20. - name: "node2"
    21. devices:
    22. - name: "sdb"
    23. config:
    24. osdPoolDefaultSize: 3
    25. osdPoolDefaultMinSize: 2
  2. 应用配置

    1. kubectl apply -f ceph-cluster.yaml
  3. 验证集群状态

    1. kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash
    2. ceph status
    3. # 预期输出:
    4. # cluster:
    5. # id: xxxxx
    6. # health: HEALTH_OK
    7. # mon: 3 daemons, quorum a,b,c
    8. # osd: 3 osds, 3 up, 3 in

四、配置分布式块存储

4.1 创建存储池和存储类

  1. # storageclass.yaml
  2. apiVersion: storage.k8s.io/v1
  3. kind: StorageClass
  4. metadata:
  5. name: rook-ceph-block
  6. provisioner: rook-ceph.rbd.csi.ceph.com
  7. parameters:
  8. clusterID: rook-ceph
  9. pool: replicapool
  10. imageFormat: "2"
  11. imageFeatures: "layering"
  12. csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
  13. csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
  14. csi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-node
  15. csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
  16. csi.storage.k8s.io/fstype: ext4
  17. reclaimPolicy: Delete
  18. allowVolumeExpansion: true

4.2 创建PVC并验证

  1. # pvc-test.yaml
  2. apiVersion: v1
  3. kind: PersistentVolumeClaim
  4. metadata:
  5. name: ceph-block-pvc
  6. spec:
  7. accessModes:
  8. - ReadWriteOnce
  9. storageClassName: rook-ceph-block
  10. resources:
  11. requests:
  12. storage: 10Gi
  1. # 应用并验证
  2. kubectl apply -f pvc-test.yaml
  3. kubectl get pvc
  4. # 预期输出:
  5. # NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  6. # ceph-block-pvc Bound pvc-xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 10Gi RWO rook-ceph-block 5s

五、高级配置与优化

5.1 性能调优参数

  1. # 在CephCluster CRD的spec.storage.config中添加:
  2. config:
  3. osd:
  4. scheduleTimeout: 0
  5. osdMemoryTargets: 4294967296 # 4GB per OSD
  6. mon:
  7. pgNumMin: 128
  8. pgpNumMin: 128

5.2 多命名空间支持

  1. # 为不同业务创建独立StorageClass
  2. cat <<EOF | kubectl apply -f -
  3. apiVersion: storage.k8s.io/v1
  4. kind: StorageClass
  5. metadata:
  6. name: rook-ceph-block-prod
  7. provisioner: rook-ceph.rbd.csi.ceph.com
  8. parameters:
  9. clusterID: rook-ceph
  10. pool: prod-pool
  11. # ...其他参数同上
  12. EOF

5.3 监控集成方案

  1. 部署Prometheus Operator

    1. helm install prometheus prometheus-community/kube-prometheus-stack \
    2. --namespace monitoring \
    3. --set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false
  2. 配置ServiceMonitor

    1. # ceph-monitor.yaml
    2. apiVersion: monitoring.coreos.com/v1
    3. kind: ServiceMonitor
    4. metadata:
    5. name: rook-ceph-monitor
    6. namespace: rook-ceph
    7. labels:
    8. release: prometheus
    9. spec:
    10. selector:
    11. matchLabels:
    12. app: rook-ceph-mgr
    13. endpoints:
    14. - port: metrics
    15. interval: 30s

六、故障排查指南

6.1 常见问题处理

现象 可能原因 解决方案
PVC卡在Pending状态 StorageClass配置错误 检查provisioner字段是否正确
OSD启动失败 磁盘权限问题 执行chown -R ceph:ceph /dev/sdb
Ceph健康状态为HEALTH_ERR MON节点不健康 检查ceph mon stat输出
性能低下 磁盘I/O瓶颈 替换为SSD或调整osd_memory_target

6.2 日志收集命令

  1. # 获取Operator日志
  2. kubectl logs -n rook-ceph deploy/rook-ceph-operator --tail=100
  3. # 获取特定OSD日志
  4. POD_NAME=$(kubectl -n rook-ceph get pods -l app=rook-ceph-osd -o jsonpath='{.items[0].metadata.name}')
  5. kubectl -n rook-ceph logs $POD_NAME -c osd
  6. # 收集Ceph集群状态
  7. kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- ceph -s

七、最佳实践建议

  1. 节点规划原则

    • 避免在Master节点部署OSD
    • 每个Worker节点建议部署1-2个OSD
    • 保持MON节点分散在不同可用区
  2. 数据安全策略

    1. # 在CephCluster CRD中启用加密
    2. spec:
    3. security:
    4. encryption:
    5. enabled: true
    6. kms:
    7. # 配置Vault或Barbican集成
  3. 升级维护流程

    1. # 1. 更新Operator
    2. helm upgrade rook-ceph rook-release/rook-ceph -n rook-ceph --values values.yaml
    3. # 2. 更新Ceph镜像
    4. kubectl patch cephcluster rook-ceph -n rook-ceph \
    5. --type='merge' -p '{"spec":{"cephVersion":{"image":"quay.io/ceph/ceph:v19.2.0"}}}'
    6. # 3. 验证升级状态
    7. kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- ceph -v

通过本文的详细指导,开发者可以在Kubernetes环境中快速构建高可用的Rook-Ceph分布式块存储系统。该方案不仅简化了Ceph的部署复杂度,还通过K8s原生接口实现了存储资源的自动化管理,特别适合需要弹性扩展和持久化存储的云原生应用场景。建议在实际生产环境中部署前,先在测试集群验证所有配置,并根据业务负载特点调整存储池参数。

相关文章推荐

发表评论