OpenShift LVMCluster 实践手册
本文介绍了在OpenShift上使用LVM Storage Operator创建LVMCluster的完整流程。主要内容包括:1) 环境准备要求,包括安装Operator和准备裸盘;2) 通过命令行和Web控制台两种方式创建LVMCluster;3) 详细配置选项,如磁盘路径指定、节点标签选择、卷组命名等;4) 高级场景处理,包括异构节点磁盘配置和多StorageClass生成;5) 创建后的验证

文章目录
前置条件:
- 已安装 LVM Storage Operator (通常在 openshift-storage 命名空间)。
- 目标节点上必须有裸盘(Raw Disk),即没有分区、没有文件系统、没有被 LVM 初始化的磁盘。
- 建议在操作前,在节点上使用 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 控制台提供了向导式创建流程,适合快速部署。
操作步骤:
- 进入 Operator 界面:导航至 Operators -> Installed Operators。选择项目 openshift-storage。点击 LVM Storage Operator。
- 创建实例:点击 LVMCluster 选项卡 -> Create LVMCluster。
- 表单配置 (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 自动发现所有可用裸盘(慎用,建议指定路径)。
- 点击 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)
- LVMCluster 状态显示 Failed/Degraded:检查节点磁盘是否真的是“裸盘”。如果有分区表,Operator 默认不会触碰。解决方法:wipefs -a /dev/sdb (小心操作,确保数据已备份)。
- 找不到设备:检查 deviceSelector 中的路径在所有选定节点上是否存在。使用 oc describe lvmcluster 查看 Events。
- 节点选择错误:确保 Node Selector 标签与节点上的 Label 完全匹配。
总结:
通过配置 deviceSelector.paths 我们可以识别独立磁盘;通过 deviceClasses.name 我们定义卷组(VG);通过嵌套的 nodeSelector 我们可以指定特定节点的存储配置。这种组合使得 OpenShift LVM 存储方案非常灵活。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)