配置专用集群用于分布式存储

专用集群部署是指使用独立集群部署平台的分布式存储,平台内其他业务集群通过集成访问并使用该存储服务。
为保证平台分布式存储的性能和稳定性,专用存储集群仅部署平台核心组件和分布式存储组件,避免与其他业务负载混合部署。此种分离部署方式是平台分布式存储的推荐最佳实践。

目录

架构

存储计算分离架构

基础设施要求

平台要求

支持版本为 3.18 及以后版本。

集群要求

建议使用裸金属集群作为专用存储集群。

资源要求

请参考核心概念了解分布式存储部署的组件。

各组件对 CPU 和内存有不同需求,推荐配置如下:

进程CPU内存
MON2c3Gi
MGR3c4Gi
MDS3c8Gi
RGW2c4Gi
OSD4c8Gi

一个集群通常运行:

  • 3 个 MON
  • 2 个 MGR
  • 多个 OSD
  • 2 个 MDS(如果使用 CephFS)
  • 2 个 RGW(如果使用 CephObjectStorage)

基于组件分布,单节点资源推荐如下:

CPU内存
16c + (4c * 每节点 OSD 数量)20Gi + (8Gi * 每节点 OSD 数量)

存储设备要求

建议每节点部署不超过 12 个存储设备,有助于限制节点故障后的恢复时间。

存储设备类型要求

建议使用企业级 SSD,单个设备容量不超过 10TiB,且所有磁盘大小和类型保持一致。

容量规划

部署前需根据具体业务需求规划存储容量。默认分布式存储系统采用 3 副本冗余策略,因此可用容量为所有存储设备总原始容量除以 3。

以 30(N)节点(副本数 = 3)为例,可用容量示例如下:

存储设备大小(D)每节点存储设备数(M)总容量(DMN)可用容量(DMN/3)
0.5 TiB345 TiB15 TiB
2 TiB6360 TiB120 TiB
4 TiB91080 TiB360 TiB

容量监控与扩容

  1. 主动容量规划

    始终确保可用存储容量大于消耗容量。存储空间耗尽后,恢复需人工干预,无法通过删除或迁移数据自动解决。

  2. 容量告警

    集群在两个阈值触发告警:

    • 80% 利用率(“接近满”):主动释放空间或扩容集群。
    • 95% 利用率(“已满”):存储空间耗尽,常规命令无法释放空间,请立即联系平台支持。

    请及时处理告警并定期监控存储使用,避免服务中断。

  3. 扩容建议

    • 避免:向现有节点添加存储设备。
    • 推荐:通过新增存储节点进行横向扩容。
    • 要求:新增节点存储设备需与现有节点在容量、类型和数量上保持一致。

网络要求

分布式存储必须使用 HostNetwork

网络隔离

网络分为两类:

  • 公网网络:用于客户端与存储组件交互(如 I/O 请求)。
  • 集群网络:专用于副本间数据复制及数据重平衡(如恢复)。

为保证服务质量和性能稳定:

  1. 对专用存储集群:
    每台主机预留两块网卡:
    • 公网网络:用于客户端与组件通信。
    • 集群网络:用于内部复制和重平衡流量。
  2. 对业务集群:
    每台主机预留一块网卡访问存储公网网络。

示例网络隔离配置

网卡速率要求

  1. 存储节点

    • 公网网络和集群网络均需 10GbE 或更高速率网卡。
  2. 业务集群节点

    • 用于访问存储公网网络的网卡需 10GbE 或更高。

操作步骤

部署 Operator

  1. 进入 管理员

  2. 在左侧菜单点击 存储管理 > 分布式存储

  3. 点击 立即创建

  4. 部署 Operator 向导页面,点击右下角 部署 Operator 按钮。

    • 页面自动跳转到下一步表示 Operator 部署成功。
    • 若部署失败,请根据界面提示选择 清理已部署信息并重试,重新部署 Operator;若需返回分布式存储选择页,点击 应用商店,先卸载已部署的 rook-operator 资源,再卸载 rook-operator

创建 ceph 集群

在存储集群的 控制节点 执行命令。

点击查看
cat << EOF | kubectl create -f -
apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:
  name: ceph-cluster
  namespace: rook-ceph
spec:
  cephConfig:
    global:
      mon_memory_target: "3221225472"
      mds_cache_memory_limit: "8589934592"
      osd_memory_target: "8589934592"
      bluefs_buffered_io: "false"
    mon:
      auth_allow_insecure_global_id_reclaim: "true"
      mon_warn_on_insecure_global_id_reclaim: "false"
      mon_warn_on_insecure_global_id_reclaim_allowed: "false"
  cephVersion:
    image: build-harbor.alauda.cn/3rdparty/ceph/ceph:v18.2.4-0
  dashboard:
    enabled: true
  dataDirHostPath: /var/lib/rook
  mgr:
    count: 2
    modules:
    - enabled: true
      name: pg_autoscaler
  mon:
    count: 3
  monitoring:
    enabled: true
  network:
    ipFamily: IPv4
    addressRanges:
      public:
      - <public network cidr>
      cluster:
      - <cluster network cidr>
    provider: host
  placement:
    all:
      tolerations:
      - effect: NoSchedule
        operator: Exists
      - key: "node-role.kubernetes.io/master"
        operator: "Exists"
        effect: "NoSchedule"
      - key: "node-role.kubernetes.io/control-plane"
        operator: "Exists"
        effect: "NoSchedule"
      - key: "node-role.kubernetes.io/cpaas-system"
        operator: "Exists"
        effect: "NoSchedule"
    mgr:
      podAffinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - rook-ceph-mgr
              topologyKey: kubernetes.io/hostname
  priorityClassNames:
    all: system-node-critical
  resources:
    crashcollector:
      limits:
        cpu: 200m
        memory: 128Mi
      requests:
        cpu: 100m
        memory: 64Mi
    mgr:
      requests:
        cpu: "3"
        memory: 4Gi
    mon:
      requests:
        cpu: "2"
        memory: 3Gi
    osd:
      requests:
        cpu: "4"
        memory: 8Gi
  storage:
    <storage devices>
EOF

参数说明

  • public network cidr:存储公网网络的 CIDR(例如 - 10.0.1.0/24)。
  • cluster network cidr:存储集群网络的 CIDR(例如 - 10.0.2.0/24)。
  • storage devices:指定分布式存储使用的存储设备。
    示例格式:
      nodes:
      - name: storage-node-01
        devices:
        - name: /dev/disk/by-id/wwn-0x5000cca01dd27d60
        useAllDevices: false
      - name: storage-node-02
        devices:
        - name: sdb
        - name: sdc
        useAllDevices: false
      - name: storage-node-03
        devices:
        - name: sdb
        - name: sdc
        useAllDevices: false
    提示

    使用磁盘的 World Wide Name (WWN) 进行稳定命名,避免依赖重启后可能变化的设备路径如 sdb

创建存储池

提供三种存储池类型,根据业务需求选择创建。

创建文件池

在存储集群的 控制节点 执行命令。

点击查看
cat << EOF | kubectl apply -f -
apiVersion: ceph.rook.io/v1
kind: CephFilesystem
metadata:
  name: cephfs
  namespace: rook-ceph
spec:
  metadataPool:
    failureDomain: host
    replicated:
      requireSafeReplicaSize: true
      size: 3
  dataPools:
  - failureDomain: host
    replicated:
      requireSafeReplicaSize: true
      size: 3
  preserveFilesystemOnDelete: false
  metadataServer:
    activeCount: 1
    activeStandby: true
    placement:
      podAntiAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
        - labelSelector:
            matchExpressions:
            - key: app
              operator: In
              values:
              - rook-ceph-mds
          topologyKey: kubernetes.io/hostname
      tolerations:
      - effect: NoSchedule
        operator: Exists
    resources:
      requests:
        cpu: "3"
        memory: 8Gi
EOF

创建块池

在存储集群的 控制节点 执行命令。

点击查看
cat << EOF | kubectl apply -f -
apiVersion: ceph.rook.io/v1
kind: CephBlockPool
metadata:
  name: block
  namespace: rook-ceph
spec:
  failureDomain: host
  replicated:
    size: 3
EOF

创建对象池

在存储集群的 控制节点 执行命令。

点击查看
cat << EOF | kubectl apply -f -
apiVersion: ceph.rook.io/v1
kind: CephObjectStore
metadata:
  name: object
  namespace: rook-ceph
spec:
  metadataPool:
    failureDomain: host
    replicated:
      requireSafeReplicaSize: true
      size: 3
  dataPool:
    failureDomain: host
    replicated:
      requireSafeReplicaSize: true
      size: 3
  preservePoolsOnDelete: false
  gateway:
    instances: 2
    placement:
      podAntiAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
        - labelSelector:
            matchExpressions:
            - key: app
              operator: In
              values:
              - rook-ceph-rgw
          topologyKey: kubernetes.io/hostname
      tolerations:
      - effect: NoSchedule
        operator: Exists
    port: 7480
    resources:
      requests:
        cpu: "2"
        memory: 4Gi
EOF

后续操作

当其他集群需要使用分布式存储服务时,请参考以下指南。
访问存储服务