先决条件 (Prerequisites)

在开始集成 OpenShift Data Foundation (ODF) 与外部 Ceph 集群之前,请确保满足以下条件:

  1. OpenShift 集群 (OpenShift Cluster):

    • 一个正在运行且功能正常的 OpenShift Container Platform (OCP) 集群。版本建议为 ODF 支持的版本 (请参考 ODF 文档)。

    • 具有 cluster-admin 权限的 OCP 用户账号。

    • 已安装并配置好 oc (OpenShift CLI) 命令行工具,能够连接并管理目标 OCP 集群。

    • 对 OCP 集群的网络、节点和 Operator 生命周期管理有基本了解。

  2. 外部 Ceph 集群 (External Ceph Cluster):

    • 一个独立于 OCP、正在运行且功能正常的 Ceph 存储集群。版本建议为 ODF 支持的 Ceph 版本 (请参考 ODF 文档)。

    • Ceph 集群处于健康状态 (HEALTH_OK 或明确了解并接受 HEALTH_WARN 的原因)。

    • 具有对 Ceph 集群的管理权限(例如,能够执行 sudo ceph ... 命令)。

    • 已安装 ceph 命令行工具,并能够连接和管理 Ceph 集群。

    • 熟悉 Ceph 的基本概念,如 Monitors, OSDs, Pools, Ceph Users, FSID, CephFS (如果需要)。

    • (如果计划使用 CephFS) 确保 Ceph Metadata Server (MDS) 守护进程已部署、配置完成并且至少有一个处于 active 状态。

  3. 网络连接 (Network Connectivity):

    • OpenShift 集群节点(特别是运行 ODF CSI Pods 的 Worker 节点)必须能够通过网络访问外部 Ceph 集群的所有 Monitor 节点(检查 Ceph Monitor 使用的 v1 和 v2 端口,通常是 6789 和 3300)。

    • 根据 CSI Driver 配置和网络策略,可能还需要允许 Worker 节点访问 Ceph OSD 节点上的特定端口范围(通常是 6800-7300)。

    • 确保 OCP 节点与 Ceph 集群之间的防火墙已开放所需的端口。

  4. ODF Operator 可用性 (ODF Operator Availability):

    • 在线环境: OpenShift OperatorHub 能够访问 Red Hat 官方提供的 Operator Catalog,并能从中找到并安装 OpenShift Data Foundation Operator。

    • 离线/断开连接/镜像环境:

      • 必须已将所需版本的 ODF Operator 镜像及其所有依赖项成功镜像到您的私有容器镜像仓库 (例如 Harbor)。

      • 必须已在 OpenShift 集群中正确创建了指向私有仓库中 Operator 索引镜像的 CatalogSource 资源(如示例中的 cs-redhat-operator-index)。

      • 可能需要根据您的环境配置 ImageContentSourcePolicy 来确保 OCP 从私有仓库拉取镜像。

  5. 必要信息准备 (Information Ready):

    • 您需要提前准备好获取外部 Ceph 集群的 FSID (Cluster ID) 和所有 Monitor 节点的 IP 地址及端口号。

  6. ** 应用镜像 (Optional - Application Image):**

    • 如果需要按照本文档中的 Tomcat 示例进行应用部署测试,请确保 harborprod.ny.shuanghui.net/tomcat/tomcat:9.0 镜像在您的 Harbor 仓库中可用,或者替换为 OCP 集群可访问的其他测试镜像。

环境台账 (Environment Inventory)

本文档记录了本次 ODF 与外部 Ceph 集成部署的关键环境信息,便于维护和问题排查。

  • 集成日期 (Integration Date): YYYY-MM-DD (例如: 2025-04-11)

  • OpenShift Container Platform (OCP):

    • 集群 API URL: https://api.ocp4.ny.shuanghui.net:6443

    • Web 控制台 URL: https://console-openshift-console.apps.ocp4.ny.shuanghui.net

    • OCP 版本: Cluster version is 4.17.17

    • ODF 安装命名空间 (ODF Installation Namespace): openshift-storage

  • 外部 Ceph 集群 (External Ceph Cluster):

    • Ceph 版本: ceph version 18.2.4

    • 集群 FSID: 60500f06-15ec-11f0-9aa8-53fa8a1db53b

    • Monitor 节点 IP 地址及端口 (v2): 192.168.100.106:3300,192.168.100.107:3300,192.168.100.108:3300

    • 管理节点 IP (Admin Node IP): 例如: 192.168.100.106 (执行 ceph 命令的节点)

    • Ceph 节点 IP 范围/列表: 例如: 192.168.100.106, 107, 108

  • OpenShift Data Foundation (ODF):

    • ODF Operator 版本: 4.17.6-rhodf

    • StorageSystem CR 名称: ocs-external-storagesystem

    • StorageCluster CR 名称: ocs-storagecluster-external

    • 创建的 RBD StorageClass 名称: ocs-external-storagecluster-ceph-rbd

    • 创建的 CephFS StorageClass 名称: ocs-external-storagecluster-cephfs

  • 为 ODF 创建的 Ceph 资源 (Ceph Resources Created for ODF):

    • RBD 池名称: ocp-rbd

    • CephFS 数据池名称: ocp-cephfs-data

    • CephFS 元数据池名称: ocp-cephfs-metadata

    • CephFS 文件系统名称: ocp-cephfs

    • RBD 用户名: client.ocp-rbd

    • CephFS 用户名: client.ocp-cephfs

  • 私有镜像仓库 (Private Container Registry):

    • 仓库类型: Harbor

    • 仓库 URL: harborprod.ny.shuanghui.net

  • 堡垒机/客户端 (Bastion/Client):

    • 执行 oc 和/或 ceph 命令的主机 IP/名称: 例如: bastion.ny.shuanghui.net (192.168.100.100)

集成过程

安装 ODF Operator

操作:

  1. 登录 OpenShift Web 控制台。

  2. 导航到 "Operators" -> "OperatorHub"。

  3. 在右侧的 "Source" 下拉菜单中,确保选中了您添加的 CatalogSource(例如 cs-redhat-operator-index)。

  4. 搜索 "OpenShift Data Foundation"。

  5. 点击 "Install",选择合适的更新通道(应与您镜像时选择的一致),通常安装到 openshift-storage 命名空间。

# (可选)清理旧的或不需要的 CatalogSources 和禁用默认源
# 删除 Certified Operators CatalogSource
oc delete catalogsource certified-operators -n openshift-marketplace
# 删除 Community Operators CatalogSource
oc delete catalogsource community-operators -n openshift-marketplace
# 删除 Red Hat Marketplace CatalogSource
oc delete catalogsource redhat-marketplace -n openshift-marketplace
# 禁用所有默认 Operator 源 (如果使用自定义 CatalogSource)
oc patch operatorhub cluster --type merge -p '{"spec":{"disableAllDefaultSources": true}}'
# 删除默认的 Red Hat Operators CatalogSource (如果使用镜像的 CatalogSource)
# 注意:确保不要删除您自己添加的 CatalogSource (如 cs-redhat-operator-index)
oc delete catalogsource redhat-operators -n openshift-marketplace
# 观察 Operator 安装状态
# 观察 Operator CSV (ClusterServiceVersion) 状态,等待其 Phase 变为 Succeeded
oc get csv -n openshift-storage -w
# 观察 ODF Operator 相关 Pods 的状态,等待它们变为 Running 或 Completed
oc get pods -n openshift-storage -w

集成OpenShift 环境

# 1.下载载脚本: 通常随 ODF Operator 或文档提供
# 参考资料
# https://docs.redhat.com/zh-cn/documentation/red_hat_openshift_data_foundation/4.17/html/deploying_openshift_data_foundation_in_external_mode/creating-an-openshift-data-foundation-cluster-service-for-external-storage_ceph-external
a.打开https://console-openshift-console.apps.ocp4.ny.shuanghui.net
b.点击左侧 Operators > 安装的Operators
c.点击OpenShift Data Foundation > StorageSystem > 创建StorageSystem
d.选择 Red Hat Ceph Storage
f.下载脚本
# 2. 在 Ceph 管理节点上运行脚本,提供之前创建的池和文件系统名称
python3 ceph-external-cluster-details-exporter.py \
  --rbd-data-pool-name ocp-rbd \
  --cephfs-filesystem-name ocp-cephfs \
  --cephfs-data-pool-name ocp-cephfs-data \
  --cephfs-metadata-pool-name ocp-cephfs-metadata \
  --monitoring-endpoint <monitoring-endpoint-if-different> \
  --monitoring-endpoint-port <monitoring-port-if-different> \
  --output external-cluster-data.json # 输出 JSON 文件
​
# 3.在浏览器打开浏览文件并上传external-cluster-data.json
# 等待5分钟
oc get sc
NAME                                             PROVISIONER                             RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
ocs-external-storagecluster-ceph-rbd (default)   openshift-storage.rbd.csi.ceph.com      Delete          Immediate           true                   3h52m
ocs-external-storagecluster-cephfs               openshift-storage.cephfs.csi.ceph.com   Delete          Immediate           true                   3h52m

测试 RBD

oc new-project my-test-app
cat <<EOF> test-pvc.yaml
# test-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-rbd-claim
  # 推荐: 不在 kube-system 中创建,指定一个测试或应用命名空间
  # namespace: my-test-app
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: ocs-external-storagecluster-ceph-rbd # !! 使用正确的名字 !!
EOF
# 在您选择的命名空间中应用 (例如 my-test-app)
oc apply -f test-pvc.yaml -n my-test-app
# 在对应的命名空间中检查
oc get pvc test-rbd-claim -n my-test-app
NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                           VOLUMEATTRIBUTESCLASS   AGE
test-rbd-claim   Bound    pvc-6167111f-f089-4d59-8043-825605d2c0d8   1Gi        RWO            ocs-external-storagecluster-ceph-rbd   <unset>                 8s

测试CephFS

cat <<EOF> test-cephfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-cephfs-claim
  namespace: my-test-app # 使用同一个测试命名空间
spec:
  accessModes:
    # CephFS 支持 RWO 和 RWX
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  storageClassName: ocs-external-storagecluster-cephfs # !! 使用 CephFS 的 StorageClass !!
EOF
oc apply -f test-cephfs-pvc.yaml -n my-test-app
oc get pvc test-cephfs-claim -n my-test-app -w
persistentvolumeclaim/test-cephfs-claim created
NAME                STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS                         VOLUMEATTRIBUTESCLASS   AGE
test-cephfs-claim   Bound     pvc-9378a0fa-713f-4f73-b22b-afe7ee37b50e   1Gi        RWX            ocs-external-storagecluster-cephfs   <unset>                 3s

测试应用部署 (Tomcat 示例)

准备 Tomcat 镜像

确保 harborprod.ny.shuanghui.net/tomcat/tomcat:9.0 镜像在您的 Harbor 仓库中可用。以下是准备镜像的步骤概述:

# 第一种方式,直接在本地下载
# 在harborprod.ny.shuanghui.net下载tomcat:9.0并上传到harbor中
docker pull tomcat:9.0
docker login harborprod.ny.shuanghui.net
harboradmin:SIAIcloudHA2020!
# 新建项目,登陆网页https://harborprod.ny.shuanghui.net,点击新建项目,创建tomcat即可
docker tag tomcat:9.0 harborprod.ny.shuanghui.net/tomcat/tomcat:9.0
docker push harborprod.ny.shuanghui.net/tomcat/tomcat:9.0
​
# 第二种方式,无法访问外网,从可连接互联网的机器中下载,并导出上传到harbor汇总
# 配置镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://onkxnq50.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
# 查看架构类型
docker manifest inspect tomcat:9.0
docker pull --platform=linux/amd64 tomcat:9.0
docker save -o tomcat_9.0_amd64.tar tomcat:9.0
# 传输tomcat_9.0_amd64.tar到harborprod.ny.shuanghui.net中
docker load -i tomcat_9.0_amd64.tar
docker tag tomcat:9.0 harborprod.ny.shuanghui.net/tomcat/tomcat:9.0
# 新建项目,登陆网页https://harborprod.ny.shuanghui.net,点击新建项目,创建tomcat即可
docker push harborprod.ny.shuanghui.net/tomcat/tomcat:9.0
创建项目和 PVC

目标:使用 CephFS 存储 Tomcat 日志 (允许多个 Pod 写入) 和共享数据。

# 在 bastion 上执行
oc new-project tomcat-app
# 创建 PersistentVolumeClaims (PVCs)
# 为日志创建 RBD PVC: 创建一个名为 tomcat-log-cephfs-pvc.yaml 的文件
cat <<EOF> tomcat-log-cephfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: tomcat-log-cephfs-pvc # 新的名字
spec:
  accessModes:
    # 注意:虽然 CephFS 支持 RWX,但如果每个 Pod 写独立日志,RWO 也可能够用
    # 但为了避免跨节点问题,用 RWX 更保险
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  storageClassName: ocs-external-storagecluster-cephfs # !! 使用 CephFS SC !!
# 为共享目录创建 CephFS PVC: 创建一个名为 tomcat-shared-pvc.yaml 的文件
EOF
cat <<EOF> tomcat-shared-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: tomcat-shared-pvc # 共享卷 PVC 名称
spec:
  accessModes:
    - ReadWriteMany # 共享目录需要 RWX
  resources:
    requests:
      storage: 10Gi # 请求 10GB 存储空间 (按需调整)
  storageClassName: ocs-external-storagecluster-cephfs # 使用 CephFS StorageClass
EOF
# 在 bastion 上执行
oc apply -f tomcat-log-cephfs-pvc.yaml -n tomcat-app
oc apply -f tomcat-shared-pvc.yaml -n tomcat-app
# 检查 PVC 状态: 确保它们都变为 Bound 状态
oc get pvc -n tomcat-app
创建 Tomcat Deployment

创建 tomcat-deployment.yaml

cat <<EOF> tomcat-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-deployment
  labels:
    app: tomcat
spec:
  replicas: 3
  selector:
    matchLabels:
      app: tomcat
  template:
    metadata:
      labels:
        app: tomcat
    spec:
      containers:
      - name: tomcat # 容器名
        image: harborprod.ny.shuanghui.net/tomcat/tomcat:9.0 #镜像仓库地址
        ports:
        - containerPort: 8080
        volumeMounts:
        - name: tomcat-logs # 挂载日志卷 (来自 RBD PVC)
          mountPath: /usr/local/tomcat/logs
        - name: tomcat-shared # 挂载共享卷 (来自 CephFS PVC)
          mountPath: /shared_data
      volumes:
      - name: tomcat-logs
        persistentVolumeClaim:
          claimName: tomcat-log-cephfs-pvc # 引用 RBD PVC
      - name: tomcat-shared
        persistentVolumeClaim:
          claimName: tomcat-shared-pvc # 引用 CephFS PVC
EOF
# 应用 Deployment 文件
# 在 bastion 上执行
oc apply -f tomcat-deployment.yaml -n tomcat-app
# 查看pod日志
oc logs pod tomcat-deployment-7ff4c98f-2tp2k -n tomcat-app
# 查看pod事件
oc describe pod tomcat-deployment-7ff4c98f-2tp2k -n tomcat-app
# 删除全部pod(备注命令)
# oc delete deployment tomcat-deployment -n tomcat-app
# 检查
oc get pods -n tomcat-app -w

创建 Service 和 Route

# 创建 Service (暴露端口),用于在集群内部访问 Tomcat
cat <<EOF> tomcat-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: tomcat-service
  labels:
    app: tomcat
spec:
  ports:
  - port: 8080
  selector:
    app: tomcat # 选择带有 app=tomcat 标签的 Pods
EOF
# 应用 Service 文件    
oc apply -f tomcat-service.yaml -n tomcat-app
# 创建 Route (对外暴露)
cat <<EOF> tomcat-route.yaml
apiVersion: route.openshift.io/v1
kind: Route
metadata:
  name: tomcat-route
  labels:
    app: tomcat
spec:
  to:
    kind: Service
    name: tomcat-service # 指向上面创建的 Service
  port:
    targetPort: 8080
EOF
# 应用 Route 文件
# 在 bastion 上执行
oc apply -f tomcat-route.yaml -n tomcat-app
# 访问 Tomcat
oc get route tomcat-route -n tomcat-app
NAME           HOST/PORT                                            PATH   SERVICES         PORT   TERMINATION   WILDCARD
tomcat-route   tomcat-route-tomcat-app.apps.ocp4.ny.shuanghui.net          tomcat-service   8080                 None
# 浏览器打开
https://tomcat-route-tomcat-app.apps.ocp4.ny.shuanghui.net/
# 在浏览器中打开上面输出的 HOST/PORT 地址 (例如 [http://tomcat-route-tomcat-app.apps.ocp4.ny.shuanghui.net](http://tomcat-route-tomcat-app.apps.ocp4.ny.shuanghui.net))
# 注意:Route 通常处理 HTTP/HTTPS,不需要在 URL 后加端口号 :8080。
Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐