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

专用集群部署是指使用独立集群部署平台的分布式存储,平台内的其他业务集群通过集成接入并使用其提供的存储服务。
为确保平台分布式存储的性能和稳定性,专用存储集群中仅部署平台核心组件和分布式存储组件,避免与其他业务工作负载共址。这种隔离式部署方式是平台分布式存储的推荐最佳实践。

架构

存储-计算分离架构

基础设施要求

平台要求

支持 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
  disruptionManagement:
    managePodBudgets: true
  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:
      - 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

对于直接创建的内部 CephCluster,如果省略该字段,平台默认将 spec.disruptionManagement.managePodBudgets 设为 true。 仅在选择退出 Rook 管理的 PDB 保护时,才显式将其设置为 false。 平台不会设置 osdMaintenanceTimeout;将使用已安装 Rook 版本的 默认值。

参数

  • 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:
      - 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"
    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:
      - 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"
    port: 7480
    resources:
      requests:
        cpu: "2"
        memory: 4Gi
EOF

后续操作

当其他集群需要使用分布式存储服务时,请参考以下指南。
在外部模式下部署