在这里插入图片描述

前置条件:

  1. 已安装 LVM Storage Operator (通常在 openshift-storage 命名空间)。
  2. 目标节点上必须有裸盘(Raw Disk),即没有分区、没有文件系统、没有被 LVM 初始化的磁盘。
  3. 建议在操作前,在节点上使用 wipefs -a /dev/sdx 清理磁盘签名。

场景一:环境准备与磁盘识别 (Discovery)

在创建 LVMCluster 之前,我们需要确认哪些节点有可用磁盘,以及磁盘的路径(如 /dev/sdb)。

1. 命令行检查

登录到通过调试 Pod 或 SSH 登录到目标节点,查看磁盘详情:

    # 创建一个 debug pod 查看节点磁盘
oc debug node/<node-name>
sh-4.4# lsblk
# 寻找 TYPE 为 disk 且无挂载点的设备
# 示例输出:
# vdb    252:16   0  100G  0 disk
  

2. 确定节点标签

为了让存储只配置在特定节点上,建议给节点打标签:

oc label node worker-0.example.com storage-node=true
oc label node worker-1.example.com storage-node=true
  

场景二:通过界面 (Web Console) 创建

OpenShift 控制台提供了向导式创建流程,适合快速部署。

操作步骤:

  1. 进入 Operator 界面:导航至 Operators -> Installed Operators。选择项目 openshift-storage。点击 LVM Storage Operator。
  2. 创建实例:点击 LVMCluster 选项卡 -> Create LVMCluster。
  3. 表单配置 (Form View)Name: 输入名称,例如 my-lvm-cluster。Storage Class Name: 定义生成的 StorageClass 名称,例如 lvms-sc。Node Selector:输入 Key: storage-node,Value: true (对应场景一中打的标签)。Device Selector (选择磁盘):Paths: 手动输入磁盘路径,例如 /dev/vdb。或者选择 All devices 让 Operator 自动发现所有可用裸盘(慎用,建议指定路径)。
  4. 点击 Create

场景三:通过命令行 (CLI) 创建

CLI 方式更适合 GitOps 管理和复杂场景配置。以下涵盖你需要的所有特定场景。

基础模板

创建一个名为 lvm-cluster-config.yaml 的文件。

3.1 识别独立磁盘并创建 (标准场景)

此配置将在所有匹配标签的节点上,使用指定路径的独立磁盘创建 LVM 卷组。

    apiVersion: lvm.topolvm.io/v1alpha1
kind: LVMCluster
metadata:
  name: my-lvm-cluster
  namespace: openshift-storage
spec:
  storage:
    deviceClasses:
    - name: vg1              # 这将是节点上创建的 Volume Group (VG) 名称
      fstype: xfs            # 文件系统类型 (xfs 或 ext4)
      thinPoolConfig:        # 启用精简配置 (Thin Provisioning)
        name: thin-pool-1
        sizePercent: 90
        overprovisionRatio: 10
      deviceSelector:        # 【核心配置】识别独立磁盘
        paths:
        - /dev/vdb           # 指定具体的一块或多块物理磁盘路径
        - /dev/vdc
      nodeSelector:          # 指定哪些节点参与
        nodeSelectorTerms:
        - matchExpressions:
          - key: storage-node
            operator: In
            values:
            - "true"
  

应用配置:

    oc apply -f lvm-cluster-config.yaml
  

3.2 指定节点具有独立磁盘配置 (高级场景)

有时集群是异构的,Node A 的数据盘是 /dev/sdb,而 Node B 的数据盘是 /dev/nvme0n1。或者你希望创建两个不同的 StorageClass。

你需要在一个 LVMCluster 中定义多个 deviceClasses,或者利用可选路径。

方案 A:容错路径匹配 (推荐)
如果不同节点的磁盘路径不同,可以将所有可能的路径都写进去。LVM Operator 会尝试使用列表中的路径,如果路径不存在则跳过(前提是 force 策略未强制)。

    deviceSelector:
        paths:
        - /dev/sdb
        - /dev/nvme0n1
        optionalPaths: true  # 允许路径不存在而不报错
  

方案 B:严格指定特定节点使用特定磁盘
目前 LVMCluster 的 CRD 设计通常是一个 Cluster 对应一套逻辑。如果要实现非常精细的“节点A用盘A,节点B用盘B”且生成同一个 VG,通常使用上述方案 A。

如果你想通过 CRD 严格隔离(例如:高性能节点组用 NVMe,普通节点组用 SATA),可以定义两个 deviceClasses:

    apiVersion: lvm.topolvm.io/v1alpha1
kind: LVMCluster
metadata:
  name: mixed-storage-cluster
  namespace: openshift-storage
spec:
  storage:
    deviceClasses:
    # 配置 1: 高性能节点 NVMe
    - name: vg-nvme
      deviceSelector:
        paths:
        - /dev/nvme0n1
      nodeSelector: 
        nodeSelectorTerms:
        - matchExpressions:
          - key: disk-type
            operator: In
            values:
            - "nvme"
    # 配置 2: 普通节点 SATA
    - name: vg-sata
      deviceSelector:
        paths:
        - /dev/sdb
      nodeSelector: 
        nodeSelectorTerms:
        - matchExpressions:
          - key: disk-type
            operator: In
            values:
            - "sata"
  

结果:这将生成两个 StorageClass:lvms-vg-nvme 和 lvms-vg-sata。


3.3 识别卷组 (关于 Volume Group 的说明)

用户常问:“我能不能直接使用 OS 上已经建好的 VG?”

说明:
OpenShift LVM Operator 的设计理念是 “声明式管理”,即它希望自己拥有磁盘并负责创建 VG。

  • 如果不使用 LVMCluster (TopoLVM):早期的 Local Storage Operator 支持发现预先存在的磁盘或挂载点。
  • 使用 LVMCluster标准做法:给它裸盘(/dev/sdb),Operator 会自动创建名为 vg1 (取决于 deviceClasses.name) 的卷组。识别已存在的 VG:如果节点上已经手动创建了 VG,LVM Operator 通常会尝试接管它,只要名称匹配且没有被其他服务锁定。但在实践中,强烈建议让 Operator 创建 VG

如何验证 VG 是否创建成功:

    # 1. 查看 LVMCluster 状态
oc get lvmcluster -n openshift-storage -o yaml

# 2. 登录节点验证 LVM 卷组
oc debug node/<node-name>
sh-4.4# vgs
# 输出应包含你在 YAML 中定义的 deviceClasses name (例如 vg1)
# VG   #PV #LV #SN Attr   VSize   VFree
# vg1    1   1   0 wz--n- 100.00g 10.00g
  

验证与使用

1. 验证 StorageClass

创建成功后,系统会自动生成 StorageClass。

    oc get sc
# 输出示例:
# NAME          PROVISIONER          RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION
# lvms-vg1      topolvm.io           Delete          WaitForFirstConsumer   true
  

注意:StorageClass 名称通常格式为 lvms-。

2. 创建 PVC 测试

创建一个测试用的 PVC 来验证存储是否可用。

    kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: lvm-test-pvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: lvms-vg1
  volumeMode: Filesystem
  

3. 创建 Pod 挂载 PVC

    apiVersion: v1
kind: Pod
metadata:
  name: lvm-test-pod
spec:
  containers:
  - name: test
    image: ubi8/ubi-minimal
    command: ["sleep", "3600"]
    volumeMounts:
    - mountPath: /data
      name: vol
  volumes:
  - name: vol
    persistentVolumeClaim:
      claimName: lvm-test-pvc
  

常见问题排查 (Troubleshooting)

  1. LVMCluster 状态显示 Failed/Degraded:检查节点磁盘是否真的是“裸盘”。如果有分区表,Operator 默认不会触碰。解决方法:wipefs -a /dev/sdb (小心操作,确保数据已备份)。
  2. 找不到设备:检查 deviceSelector 中的路径在所有选定节点上是否存在。使用 oc describe lvmcluster 查看 Events。
  3. 节点选择错误:确保 Node Selector 标签与节点上的 Label 完全匹配。

总结:
通过配置 deviceSelector.paths 我们可以识别独立磁盘;通过 deviceClasses.name 我们定义卷组(VG);通过嵌套的 nodeSelector 我们可以指定特定节点的存储配置。这种组合使得 OpenShift LVM 存储方案非常灵活。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐