4.12. 使用本地存储的持久性存储
4.12.1. 使用本地卷的持久性存储
OpenShift Container Platform 可以使用本地卷来置备持久性存储。本地持久性卷允许您使用标准持久性卷声明接口访问本地存储设备,如磁盘或分区。
无需手动将 pod 调度到节点即可使用本地卷,因为系统了解卷节点的约束。但是,本地卷仍会受到底层节点可用性的影响,而且并不适用于所有应用程序。
本地卷只能用作静态创建的持久性卷。
4.12.1.1. 安装 Local Storage Operator
默认情况下,OpenShift Container Platform 中不会安装 Local Storage Operator。使用以下流程来安装和配置这个 Operator,从而在集群中启用本地卷。
先决条件
- 访问 OpenShift Container Platform web 控制台或命令行 (CLI)。
流程
创建
openshift-local-storage
项目:$ oc adm new-project openshift-local-storage
可选:允许在基础架构节点上创建本地存储。
您可能希望使用 Local Storage Operator 在基础架构节点上创建卷来支持一些组件,如日志记录和监控。
您必须调整默认节点选择器,以便 Local Storage Operator 包含基础架构节点,而不只是 worker 节点。
要阻止 Local Storage Operator 继承集群范围的默认选择器,请输入以下命令:
$ oc annotate namespace openshift-local-storage openshift.io/node-selector=''
可选:允许在单节点部署中的 CPU 管理池中运行本地存储。
在单节点部署中使用 Local Storage Operator,并允许使用属于
management
池的 CPU。在使用管理工作负载分区的单节点安装上执行这个步骤。要允许 Local Storage Operator 在管理 CPU 池上运行,请运行以下命令:
$ oc annotate namespace openshift-local-storage workload.openshift.io/allowed='management'
使用 UI
按照以下步骤,通过 web 控制台安装 Local Storage Operator:
- 登陆到 OpenShift Container Platform Web 控制台。
-
导航至 Operators
OperatorHub。 - 在过滤器框中键入 Local Storage 以查找 Local Storage Operator。
- 点击 Install。
- 在 Install Operator 页面中,选择 A specific namespace on the cluster。从下拉菜单中选择 openshift-local-storage。
- 将 Update Channel 和 Approval Strategy 的值调整为所需的值。
- 点击 Install。
完成后,Web 控制台的 Installed Operators 部分中会列出 Local Storage Operator。
使用 CLI
通过 CLI 安装 Local Storage Operator。
创建对象 YAML 文件,以定义 Local Storage Operator 的 Operator 组和订阅,如
openshift-local-storage.yaml
:openshift-local-storage.yaml 示例
apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: local-operator-group namespace: openshift-local-storage spec: targetNamespaces: - openshift-local-storage --- apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: local-storage-operator namespace: openshift-local-storage spec: channel: stable installPlanApproval: Automatic 1 name: local-storage-operator source: redhat-operators sourceNamespace: openshift-marketplace
- 1
- 安装计划的用户批准策略。
输入以下命令来创建 Local Storage Operator 对象:
$ oc apply -f openshift-local-storage.yaml
在此阶段,Operator Lifecycle Manager (OLM) 已可以了解 Local Storage Operator。Operator 的 ClusterServiceVersion (CSV) 应出现在目标命名空间中,由 Operator 提供的 API 应可用于创建。
通过检查是否创建了所有 pod 和 Local Storage Operator 来验证本地存储安装:
检查是否已创建所有必需的 pod:
$ oc -n openshift-local-storage get pods
输出示例
NAME READY STATUS RESTARTS AGE local-storage-operator-746bf599c9-vlt5t 1/1 Running 0 19m
检查 ClusterServiceVersion (CSV) YAML 清单,查看
openshift-local-storage
项目中是否有 Local Storage Operator:$ oc get csvs -n openshift-local-storage
输出示例
NAME DISPLAY VERSION REPLACES PHASE local-storage-operator.4.2.26-202003230335 Local Storage 4.2.26-202003230335 Succeeded
如果通过了所有检查,则代表 Local Storage Operator 已被成功安装。
4.12.1.2. 使用 Local Storage Operator 置备本地卷
无法通过动态置备来创建本地卷。相反,持久性卷可由 Local Storage Operator 创建。本地卷置备程序会在定义的资源中指定的路径上查找任意文件系统或块设备。
先决条件
- 安装了 Local Storage Operator。
您有一个满足以下条件的本地磁盘:
- 它附加到一个节点。
- 它尚未挂载。
- 它不包含分区。
流程
创建本地卷资源。此资源必须定义本地卷的节点和路径。
注意不要在同一设备中使用不同的存储类名称。这样做可创建多个持久性卷 (PV)。
例如:Filesystem
apiVersion: "local.storage.openshift.io/v1" kind: "LocalVolume" metadata: name: "local-disks" namespace: "openshift-local-storage" 1 spec: nodeSelector: 2 nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - ip-10-0-140-183 - ip-10-0-158-139 - ip-10-0-164-33 storageClassDevices: - storageClassName: "local-sc" 3 volumeMode: Filesystem 4 fsType: xfs 5 devicePaths: 6 - /path/to/device 7
- 1
- 安装了 Local Storage Operator 的命名空间。
- 2
- 可选:包含附加了本地存储卷的节点列表的节点选择器。本例使用从
oc get node
获取的节点主机名。如果没有定义值,则 Local Storage Operator 会尝试在所有可用节点上查找匹配的磁盘。 - 3
- 创建持久性卷对象时使用的存储类的名称。如果不存在,Local Storage Operator 会自动创建存储类。确保使用唯一标识此本地卷的存储类。
- 4
- 定义本地卷类型的卷模式,可以是
Filesystem
或Block
。注意原始块卷 (
volumeMode: Block
) 不会被格式化为文件系统。仅在 pod 上运行的任何应用程序都可以使用原始块设备时使用此模式。 - 5
- 第一次挂载本地卷时所创建的文件系统。
- 6
- 包含要从中选择的本地存储设备列表的路径。
- 7
- 使用到
LocalVolume
资源by-id
的实际本地磁盘文件路径(如/dev/disk/by-id/wwn
)替换这个值。当置备程序已被成功部署时,会为这些本地磁盘创建 PV。注意如果使用 RHEL KVM 运行 OpenShift Container Platform,则必须为虚拟机磁盘分配序列号。否则,重启后无法识别虚拟机磁盘。您可以使用
virsh edit <VM>
命令添加<serial>mydisk</serial>
定义。
例如:Block
apiVersion: "local.storage.openshift.io/v1" kind: "LocalVolume" metadata: name: "local-disks" namespace: "openshift-local-storage" 1 spec: nodeSelector: 2 nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - ip-10-0-136-143 - ip-10-0-140-255 - ip-10-0-144-180 storageClassDevices: - storageClassName: "localblock-sc" 3 volumeMode: Block 4 devicePaths: 5 - /path/to/device 6
- 1
- 安装了 Local Storage Operator 的命名空间。
- 2
- 可选:包含附加了本地存储卷的节点列表的节点选择器。本例使用从
oc get node
获取的节点主机名。如果没有定义值,则 Local Storage Operator 会尝试在所有可用节点上查找匹配的磁盘。 - 3
- 创建持久性卷对象时使用的存储类的名称。
- 4
- 定义本地卷类型的卷模式,可以是
Filesystem
或Block
。 - 5
- 包含要从中选择的本地存储设备列表的路径。
- 6
- 使用到
LocalVolume
资源by-id
的实际本地磁盘文件路径(如dev/disk/by-id/wwn
)替换这个值。当置备程序已被成功部署时,会为这些本地磁盘创建 PV。
注意如果使用 RHEL KVM 运行 OpenShift Container Platform,则必须为虚拟机磁盘分配序列号。否则,重启后无法识别虚拟机磁盘。您可以使用
virsh edit <VM>
命令添加<serial>mydisk</serial>
定义。在 OpenShift Container Platform 集群中创建本地卷资源。指定您刚才创建的文件:
$ oc create -f <local-volume>.yaml
验证置备程序是否已创建并创建了相应的守护进程集:
$ oc get all -n openshift-local-storage
输出示例
NAME READY STATUS RESTARTS AGE pod/diskmaker-manager-9wzms 1/1 Running 0 5m43s pod/diskmaker-manager-jgvjp 1/1 Running 0 5m43s pod/diskmaker-manager-tbdsj 1/1 Running 0 5m43s pod/local-storage-operator-7db4bd9f79-t6k87 1/1 Running 0 14m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/local-storage-operator-metrics ClusterIP 172.30.135.36 <none> 8383/TCP,8686/TCP 14m NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE daemonset.apps/diskmaker-manager 3 3 3 3 3 <none> 5m43s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/local-storage-operator 1/1 1 1 14m NAME DESIRED CURRENT READY AGE replicaset.apps/local-storage-operator-7db4bd9f79 1 1 1 14m
注意所需和当前的守护进程设定进程数。所需的数量为
0
表示标签选择器无效。验证持久性卷是否已创建:
$ oc get pv
输出示例
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE local-pv-1cec77cf 100Gi RWO Delete Available local-sc 88m local-pv-2ef7cd2a 100Gi RWO Delete Available local-sc 82m local-pv-3fa1c73 100Gi RWO Delete Available local-sc 48m
编辑 LocalVolume
对象不会更改现有持久性卷的 fsType
或 volumeMode
,因为这样做可能会导致破坏性操作。
4.12.1.3. 在没有 Local Storage Operator 的情况下置备本地卷
无法通过动态置备来创建本地卷。反之,可以通过在对象定义中定义持久性卷(PV)来创建持久性卷。本地卷置备程序会在定义的资源中指定的路径上查找任意文件系统或块设备。
手动置备 PV 的风险包括在删除 PVC 时,在 PV 间可能会出现数据泄漏的问题。建议在置备本地 PV 时自动执行 Local Storage Operator。
先决条件
- 本地磁盘已附加到 OpenShift Container Platform 节点。
流程
定义 PV。使用
PersistentVolume
对象定义创建一个文件,如example-pv-filesystem.yaml
或example-pv-block.yaml
。此资源必须定义本地卷的节点和路径。注意不要在同一设备中使用不同的存储类名称。这将会创建多个 PV。
example-pv-filesystem.yaml
apiVersion: v1 kind: PersistentVolume metadata: name: example-pv-filesystem spec: capacity: storage: 100Gi volumeMode: Filesystem 1 accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Delete storageClassName: local-storage 2 local: path: /dev/xvdf 3 nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - example-node
注意原始块卷(
volumeMode: block
)不能以文件系统格式化。仅在 pod 上运行的任何应用程序都可以使用原始块设备时使用此模式。example-pv-block.yaml
apiVersion: v1 kind: PersistentVolume metadata: name: example-pv-block spec: capacity: storage: 100Gi volumeMode: Block 1 accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Delete storageClassName: local-storage 2 local: path: /dev/xvdf 3 nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - example-node
在 OpenShift Container Platform 集群中创建 PV 资源。指定您刚才创建的文件:
$ oc create -f <example-pv>.yaml
验证是否已创建本地 PV:
$ oc get pv
输出示例
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE example-pv-filesystem 100Gi RWO Delete Available local-storage 3m47s example-pv1 1Gi RWO Delete Bound local-storage/pvc1 local-storage 12h example-pv2 1Gi RWO Delete Bound local-storage/pvc2 local-storage 12h example-pv3 1Gi RWO Delete Bound local-storage/pvc3 local-storage 12h
4.12.1.4. 创建本地卷持久性卷声明
必须静态创建本地卷作为持久性卷声明(PVC),才能被 pod 访问。
先决条件
- 持久性卷是使用本地卷置备程序创建的。
流程
使用对应的存储类创建 PVC:
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: local-pvc-name 1 spec: accessModes: - ReadWriteOnce volumeMode: Filesystem 2 resources: requests: storage: 100Gi 3 storageClassName: local-sc 4
通过指定您刚才创建的文件,在 OpenShift Container Platform 集群中创建 PVC:
$ oc create -f <local-pvc>.yaml
4.12.1.5. 附加本地声明
本地卷映射到持久性卷声明后,可在资源内指定。
先决条件
- 同一命名空间中存在持久性卷声明。
流程
在资源规格中包含定义的声明。以下示例在 pod 中声明持久性卷声明:
apiVersion: v1 kind: Pod spec: ... containers: volumeMounts: - name: local-disks 1 mountPath: /data 2 volumes: - name: localpvc persistentVolumeClaim: claimName: local-pvc-name 3
通过指定您刚才创建的文件,在 OpenShift Container Platform 集群中创建资源:
$ oc create -f <local-pod>.yaml
4.12.1.6. 为本地存储设备自动发现和置备
Local Storage Operator 自动进行本地存储发现和置备。使用此功能,您可以在部署过程中不提供动态置备(如使用裸机、VMware 或带有附加设备的 AWS 存储实例)时简化安装。
自动发现和置备只是一个技术预览功能。技术预览功能不被红帽产品服务等级协议 (SLA) 支持,且可能在功能方面有缺陷。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
使用以下步骤自动发现本地设备,并为所选设备自动置备本地。
请小心使用 LocalVolumeSet
对象。当您从本地磁盘自动置备持久性卷(PV)时,本地 PV 可能会声明所有匹配的设备。如果使用 LocalVolumeSet
对象,请确保 Local Storage Operator 是管理该节点上本地设备的唯一实体。不支持创建将节点超过一次的 LocalVolumeSet
实例。
先决条件
- 有集群管理员权限。
- 已安装 Local Storage Operator。
- 已将本地磁盘附加到 OpenShift Container Platform 节点。
-
您可以访问 OpenShift Container Platform web 控制台和
oc
命令行界面(CLI)。
流程
通过 web 控制台启用本地设备的自动发现:
-
在 Administrator 视角中,导航到 Operators
Installed Operators,再点 Local Volume Discovery 选项卡。 - 点 Create Local Volume Discovery。
根据您要在所有节点上还是在特定的节点上发现可用磁盘,选择 All nodes 或 Select nodes。
注意无论是使用 All nodes 或 Select nodes 进行过滤,只有 worker 节点可用。
- 点击 Create。
-
在 Administrator 视角中,导航到 Operators
此时会显示名为 auto-discover-devices
的本地卷发现实例。
显示节点上持续可用的设备列表:
- 登陆到 OpenShift Container Platform Web 控制台。
-
进入 Compute
Nodes。 - 点要打开的节点名称。此时会显示 "Node Details" 页面。
选择 Disks 标签显示所选设备的列表。
在添加或删除本地磁盘时,设备列表会持续更新。您可以根据名称、状态、类型、型号、容量和模式过滤设备。
从 web 控制台为发现的设备自动置备本地卷:
-
导航到 Operators
Installed Operators,再从 Operators 列表中选择 Local Storage。 -
选择 Local Volume Set
Create Local Volume Set。 - 输入卷集合名称和存储类名称。
选择 All nodes 或 Select nodes 以相应地应用过滤器。
注意无论是使用 All nodes 或 Select nodes 进行过滤,只有 worker 节点可用。
选择您要应用到本地卷集的磁盘类型、模式、大小和限制,然后点 Create。
几分钟后会显示一条信息,表示 "Operator reconciled successfullyd successfully."
-
导航到 Operators
另外,也可通过 CLI 为发现的设备置备本地卷:
创建一个对象 YAML 文件来定义本地卷集,如
local-volume-set.yaml
,如下例所示:apiVersion: local.storage.openshift.io/v1alpha1 kind: LocalVolumeSet metadata: name: example-autodetect spec: nodeSelector: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - worker-0 - worker-1 storageClassName: example-storageclass 1 volumeMode: Filesystem fsType: ext4 maxDeviceCount: 10 deviceInclusionSpec: deviceTypes: 2 - disk - part deviceMechanicalProperties: - NonRotational minSize: 10G maxSize: 100G models: - SAMSUNG - Crucial_CT525MX3 vendors: - ATA - ST2000LM
创建本地卷集对象:
$ oc apply -f local-volume-set.yaml
根据存储类验证本地持久性卷是否被动态置备:
$ oc get pv
输出示例
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE local-pv-1cec77cf 100Gi RWO Delete Available example-storageclass 88m local-pv-2ef7cd2a 100Gi RWO Delete Available example-storageclass 82m local-pv-3fa1c73 100Gi RWO Delete Available example-storageclass 48m
结果会在从节点中删除后删除。必须手动删除符号链接。
4.12.1.7. 使用 Local Storage Operator pod 的容限
污点可用于节点,以防止它们运行常规工作负载。要允许 Local Storage Operator 使用污点节点,您必须在 Pod
或 DaemonSet
定义中添加容限。这允许在这些污点节点上运行所创建的资源。
您可以通过 LocalVolume
资源把容限应用到 Local Storage Operator pod,通过节点规格把污点应用到一个节点。节点上的污点指示节点排斥所有不容许该污点的 pod。使用一个没有存在于其他 pod 上的特定污点可确保 Local Storage Operator pod 也可以在该节点上运行。
污点与容限由 key、value 和 effect 组成。作为参数,它表示为 key=value:effect
。运算符允许您将其中一个参数留空。
先决条件
- 安装了 Local Storage Operator。
- 本地磁盘已附加到带有一个污点的 OpenShift Container Platform 节点上。
- 污点节点可以置备本地存储。
流程
配置本地卷以便在污点节点上调度:
修改定义
Pod
的 YAML 文件并添加LocalVolume
规格,如下例所示:apiVersion: "local.storage.openshift.io/v1" kind: "LocalVolume" metadata: name: "local-disks" namespace: "openshift-local-storage" spec: tolerations: - key: localstorage 1 operator: Equal 2 value: "localstorage" 3 storageClassDevices: - storageClassName: "localblock-sc" volumeMode: Block 4 devicePaths: 5 - /dev/xvdg
可选: 要只在污点节点上创建本地持久性卷,修改 YAML 文件并添加
LocalVolume
spec,如下例所示:spec: tolerations: - key: node-role.kubernetes.io/master operator: Exists
定义的容限度将传递给生成的守护进程集,允许为包含指定污点的节点创建 diskmaker 和 provisioner pod。
4.12.1.8. Local Storage Operator 指标
OpenShift Container Platform 为 Local Storage Operator 提供以下指标:
-
lso_discovery_disk_count
:每个节点中发现的设备总数 -
lso_lvset_provisioned_PV_count
:LocalVolumeSet
对象创建的 PV 总数 -
lso_lvset_unmatched_disk_count
: Local Storage Operator 没有选择进行置备的磁盘总数,因为不匹配条件 -
lso_lvset_orphaned_symlink_count
: 使用 PV 的设备数,它们不再与LocalVolumeSet
对象标准匹配 -
lso_lv_orphaned_symlink_count
:包含 PV 的设备数,它们不再符合LocalVolume
对象标准 -
lso_lv_provisioned_PV_count
:LocalVolume
置备的 PV 总数
要使用这些指标,请务必:
- 安装 Local Storage Operator 时启用对监控的支持。
-
当升级到 OpenShift Container Platform 4.9 或更高版本时,通过将
operator-metering=true
标签添加到命名空间来手动启用指标支持。
有关指标的更多信息,请参阅管理指标。
4.12.1.9. 删除 Local Storage Operator 资源
4.12.1.9.1. 删除本地卷或本地卷集
在一些情况下,必须删除本地卷和本地卷集。虽然删除资源中的条目并删除持久性卷通常就足够,但如果您想要重复使用同一设备路径或者使其不同的存储类进行管理,则需要额外的步骤。
以下流程概述了删除本地卷的示例。同样的步骤也可以用于删除本地卷设置自定义资源的符号链接。
先决条件
持久性卷必须处于
Released
或Available
状态。警告删除仍在使用中的持久性卷可能会导致数据丢失或崩溃。
流程
编辑之前创建的本地卷以删除所有不需要的磁盘。
编辑集群资源:
$ oc edit localvolume <name> -n openshift-local-storage
-
找到
devicePaths
下的行,删除所有代表不需要的磁盘的行。
删除所有创建的持久性卷。
$ oc delete pv <pv-name>
删除节点上的所有符号链接。
警告以下步骤涉及以 root 用户身份访问节点。如果在本流程中步骤范围以外修改节点状态,则可能会导致集群不稳定。
在节点上创建一个调试 Pod:
$ oc debug node/<node-name>
将您的根目录改为
/host
:$ chroot /host
前往包含本地卷符号链接的目录。
$ cd /mnt/openshift-local-storage/<sc-name> 1
- 1
- 用于创建本地卷的存储类的名称。
删除归属于已移除设备的符号链接。
$ rm <symlink>
4.12.1.9.2. 卸载 Local Storage Operator
要卸载 Local Storage Operator,您必须删除 Operator 以及 openshift-local-storage
项目中创建的所有资源。
当本地存储 PV 仍在使用时,不建议卸载 Local Storage Operator。当 Operator 被移除后 PV 仍然会被保留。但是如果在没有删除 PV 和本地存储资源的情况下重新安装 Operator,则可能会出现不确定的行为。
先决条件
- 访问 OpenShift Container Platform Web 控制台。
流程
删除项目中安装的任何本地卷资源,如
localvolume
、localvolumeset
和localvolumediscovery
:$ oc delete localvolume --all --all-namespaces $ oc delete localvolumeset --all --all-namespaces $ oc delete localvolumediscovery --all --all-namespaces
从 Web 控制台卸载 Local Storage Operator。
- 登陆到 OpenShift Container Platform Web 控制台。
-
导航到 Operators
Installed Operators。 - 在过滤器框中键入 Local Storage 以查找 Local Storage Operator。
- 点击 Local Storage Operator 末尾的 Options 菜单 。
- 点击 Uninstall Operator。
- 在出现的窗口中点击 Remove。
由 Local Storage Operator 创建的 PV 将保留在集群中,直到被删除为止。这些卷不再使用后,运行以下命令删除它们:
$ oc delete pv <pv-name>
删除
openshift-local-storage
项目:$ oc delete project openshift-local-storage
4.12.2. 使用 hostPath 的持久性存储
OpenShift Container Platform 集群中的 hostPath 卷将主机节点的文件系统中的文件或目录挂载到 pod 中。大多数 pod 都不需要 hostPath 卷,但是如果应用程序需要它,它会提供一个快速的测试选项。
集群管理员必须将 pod 配置为以特权方式运行。这样可访问同一节点上的 pod。
4.12.2.1. 概述
OpenShift Container Platform 支持在单节点集群中使用 hostPath 挂载用于开发和测试目的。
在用于生产环境的集群中,不要使用 hostPath。集群管理员会置备网络资源,如 GCE Persistent Disk 卷、NFS 共享或 Amazon EBS 卷。网络资源支持使用存储类设置动态置备。
hostPath 卷必须静态置备 。
不要挂载到容器 root、/
或主机和容器中相同的任何路径。如果容器有足够权限,可能会损坏您的主机系统。使用 /host
挂载主机是安全的。以下示例显示主机中的 /
目录被挂载到位于 /host
的容器中。
apiVersion: v1 kind: Pod metadata: name: test-host-mount spec: containers: - image: registry.access.redhat.com/ubi9/ubi name: test-container command: ['sh', '-c', 'sleep 3600'] volumeMounts: - mountPath: /host name: host-slash volumes: - name: host-slash hostPath: path: / type: ''
4.12.2.2. 静态置备 hostPath 卷
使用 hostPath 卷的 pod 必须通过手动(静态)置备来引用。
流程
定义持久性卷(PV)的名称。创建包含
PersistentVolume
对象定义的pv.yaml
文件:apiVersion: v1 kind: PersistentVolume metadata: name: task-pv-volume 1 labels: type: local spec: storageClassName: manual 2 capacity: storage: 5Gi accessModes: - ReadWriteOnce 3 persistentVolumeReclaimPolicy: Retain hostPath: path: "/mnt/data" 4
从该文件创建 PV:
$ oc create -f pv.yaml
定义持久性卷声明(PVC)。创建包含
PersistentVolumeClaim
对象定义的pvc.yaml
文件:apiVersion: v1 kind: PersistentVolumeClaim metadata: name: task-pvc-volume spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: manual
从文件创建 PVC:
$ oc create -f pvc.yaml
4.12.2.3. 在特权 pod 中挂载 hostPath 共享
创建持久性卷声明后,应用程序就可以使用它。以下示例演示了在 pod 中挂载此共享。
先决条件
- 已存在一个映射到底层 hostPath 共享的持久性卷声明。
流程
创建可挂载现有持久性卷声明的特权 pod:
apiVersion: v1 kind: Pod metadata: name: pod-name 1 spec: containers: ... securityContext: privileged: true 2 volumeMounts: - mountPath: /data 3 name: hostpath-privileged ... securityContext: {} volumes: - name: hostpath-privileged persistentVolumeClaim: claimName: task-pvc-volume 4
4.12.3. 使用逻辑卷管理器存储的持久性存储
逻辑卷管理器存储 (LVM Storage) 使用 TopoLVM CSI 驱动程序在单节点 OpenShift 集群中动态置备本地存储。
LVM Storage 使用逻辑卷管理器创建精简配置的卷,并在有限的资源单节点 OpenShift 集群中提供块存储的动态置备。
4.12.3.1. 在单节点 OpenShift 集群上部署 LVM 存储
您可以在单节点 OpenShift 裸机或用户置备的基础架构集群中部署 LVM 存储,并将其配置为为您的工作负载动态置备存储。
LVM 存储使用所有可用磁盘创建一个卷组,并创建一个精简池,大小为卷组大小的 90%。剩余的 10% 卷组是空闲的,在需要时可以使用这些空闲空间对精简池进行扩展来实现数据恢复。您可能需要手动执行此类恢复。
您可以使用 LVM 存储置备的持久性卷声明 (PVC) 和卷快照来请求存储和创建卷快照。
LVM Storage 会配置一个默认的超置备限制 10,以利用精简配置功能。在单一节点 OpenShift 集群中可创建的卷和卷快照的总大小是精简池大小 10 倍。
您可以使用以下方法之一,在单一节点的 OpenShift 集群上部署 LVM 存储:
- Red Hat Advanced Cluster Management (RHACM)
- OpenShift Container Platform Web 控制台
4.12.3.1.1. 要求
在开始在单节点 OpenShift 集群上部署 LVM 存储前,请确保满足以下要求:
- 您已在 OpenShift Container Platform 集群上安装了 Red Hat Advanced Cluster Management (RHACM)。
- 每个受管单节点 OpenShift 集群都有一个专用磁盘,用于置备存储。
在单节点 OpenShift 集群上部署 LVM 存储前,请注意以下限制:
-
您只能在 OpenShift Container Platform 集群中创建
LVMCluster
自定义资源 (CR) 的单一实例。 -
当设备成为
LVMCluster
CR 的一部分时,无法删除它。
4.12.3.1.2. 限制
对于部署单节点 OpenShift,LVM Storage 有以下限制:
- 总存储大小受底层逻辑卷管理器(LVM)精简池的大小以及过度置备因素的限制。
逻辑卷的大小取决于物理扩展(PE)和逻辑扩展(LE)的大小。
- 在创建物理和虚拟设备期间,可以定义 PE 和 LE 的大小。
- 默认的 PE 和 LE 大小为 4 MB。
- 如果增加 PE 的大小,LVM 的最大大小由内核限值和您的磁盘空间决定。
架构 | RHEL 6 | RHEL 7 | RHEL 8 | RHEL 9 |
---|---|---|---|---|
32 位 | 16 TB | - | - | - |
64 位 | 8 EB [1] 100 TB [2] | 8 EB [1] 500 TB [2] | 8 EB | 8 EB |
- 理论大小。
- 测试大小。
4.12.3.1.3. 使用 CLI 安装 LVM 存储
作为集群管理员,您可以使用 CLI 安装逻辑卷管理器存储(LVM Storage)。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您已以具有
cluster-admin
权限的用户身份登录。
流程
为 LVM Storage Operator 创建命名空间。
将以下 YAML 保存到
lvms-namespace.yaml
文件中:apiVersion: v1 kind: Namespace metadata: labels: openshift.io/cluster-monitoring: "true" pod-security.kubernetes.io/enforce: privileged pod-security.kubernetes.io/audit: privileged pod-security.kubernetes.io/warn: privileged name: openshift-storage
创建
Namespace
CR:$ oc create -f lvms-namespace.yaml
为 LVM Storage Operator 创建 Operator 组。
将以下 YAML 保存到
lvms-operatorgroup.yaml
文件中:apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: openshift-storage-operatorgroup namespace: openshift-storage spec: targetNamespaces: - openshift-storage
创建
OperatorGroup
CR:$ oc create -f lvms-operatorgroup.yaml
订阅 LVM Storage Operator。
将以下 YAML 保存到
lvms-sub.yaml
文件中:apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: lvms namespace: openshift-storage spec: installPlanApproval: Automatic name: lvms-operator source: redhat-operators sourceNamespace: openshift-marketplace
创建
Subscription
CR:$ oc create -f lvms-sub.yaml
创建
LVMCluster
资源:将以下 YAML 保存到
lvmcluster.yaml
文件中:apiVersion: lvm.topolvm.io/v1alpha1 kind: LVMCluster metadata: name: my-lvmcluster namespace: openshift-storage spec: storage: deviceClasses: - name: vg1 deviceSelector: paths: - /dev/disk/by-path/pci-0000:87:00.0-nvme-1 - /dev/disk/by-path/pci-0000:88:00.0-nvme-1 optionalPaths: - /dev/disk/by-path/pci-0000:89:00.0-nvme-1 - /dev/disk/by-path/pci-0000:90:00.0-nvme-1 thinPoolConfig: name: thin-pool-1 sizePercent: 90 overprovisionRatio: 10 nodeSelector: nodeSelectorTerms: - matchExpressions: - key: app operator: In values: - test1
创建
LVMCluster
CR:$ oc create -f lvmcluster.yaml
要验证是否已安装 Operator,请输入以下命令:
$ oc get csv -n openshift-storage -o custom-columns=Name:.metadata.name,Phase:.status.phase
输出示例
Name Phase 4.13.0-202301261535 Succeeded
4.12.3.1.4. 使用 Web 控制台安装 LVM 存储
您可以使用 Red Hat OpenShift Container Platform OperatorHub 安装逻辑卷管理器存储 (LVM Storage)。
先决条件
- 您可以访问单节点 OpenShift 集群。
-
您可以使用具有
cluster-admin
和 Operator 安装权限的帐户。
流程
- 登录 OpenShift Container Platform Web 控制台。
-
点 Operators
OperatorHub。 -
在 Filter by keyword 框中滚动或键入
LVM Storage
来查找 LVM Storage。 - 点 Install。
在 Install Operator 页面中设置以下选项:
- 更新频道为 stable-4.14。
- Installation Mode 为 A specific namespace on the cluster。
-
Installed Namespace 为 Operator recommended namespace openshift-storage。如果
openshift-storage
命名空间不存在,它会在 Operator 安装过程中创建。 批准策略为 Automatic 或 Manual。
如果选择 Automatic 更新,Operator Lifecycle Manager(OLM)将自动升级 Operator 的运行实例,而无需任何干预。
如果选择 手动 更新,则 OLM 会创建一个更新请求。作为集群管理员,您必须手动批准该更新请求,才能将 Operator 更新至更新的版本。
- 点 Install。
验证步骤
- 验证 LVM 存储是否显示绿色勾号,代表安装成功。
4.12.3.1.5. 使用 OpenShift Web 控制台卸载安装的 LVM 存储
您可以使用 Red Hat OpenShift Container Platform Web 控制台取消所有 LVM 存储。
先决条件
- 已删除使用 LVM 存储置备的存储的集群中的所有应用程序。
- 已删除使用 LVM 存储置备的持久性卷声明 (PVC) 和持久性卷 (PV)。
- 已删除由 LVM Storage 置备的所有卷快照。
-
您可以使用
oc get logicalvolume
命令验证没有逻辑卷资源。 -
您可以使用具有
cluster-admin
权限的账户访问单节点 OpenShift 集群。
流程
-
在 Operators
Installed Operators 页面中,滚动到 LVM Storage 或在 Filter by name 中输入 LVM Storage
来查找并点击它。 - 点 LVMCluster 选项卡。
- 在 LVMCluster 页面的右侧,从 Actions 下拉菜单中选择 Delete LVMCluster。
- 点 Details 选项卡。
- 在 Operator Details 页面的右侧,从 Actions 下拉菜单中选择 Uninstall Operator。
- 选择 Remove。LVM 存储会停止运行,并完全删除。
4.12.3.1.6. 在断开连接的环境中安装 LVM 存储
您可以在断开连接的环境中的 OpenShift Container Platform 4.14 上安装 LVM 存储。此流程中引用的所有部分都在附加资源中有相关链接。
先决条件
- 您可以阅读关于断开连接的安装镜像 部分。
- 您可以访问 OpenShift Container Platform 镜像存储库。
- 您创建了镜像 registry。
流程
按照创建镜像设置配置流程中的步骤操作。要为 LVM Storage 创建
ImageSetConfiguration
资源,您可以使用以下示例 YAML 文件:LVM Storage 的 ImageSetConfiguration 文件示例
kind: ImageSetConfiguration apiVersion: mirror.openshift.io/v1alpha2 archiveSize: 4 1 storageConfig: 2 registry: imageURL: example.com/mirror/oc-mirror-metadata 3 skipTLS: false mirror: platform: channels: - name: stable-4.14 4 type: ocp graph: true 5 operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.14 6 packages: - name: lvms-operator 7 channels: - name: stable 8 additionalImages: - name: registry.redhat.io/ubi9/ubi:latest 9 helm: {}
- 1
- 添加
archiveSize
以设置镜像集合中的每个文件的最大大小(以 GiB 为单位)。 - 2
- 设置后端位置,以将镜像设置元数据保存到。此位置可以是 registry 或本地目录。必须指定
storageConfig
值,除非您使用技术预览 OCI 功能。 - 3
- 设置存储后端的 registry URL。
- 4
- 将频道设置为从中检索 OpenShift Container Platform 镜像。
- 5
- 添加
graph: true
以生成 OpenShift Update Service (OSUS) 图形镜像,以便在使用 web 控制台时改进集群更新体验。如需更多信息,请参阅关于 OpenShift Update Service。 - 6
- 将 Operator 目录设置为从中检索 OpenShift Container Platform 镜像。
- 7
- 仅指定要包含在镜像集中的某些 Operator 软件包。删除此字段以检索目录中的所有软件包。
- 8
- 仅指定要包含在镜像集中的 Operator 软件包的某些频道。即使您没有使用该频道中的捆绑包,还必须始终包含 Operator 软件包的默认频道。您可以运行以下命令来找到默认频道:
oc mirror list operators --catalog=<catalog_name> --package=<package_name>
。 - 9
- 指定要在镜像集中包含的任何其他镜像。
- 按照 Mirroring 一个镜像级到一个 mirror registry 部分的内容进行操作。
- 按照配置镜像 registry 存储库 mirroring 部分中的步骤进行操作。
4.12.3.1.7. 使用 RHACM 安装 LVM 存储
LVM Storage 使用 Red Hat Advanced Cluster Management (RHACM) 部署在单节点 OpenShift 集群上。当 Operator 应用到与 PlacementRule
资源中指定的选择器匹配的受管集群时,您可以在 RHACM 上创建 Policy
对象。该策略也应用于稍后导入并满足放置规则的集群。
先决条件
-
使用具有
cluster-admin
和 Operator 安装权限的账户访问 RHACM 集群。 - LVM 存储要使用在每个单节点 OpenShift 集群上的专用磁盘。
- 单节点 OpenShift 集群需要由 RHACM 管理,无论是导入或创建的。
流程
- 使用 OpenShift Container Platform 凭证登录到 RHACM CLI。
创建要在其中创建策略的命名空间。
# oc create ns lvms-policy-ns
要创建策略,请使用名称(如
policy-lvms-operator.yaml
)将以下 YAML 保存到文件中:apiVersion: apps.open-cluster-management.io/v1 kind: PlacementRule metadata: name: placement-install-lvms spec: clusterConditions: - status: "True" type: ManagedClusterConditionAvailable clusterSelector: 1 matchExpressions: - key: mykey operator: In values: - myvalue --- apiVersion: policy.open-cluster-management.io/v1 kind: PlacementBinding metadata: name: binding-install-lvms placementRef: apiGroup: apps.open-cluster-management.io kind: PlacementRule name: placement-install-lvms subjects: - apiGroup: policy.open-cluster-management.io kind: Policy name: install-lvms --- apiVersion: policy.open-cluster-management.io/v1 kind: Policy metadata: annotations: policy.open-cluster-management.io/categories: CM Configuration Management policy.open-cluster-management.io/controls: CM-2 Baseline Configuration policy.open-cluster-management.io/standards: NIST SP 800-53 name: install-lvms spec: disabled: false remediationAction: enforce policy-templates: - objectDefinition: apiVersion: policy.open-cluster-management.io/v1 kind: ConfigurationPolicy metadata: name: install-lvms spec: object-templates: - complianceType: musthave objectDefinition: apiVersion: v1 kind: Namespace metadata: labels: openshift.io/cluster-monitoring: "true" pod-security.kubernetes.io/enforce: privileged pod-security.kubernetes.io/audit: privileged pod-security.kubernetes.io/warn: privileged name: openshift-storage - complianceType: musthave objectDefinition: apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: openshift-storage-operatorgroup namespace: openshift-storage spec: targetNamespaces: - openshift-storage - complianceType: musthave objectDefinition: apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: lvms namespace: openshift-storage spec: installPlanApproval: Automatic name: lvms-operator source: redhat-operators sourceNamespace: openshift-marketplace remediationAction: enforce severity: low - objectDefinition: apiVersion: policy.open-cluster-management.io/v1 kind: ConfigurationPolicy metadata: name: lvms spec: object-templates: - complianceType: musthave objectDefinition: apiVersion: lvm.topolvm.io/v1alpha1 kind: LVMCluster metadata: name: my-lvmcluster namespace: openshift-storage spec: storage: deviceClasses: - name: vg1 default: true deviceSelector: 2 paths: - /dev/disk/by-path/pci-0000:87:00.0-nvme-1 - /dev/disk/by-path/pci-0000:88:00.0-nvme-1 optionalPaths: - /dev/disk/by-path/pci-0000:89:00.0-nvme-1 - /dev/disk/by-path/pci-0000:90:00.0-nvme-1 thinPoolConfig: name: thin-pool-1 sizePercent: 90 overprovisionRatio: 10 nodeSelector: 3 nodeSelectorTerms: - matchExpressions: - key: app operator: In values: - test1 remediationAction: enforce severity: low
- 1
- 替换
PlacementRule.spec.clusterSelector
中的键和值,以匹配要在其上安装 LVM Storage 的单节点 OpenShift 集群上设置的标签。 - 2
- 可选。要控制或限制卷组只适用于您的首选设备,可以在
LVMCluster
YAML 的deviceSelector
部分中手动指定设备的本地路径。paths
部分指的是LVMCluster
添加的设备,这意味着这些路径必须存在。optionalPaths
部分指的是LVMCluster
可能会添加的设备。在指定deviceSelector
部分时,必须至少指定paths
或optionalPaths
中的一个。如果您指定了paths
,则不需要指定optionalPaths
。如果指定了optionalPaths
,则不需要指定paths
,但节点上必须至少有一个可选路径。如果没有指定任何路径,它将添加节点上所有未使用的设备。 - 3
- 要添加节点过滤器(这是附加 worker 节点的子集),请在
nodeSelector
部分指定所需的过滤器。当新节点显示时,LVM Storage 会检测并使用额外的 worker 节点。
重要这个
nodeSelector
节点过滤器匹配与 pod 标签匹配不同。运行以下命令在命名空间中创建策略:
# oc create -f policy-lvms-operator.yaml -n lvms-policy-ns 1
- 1
policy-lvms-operator.yaml
是保存策略的文件的名称。
这会在
lvms-policy-ns
命名空间中创建Policy
、PlacementRule
和PlacementBinding
对象。该策略会在与放置规则匹配的集群中创建一个Namespace
、OperatorGroup
、Subscription
和LVMCluster
资源。这会在与选择条件匹配的单节点 OpenShift 集群上部署 Operator,并将其配置为设置所需资源以置备存储。Operator 使用LVMCluster
CR 中指定的所有磁盘。如果没有指定磁盘,Operator 将使用单节点 OpenShift 节点上的所有未使用的磁盘。重要将设备添加到
LVMCluster
后,无法删除它。
4.12.3.1.8. 卸载使用 RHACM 安装的 LVM 存储
要卸载使用 RHACM 安装的 LVM 存储,您需要删除为部署和配置 Operator 创建的 RHACM 策略。
当您删除 RHACM 策略时,策略创建的资源不会被删除。您需要创建额外的策略来删除资源。
因为删除策略时不会删除创建的资源,您需要执行以下步骤:
- 删除所有由 LVM Storage 置备的持久性卷声明 (PVC) 和卷快照。
-
删除
LVMCluster
资源来清理在磁盘中创建的逻辑卷管理器资源。 - 创建额外策略来卸载 Operator。
先决条件
确保在删除策略前删除以下内容:
- 受管集群中的所有应用程序都使用 LVM 存储置备的存储。
- 使用 LVM 存储置备的 PVC 和持久性卷 (PV)。
- LVM 存储置备的所有卷快照。
-
确保您可以使用具有
cluster-admin
角色的帐户访问 RHACM 集群。
流程
在 OpenShift CLI (
oc
) 中,使用以下命令删除您为在 hub 集群中部署和配置 LVM Storage 创建的 RHACM 策略:# oc delete -f policy-lvms-operator.yaml -n lvms-policy-ns 1
- 1
policy-lvms-operator.yaml
是保存策略的文件的名称。
要创建用于删除
LVMCluster
资源的策略,请将以下 YAML 保存到带有名称(如lvms-remove-policy.yaml
)的文件。这可让 Operator 清理在集群中创建的所有逻辑卷管理器资源。apiVersion: policy.open-cluster-management.io/v1 kind: Policy metadata: name: policy-lvmcluster-delete annotations: policy.open-cluster-management.io/standards: NIST SP 800-53 policy.open-cluster-management.io/categories: CM Configuration Management policy.open-cluster-management.io/controls: CM-2 Baseline Configuration spec: remediationAction: enforce disabled: false policy-templates: - objectDefinition: apiVersion: policy.open-cluster-management.io/v1 kind: ConfigurationPolicy metadata: name: policy-lvmcluster-removal spec: remediationAction: enforce 1 severity: low object-templates: - complianceType: mustnothave objectDefinition: kind: LVMCluster apiVersion: lvm.topolvm.io/v1alpha1 metadata: name: my-lvmcluster namespace: openshift-storage 2 --- apiVersion: policy.open-cluster-management.io/v1 kind: PlacementBinding metadata: name: binding-policy-lvmcluster-delete placementRef: apiGroup: apps.open-cluster-management.io kind: PlacementRule name: placement-policy-lvmcluster-delete subjects: - apiGroup: policy.open-cluster-management.io kind: Policy name: policy-lvmcluster-delete --- apiVersion: apps.open-cluster-management.io/v1 kind: PlacementRule metadata: name: placement-policy-lvmcluster-delete spec: clusterConditions: - status: "True" type: ManagedClusterConditionAvailable clusterSelector: matchExpressions: - key: mykey operator: In values: - myvalue
-
设置
PlacementRule.spec.clusterSelector
字段的值,以选择要从中卸载 LVM Storage 的集群。 运行以下命令来创建策略:
# oc create -f lvms-remove-policy.yaml -n lvms-policy-ns
要创建策略来检查
LVMCluster
CR 是否已移除,请使用名称(如check-lvms-remove-policy.yaml
)将以下 YAML 保存到文件中:apiVersion: policy.open-cluster-management.io/v1 kind: Policy metadata: name: policy-lvmcluster-inform annotations: policy.open-cluster-management.io/standards: NIST SP 800-53 policy.open-cluster-management.io/categories: CM Configuration Management policy.open-cluster-management.io/controls: CM-2 Baseline Configuration spec: remediationAction: inform disabled: false policy-templates: - objectDefinition: apiVersion: policy.open-cluster-management.io/v1 kind: ConfigurationPolicy metadata: name: policy-lvmcluster-removal-inform spec: remediationAction: inform 1 severity: low object-templates: - complianceType: mustnothave objectDefinition: kind: LVMCluster apiVersion: lvm.topolvm.io/v1alpha1 metadata: name: my-lvmcluster namespace: openshift-storage 2 --- apiVersion: policy.open-cluster-management.io/v1 kind: PlacementBinding metadata: name: binding-policy-lvmcluster-check placementRef: apiGroup: apps.open-cluster-management.io kind: PlacementRule name: placement-policy-lvmcluster-check subjects: - apiGroup: policy.open-cluster-management.io kind: Policy name: policy-lvmcluster-inform --- apiVersion: apps.open-cluster-management.io/v1 kind: PlacementRule metadata: name: placement-policy-lvmcluster-check spec: clusterConditions: - status: "True" type: ManagedClusterConditionAvailable clusterSelector: matchExpressions: - key: mykey operator: In values: - myvalue
运行以下命令来创建策略:
# oc create -f check-lvms-remove-policy.yaml -n lvms-policy-ns
运行以下命令检查策略状态:
# oc get policy -n lvms-policy-ns
输出示例
NAME REMEDIATION ACTION COMPLIANCE STATE AGE policy-lvmcluster-delete enforce Compliant 15m policy-lvmcluster-inform inform Compliant 15m
在两个策略都合规后,将以下 YAML 保存到带有名称(如
lvms-uninstall-policy.yaml
)的文件中,以创建用于卸载 LVM 存储的策略。apiVersion: apps.open-cluster-management.io/v1 kind: PlacementRule metadata: name: placement-uninstall-lvms spec: clusterConditions: - status: "True" type: ManagedClusterConditionAvailable clusterSelector: matchExpressions: - key: mykey operator: In values: - myvalue --- apiVersion: policy.open-cluster-management.io/v1 kind: PlacementBinding metadata: name: binding-uninstall-lvms placementRef: apiGroup: apps.open-cluster-management.io kind: PlacementRule name: placement-uninstall-lvms subjects: - apiGroup: policy.open-cluster-management.io kind: Policy name: uninstall-lvms --- apiVersion: policy.open-cluster-management.io/v1 kind: Policy metadata: annotations: policy.open-cluster-management.io/categories: CM Configuration Management policy.open-cluster-management.io/controls: CM-2 Baseline Configuration policy.open-cluster-management.io/standards: NIST SP 800-53 name: uninstall-lvms spec: disabled: false policy-templates: - objectDefinition: apiVersion: policy.open-cluster-management.io/v1 kind: ConfigurationPolicy metadata: name: uninstall-lvms spec: object-templates: - complianceType: mustnothave objectDefinition: apiVersion: v1 kind: Namespace metadata: name: openshift-storage - complianceType: mustnothave objectDefinition: apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: openshift-storage-operatorgroup namespace: openshift-storage spec: targetNamespaces: - openshift-storage - complianceType: mustnothave objectDefinition: apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: lvms-operator namespace: openshift-storage remediationAction: enforce severity: low - objectDefinition: apiVersion: policy.open-cluster-management.io/v1 kind: ConfigurationPolicy metadata: name: policy-remove-lvms-crds spec: object-templates: - complianceType: mustnothave objectDefinition: apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: name: logicalvolumes.topolvm.io - complianceType: mustnothave objectDefinition: apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: name: lvmclusters.lvm.topolvm.io - complianceType: mustnothave objectDefinition: apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: name: lvmvolumegroupnodestatuses.lvm.topolvm.io - complianceType: mustnothave objectDefinition: apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: name: lvmvolumegroups.lvm.topolvm.io remediationAction: enforce severity: high
运行以下命令来创建策略:
# oc create -f lvms-uninstall-policy.yaml -ns lvms-policy-ns
4.12.3.2. 在单节点 OpenShift worker 节点上创建逻辑卷管理器集群
您可以将单节点 OpenShift worker 节点配置为逻辑卷管理器集群。在 control-plane 单节点 OpenShift 节点上,LVM Storage 会在新节点在集群中激活时检测到并使用额外的 worker 节点。
当您创建逻辑卷管理器集群时,StorageClass
和 LVMVolumeGroup
资源会一起工作,以提供动态置备存储。StorageClass
CR 定义您可以动态置备的存储的属性。LVMVolumeGroup
是由 LVM 卷组支持的特定类型的持久性卷 (PV)。LVMVolumeGroup
CR 为您创建的持久性卷提供后端存储。
执行以下步骤在单节点 OpenShift worker 节点上创建逻辑卷管理器集群。
您还可以使用 OpenShift Container Platform Web 控制台执行相同的任务。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您已以具有
cluster-admin
权限的用户身份登录。 - 您已在单节点 OpenShift 集群中安装了 LVM Storage,并安装了 worker 节点以用于单节点 OpenShift 集群。
流程
创建
LVMCluster
自定义资源 (CR)。将以下 YAML 保存到
lvmcluster.yaml
文件中:apiVersion: lvm.topolvm.io/v1alpha1 kind: LVMCluster metadata: name: lvmcluster spec: storage: deviceClasses: 1 - name: vg1 fstype: ext4 2 default: true 3 deviceSelector: 4 paths: - /dev/disk/by-path/pci-0000:87:00.0-nvme-1 - /dev/disk/by-path/pci-0000:88:00.0-nvme-1 optionalPaths: - /dev/disk/by-path/pci-0000:89:00.0-nvme-1 - /dev/disk/by-path/pci-0000:90:00.0-nvme-1 thinPoolConfig: name: thin-pool-1 sizePercent: 90 overprovisionRatio: 10 nodeSelector: 5 nodeSelectorTerms: - matchExpressions: - key: app operator: In values: - test1
- 1
- 要在集群中创建多个设备存储类,请为每个所需存储类在
deviceClasses
下创建一个 YAML 数组。在deviceSelector
字段中将磁盘的本地设备路径配置为一组值。在配置多个设备类时,您必须为每个设备指定设备路径。 - 2
- 将
fstype
设置为ext4
或xfs
。默认情况下,如果没有指定设置,它被设置为xfs
。 - 3
- 必需:
LVMCluster
资源必须包含单个默认存储类。为辅助设备存储类设置default: false
。如果要从以前的版本升级LVMCluster
资源,您必须指定单个默认的设备类。 - 4
- 可选。要控制或限制卷组只适用于您的首选设备,可以在
LVMCluster
YAML 的deviceSelector
部分中手动指定设备的本地路径。paths
部分指的是LVMCluster
添加的设备,这意味着这些路径必须存在。optionalPaths
部分指的是LVMCluster
可能会添加的设备。在指定deviceSelector
部分时,必须至少指定paths
或optionalPaths
中的一个。如果您指定了paths
,则不需要指定optionalPaths
。如果指定了optionalPaths
,则不需要指定paths
,但节点上必须至少有一个可选路径。如果没有指定任何路径,它将添加节点上所有未使用的设备。 - 5
- 可选: 要控制
LVMCluster
CR 应用到的 worker 节点,请指定一组节点选择器标签。节点上必须存在指定的标签,以便LVMCluster
调度到该节点上。
创建
LVMCluster
CR:$ oc create -f lvmcluster.yaml
输出示例
lvmcluster/lvmcluster created
LVMCluster
资源会创建以下系统管理 CR:LVMVolumeGroup
- 跟踪跨多个节点的单个卷组。
LVMVolumeGroupNodeStatus
- 跟踪节点上卷组的状态。
验证
验证 LVMCluster
资源是否已创建 StorageClass
、LVMVolumeGroup
和 LVMVolumeGroupNodeStatus
CR。
LVMVolumeGroup
和 LVMVolumeGroupNodeStatus
由 LVM Storage 管理。不要直接编辑这些 CR。
运行以下命令,检查
LVMCluster
CR 是否处于ready
状态:$ oc get lvmclusters.lvm.topolvm.io -o jsonpath='{.items[*].status.deviceClassStatuses[*]}'
输出示例
{ "name": "vg1", "nodeStatus": [ { "devices": [ "/dev/nvme0n1", "/dev/nvme1n1", "/dev/nvme2n1" ], "node": "kube-node", "status": "Ready" } ] }
检查是否创建了存储类:
$ oc get storageclass
输出示例
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE lvms-vg1 topolvm.io Delete WaitForFirstConsumer true 31m
检查是否创建了卷快照类:
$ oc get volumesnapshotclass
输出示例
NAME DRIVER DELETIONPOLICY AGE lvms-vg1 topolvm.io Delete 24h
检查是否创建了
LVMVolumeGroup
资源:$ oc get lvmvolumegroup vg1 -o yaml
输出示例
apiVersion: lvm.topolvm.io/v1alpha1 kind: LVMVolumeGroup metadata: creationTimestamp: "2022-02-02T05:16:42Z" generation: 1 name: vg1 namespace: lvm-operator-system resourceVersion: "17242461" uid: 88e8ad7d-1544-41fb-9a8e-12b1a66ab157 spec: {}
检查是否创建了
LVMVolumeGroupNodeStatus
资源:$ oc get lvmvolumegroupnodestatuses.lvm.topolvm.io kube-node -o yaml
输出示例
apiVersion: lvm.topolvm.io/v1alpha1 kind: LVMVolumeGroupNodeStatus metadata: creationTimestamp: "2022-02-02T05:17:59Z" generation: 1 name: kube-node namespace: lvm-operator-system resourceVersion: "17242882" uid: 292de9bb-3a9b-4ee8-946a-9b587986dafd spec: nodeStatus: - devices: - /dev/nvme0n1 - /dev/nvme1n1 - /dev/nvme2n1 name: vg1 status: Ready
4.12.3.3. 添加存储类
您可以将存储类添加到 OpenShift Container Platform 集群。存储类描述了集群中的存储类,以及当用户指定存储类时,集群如何动态置备持久性卷(PV)。存储类描述了设备类型、服务质量级别、文件系统类型和其他详情。
流程
创建 YAML 文件:
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: lvm-storageclass parameters: csi.storage.k8s.io/fstype: ext4 topolvm.io/device-class: vg1 provisioner: topolvm.io reclaimPolicy: Delete allowVolumeExpansion: true volumeBindingMode: WaitForFirstConsumer
使用与存储类名称类似的名称保存文件。例如,
lvm-storageclass.yaml
。使用
oc
命令应用 YAML 文件:$ oc apply -f <file_name> 1
- 1
- 将
<file_name>
替换为 YAML 文件的名称。例如,lvm-storageclass.yaml
。
集群将创建存储类。
使用以下命令验证集群创建了存储类:
$ oc get storageclass <name> 1
- 1
- 将
<name>
替换为存储类的名称。例如:lvm-storageclass
。
输出示例
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE lvm-storageclass topolvm.io Delete WaitForFirstConsumer true 1s
4.12.3.4. 使用 LVM 存储置备存储
您可以使用 Operator 安装过程中创建的存储类置备持久性卷声明 (PVC)。您可以置备块和文件 PVC,当只在创建使用 PVC 的 pod 时才会分配存储。
LVM 存储以 1 GiB 单位置备 PVC。请求的存储将向上舍进到最接近的 GiB。
流程
识别部署 LVM 存储时创建的
StorageClass
。StorageClass
名称格式为lvms-<device-class-name>
。device-class-name
是您在Policy
YAML 的LVMCluster
中提供的设备名称。例如,如果deviceClass
名为vg1
,则storageClass
名称为lvms-vg1
。存储类的
volumeBindingMode
设置为WaitForFirstConsumer
。要创建需要存储的 PVC,请使用名称(如
pvc.yaml
)将以下 YAML 保存到文件中。创建 PVC 的 YAML 示例
# block pvc apiVersion: v1 kind: PersistentVolumeClaim metadata: name: lvm-block-1 namespace: default spec: accessModes: - ReadWriteOnce volumeMode: Block resources: requests: storage: 10Gi storageClassName: lvms-vg1 --- # file pvc apiVersion: v1 kind: PersistentVolumeClaim metadata: name: lvm-file-1 namespace: default spec: accessModes: - ReadWriteOnce volumeMode: Filesystem resources: requests: storage: 10Gi storageClassName: lvms-vg1
运行以下命令来创建 PVC:
# oc create -f pvc.yaml -ns <application_namespace>
在部署使用它的 pod 之前,创建的 PVC 处于
待处理
状态。
4.12.3.5. 监控 LVM 存储
当使用 OpenShift Container Platform Web 控制台安装 LVM Storage 时,您可以使用控制台中的 Block and File 仪表板来监控集群。但是,当您使用 RHACM 安装 LVM 存储时,您需要配置 RHACM Observability 以从一个位置监控所有单节点 OpenShift 集群。
4.12.3.5.1. 指标
您可以通过在 RHACM 仪表板和触发的警报上查看 Operator 导出的指标来监控 LVM 存储。
将以下
topolvm
指标添加到allow
列表中:topolvm_thinpool_data_percent topolvm_thinpool_metadata_percent topolvm_thinpool_size_bytes
指标每 10 分钟更新一次,或者在精简池中有变化时(如新逻辑卷创建)更新。
4.12.3.5.2. 警报
当精简池和卷组都被用尽后,进一步的操作都会失败,并可能导致数据丢失。LVM 存储会在利用率超过特定值时发送有关使用精简池和卷组的以下警报:
RHACM 中的逻辑卷管理器集群的警报
警报 | 描述 |
---|---|
| 当卷组和精简池在节点上都达到 75% 时,会触发此警报。需要删除数据或卷组扩展。 |
|
当卷组和精简池在节点上都超过 85% 时,会触发此警报。 |
| 当卷组中的精简池数据利用率超过节点上的 75% 时,会触发此警报。需要删除数据或精简池扩展。 |
| 当卷组中的精简池数据利用率超过节点上的 85% 时,会触发此警报。需要删除数据或精简池扩展。 |
| 当卷组中的精简池元数据利用率超过节点上的 75% 时,会触发此警报。需要删除数据或精简池扩展。 |
| 当卷组中的精简池元数据利用率超过节点上的 85% 时,会触发此警报。需要删除数据或精简池扩展。 |
4.12.3.6. 扩展单节点 OpenShift 集群的存储
OpenShift Container Platform 支持在裸机用户置备的基础架构上为单节点 OpenShift 集群支持额外的 worker 节点。当节点显示时,LVM Storage 会检测并使用新的额外 worker 节点。
4.12.3.6.1. 通过向单节点 OpenShift 集群添加容量来扩展存储
要在单节点 OpenShift 集群中扩展配置的 worker 节点的存储容量,您可以通过添加磁盘来提高容量。
先决条件
- 每个单节点 OpenShift 集群上您有额外的未使用的磁盘,供 LVM Storage 使用。
流程
- 登录到单节点 OpenShift 集群的 OpenShift Container Platform 控制台。
-
在 Operators
Installed Operators 页面中,点 openshift-storage
命名空间中的 LVM Storage Operator。 -
点 LVMCluster 选项卡列出在集群中创建的
LVMCluster
CR。 - 从 Actions 下拉菜单中选择 Edit LVMCluster。
- 点 YAML 标签页。
编辑
LVMCluster
CR YAML,在deviceSelector
部分中添加新设备路径:注意如果在
LVMCluster
创建过程中没有包括deviceSelector
字段,则无法将deviceSelector
部分添加到 CR 中。您需要删除LVMCluster
,然后创建新 CR。apiVersion: lvm.topolvm.io/v1alpha1 kind: LVMCluster metadata: name: my-lvmcluster spec: storage: deviceClasses: - name: vg1 default: true deviceSelector: 1 paths: - /dev/disk/by-path/pci-0000:87:00.0-nvme-1 - /dev/disk/by-path/pci-0000:88:00.0-nvme-1 optionalPaths: - /dev/disk/by-path/pci-0000:89:00.0-nvme-1 - /dev/disk/by-path/pci-0000:90:00.0-nvme-1 thinPoolConfig: name: thin-pool-1 sizePercent: 90 overprovisionRatio: 10
- 1
- 可选。要控制或限制卷组只适用于您的首选设备,可以在
LVMCluster
YAML 的deviceSelector
部分中手动指定设备的本地路径。paths
部分指的是LVMCluster
添加的设备,这意味着这些路径必须存在。optionalPaths
部分指的是LVMCluster
可能会添加的设备。在指定deviceSelector
部分时,必须至少指定paths
或optionalPaths
中的一个。如果您指定了paths
,则不需要指定optionalPaths
。如果指定了optionalPaths
,则不需要指定paths
,但节点上必须至少有一个可选路径。如果没有指定任何路径,它将添加节点上所有未使用的设备。
4.12.3.6.2. 使用 RHACM 为单节点 OpenShift 集群添加容量来扩展存储
您可以使用 RHACM 在单节点 OpenShift 集群上扩展配置的 worker 节点的存储容量。
先决条件
-
您可以使用具有
cluster-admin
特权的帐户访问 RHACM 集群。 - 每个单节点 OpenShift 集群中都有额外的未使用的设备,LVM Storage 可以使用它们。
流程
- 使用 OpenShift Container Platform 凭证登录到 RHACM CLI。
- 查找要添加的设备。要添加的设备需要与现有设备的设备名称和路径匹配。
要为单节点 OpenShift 集群添加容量,请编辑现有策略 YAML 的
deviceSelector
部分,如policy-lvms-operator.yaml
。注意如果在
LVMCluster
创建过程中没有包括deviceSelector
字段,则无法将deviceSelector
部分添加到 CR 中。您需要删除LVMCluster
,然后从新 CR 重新创建。apiVersion: apps.open-cluster-management.io/v1 kind: PlacementRule metadata: name: placement-install-lvms spec: clusterConditions: - status: "True" type: ManagedClusterConditionAvailable clusterSelector: matchExpressions: - key: mykey operator: In values: - myvalue --- apiVersion: policy.open-cluster-management.io/v1 kind: PlacementBinding metadata: name: binding-install-lvms placementRef: apiGroup: apps.open-cluster-management.io kind: PlacementRule name: placement-install-lvms subjects: - apiGroup: policy.open-cluster-management.io kind: Policy name: install-lvms --- apiVersion: policy.open-cluster-management.io/v1 kind: Policy metadata: annotations: policy.open-cluster-management.io/categories: CM Configuration Management policy.open-cluster-management.io/controls: CM-2 Baseline Configuration policy.open-cluster-management.io/standards: NIST SP 800-53 name: install-lvms spec: disabled: false remediationAction: enforce policy-templates: - objectDefinition: apiVersion: policy.open-cluster-management.io/v1 kind: ConfigurationPolicy metadata: name: install-lvms spec: object-templates: - complianceType: musthave objectDefinition: apiVersion: v1 kind: Namespace metadata: labels: openshift.io/cluster-monitoring: "true" pod-security.kubernetes.io/enforce: privileged pod-security.kubernetes.io/audit: privileged pod-security.kubernetes.io/warn: privileged name: openshift-storage - complianceType: musthave objectDefinition: apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: openshift-storage-operatorgroup namespace: openshift-storage spec: targetNamespaces: - openshift-storage - complianceType: musthave objectDefinition: apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: lvms namespace: openshift-storage spec: installPlanApproval: Automatic name: lvms-operator source: redhat-operators sourceNamespace: openshift-marketplace remediationAction: enforce severity: low - objectDefinition: apiVersion: policy.open-cluster-management.io/v1 kind: ConfigurationPolicy metadata: name: lvms spec: object-templates: - complianceType: musthave objectDefinition: apiVersion: lvm.topolvm.io/v1alpha1 kind: LVMCluster metadata: name: my-lvmcluster namespace: openshift-storage spec: storage: deviceClasses: - name: vg1 default: true deviceSelector: 1 paths: - /dev/disk/by-path/pci-0000:87:00.0-nvme-1 - /dev/disk/by-path/pci-0000:88:00.0-nvme-1 optionalPaths: - /dev/disk/by-path/pci-0000:89:00.0-nvme-1 - /dev/disk/by-path/pci-0000:90:00.0-nvme-1 thinPoolConfig: name: thin-pool-1 sizePercent: 90 overprovisionRatio: 10 nodeSelector: nodeSelectorTerms: - matchExpressions: - key: app operator: In values: - test1 remediationAction: enforce severity: low
- 1
- 可选。要控制或限制卷组只适用于您的首选设备,可以在
LVMCluster
YAML 的deviceSelector
部分中手动指定设备的本地路径。paths
部分指的是LVMCluster
添加的设备,这意味着这些路径必须存在。optionalPaths
部分指的是LVMCluster
可能会添加的设备。在指定deviceSelector
部分时,必须至少指定paths
或optionalPaths
中的一个。如果您指定了paths
,则不需要指定optionalPaths
。如果指定了optionalPaths
,则不需要指定paths
,但节点上必须至少有一个可选路径。如果没有指定任何路径,它将添加节点上所有未使用的设备。
运行以下命令来编辑策略:
# oc edit -f policy-lvms-operator.yaml -ns lvms-policy-ns 1
- 1
policy-lvms-operator.yaml
是现有策略的名称。
这使用
LVMCluster
CR 中指定的新磁盘来置备存储。
4.12.3.6.3. 扩展 PVC
要在添加额外的容量后利用新的存储,您可以使用 LVM 存储扩展现有持久性卷声明 (PVC)。
先决条件
- 使用动态置备。
-
控制
StorageClass
对象的allowVolumeExpansion
被设置为true
。
流程
运行以下命令,将所需 PVC 资源中的
.spec.resources.requests.storage
字段改为新大小:oc patch <pvc_name> -n <application_namespace> -p '{ "spec": { "resources": { "requests": { "storage": "<desired_size>" }}}}'
-
观察 PVC 的
status.conditions
字段来查看调整大小是否完成。OpenShift Container Platform 在扩展过程中为 PVC 添加Resizing
条件,该条件会在扩展完成后删除。
4.12.3.7. 在单节点 OpenShift 集群上升级 LVM 存储
目前,无法从 OpenShift Data Foundation Logical Volume Manager Operator 4.11 升级到单节点 OpenShift 集群上的 LVM Storage 4.12。
这个过程不会保留数据。
流程
- 备份您要在持久性卷声明 (PVC) 中保留的任何数据。
- 删除 OpenShift Data Foundation Logical Volume Manager Operator 及其 pod 置备的所有 PVC。
- 在 OpenShift Container Platform 4.12 上重新安装 LVM Storage。
- 重新创建工作负载。
- 将升级到 4.12 后将备份数据复制到创建的 PVC。
4.12.3.8. 单节点 OpenShift 的卷快照
您可以获取由 LVM Storage 置备的持久性卷 (PV) 的卷快照。您还可以为克隆卷创建卷快照。卷快照可帮助您进行以下操作:
备份应用程序数据。
重要卷快照位于与原始数据相同的设备上。要将卷快照用作备份,您需要将快照移到安全位置。您可以使用 OpenShift API 进行数据保护备份和恢复解决方案。
- 恢复到进行卷快照时的状态。
其他资源
4.12.3.8.1. 在单节点 OpenShift 中创建卷快照
您可以根据精简池的可用容量和过度置备限制创建卷快照。LVM Storage 创建一个带有 lvms-<deviceclass-name>
名称的 VolumeSnapshotClass
。
先决条件
-
确保持久性卷声明(PVC)处于
Bound
状态。对于快照的一致性,这是必需的。 - 在进行快照前,您需要停止所有到 PVC 的 I/O。
流程
-
登录到需要运行
oc
命令的单节点 OpenShift。 将以下 YAML 保存到带有名称(如
lvms-vol-snapshot.yaml
)的文件。创建卷快照的 YAML 示例
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: lvm-block-1-snap spec: volumeSnapshotClassName: lvms-vg1 source: persistentVolumeClaimName: lvm-block-1
在与 PVC 相同的命名空间中运行以下命令来创建快照:
# oc create -f lvms-vol-snapshot.yaml
PVC 的只读副本被创建为卷快照。
4.12.3.8.2. 在单节点 OpenShift 中恢复卷快照
恢复卷快照时,会创建一个新的持久性卷声明 (PVC)。恢复的 PVC 独立于卷快照和源 PVC。
先决条件
- 存储类必须与源 PVC 相同。
请求的 PVC 的大小必须与快照的源卷的大小相同。
重要快照必须恢复到与快照的源卷相同的 PVC。如果需要较大的 PVC,您可以在成功恢复快照后重新定义 PVC 的大小。
流程
- 识别源 PVC 和卷快照名称的存储类名称。
将以下 YAML 保存到带有名称(如
lvms-vol-restore.yaml
)的文件,以恢复快照。恢复 PVC 的 YAML 示例。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: lvm-block-1-restore spec: accessModes: - ReadWriteOnce volumeMode: Block Resources: Requests: storage: 2Gi storageClassName: lvms-vg1 dataSource: name: lvm-block-1-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io
在与快照相同的命名空间中运行以下命令来创建策略:
# oc create -f lvms-vol-restore.yaml
4.12.3.8.3. 删除单节点 OpenShift 中的卷快照
您可以删除卷快照资源和持久性卷声明 (PVC)。
流程
运行以下命令来删除卷快照资源:
# oc delete volumesnapshot <volume_snapshot_name> -n <namespace>
注意当您删除持久性卷声明(PVC)时,PVC 的快照不会被删除。
要删除恢复的卷快照,请运行以下命令删除为恢复卷快照而创建的 PVC:
# oc delete pvc <pvc_name> -n <namespace>
4.12.3.9. 单节点 OpenShift 的卷克隆
克隆是现有存储卷的副本,可以像任何标准卷一样使用。
4.12.3.9.1. 在单节点 OpenShift 中创建卷克隆
您可以创建一个卷克隆,以制作数据的时点副本。持久性卷声明 (PVC) 不能使用不同的大小克隆。
克隆的 PVC 具有写入访问权限。
先决条件
-
确保 PVC 处于
Bound
状态。对于快照的一致性,这是必需的。 -
确保
StorageClass
与源 PVC 相同。
流程
- 识别源 PVC 的存储类。
要创建卷克隆,请将以下 YAML 保存到带有名称的文件,如
lvms-vol-clone.yaml
:克隆卷的 YAML 示例
apiVersion: v1 kind: PersistentVolumeClaim Metadata: name: lvm-block-1-clone Spec: storageClassName: lvms-vg1 dataSource: name: lvm-block-1 kind: PersistentVolumeClaim accessModes: - ReadWriteOnce volumeMode: Block Resources: Requests: storage: 2Gi
运行以下命令,在与源 PVC 相同的命名空间中创建策略:
# oc create -f lvms-vol-clone.yaml
4.12.3.9.2. 删除单节点 OpenShift 中的克隆卷
您可以删除克隆的卷。
流程
要删除克隆的卷,请运行以下命令来删除克隆的 PVC:
# oc delete pvc <clone_pvc_name> -n <namespace>
4.12.3.10. 使用 must-gather 下载日志文件和诊断信息
如果 LVM 存储无法自动解决问题,请使用 must-gather 工具收集日志文件和诊断信息,以便您或红帽支持可以查看问题并确定解决方案。
运行以下命令,从连接到 LVM 存储集群的客户端运行 must-gather 命令:
$ oc adm must-gather --image=registry.redhat.io/lvms4/lvms-must-gather-rhel9:v4.14 --dest-dir=<directory-name>
其他资源
4.12.3.11. LVM Storage 参考 YAML 文件
LVMCluster
自定义资源 (CR) 示例描述了 YAML 文件中的所有字段。
LVMCluster CR 示例
apiVersion: lvm.topolvm.io/v1alpha1 kind: LVMCluster metadata: name: my-lvmcluster spec: tolerations: - effect: NoSchedule key: xyz operator: Equal value: "true" storage: deviceClasses: 1 - name: vg1 2 default: true nodeSelector: 3 nodeSelectorTerms: 4 - matchExpressions: - key: mykey operator: In values: - ssd deviceSelector: 5 paths: - /dev/disk/by-path/pci-0000:87:00.0-nvme-1 - /dev/disk/by-path/pci-0000:88:00.0-nvme-1 optionalPaths: - /dev/disk/by-path/pci-0000:89:00.0-nvme-1 - /dev/disk/by-path/pci-0000:90:00.0-nvme-1 thinPoolConfig: 6 name: thin-pool-1 7 sizePercent: 90 8 overprovisionRatio: 10 9 status: deviceClassStatuses: 10 - name: vg1 nodeStatus: 11 - devices: 12 - /dev/nvme0n1 - /dev/nvme1n1 - /dev/nvme2n1 node: my-node.example.com 13 status: Ready 14 ready: true 15 state: Ready 16
- 1
- 在集群中创建的 LVM 卷组。目前,只支持一个
deviceClass
。 - 2
- 要在节点上创建的 LVM 卷组名称。
- 3
- 创建 LVM 卷组的节点。如果字段为空,将考虑所有节点。
- 4
- 节点选择器要求列表。
- 5
- 用于创建 LVM 卷组的设备路径列表。如果此字段为空,则将使用节点上的所有未使用的磁盘。
- 6
- LVM 精简池配置。
- 7
- 要在 LVM 卷组中创建的精简池名称。
- 8
- 应该用于创建精简池的 LVM 卷组中剩余空间的百分比。
- 9
- 与精简池中可用存储相比,可以置备额外存储的因素。
- 10
deviceClass
的状态。- 11
- 每个节点上的 LVM 卷组状态。
- 12
- 用于创建 LVM 卷组的设备列表。
- 13
- 创建
deviceClass
的节点。 - 14
- 节点上的 LVM 卷组状态。
- 15
- 此字段已弃用。
- 16
LVMCluster
的状态。
4.12.4. 使用 LVMS 对本地持久性存储进行故障排除
由于 OpenShift Container Platform 不会将持久性卷 (PV) 限定到一个项目,所以它可以在集群中共享,并使用持久性卷声明 (PVC) 的任何项目进行声明。这可能会导致一些问题,需要进行故障排除。
4.12.4.1. 检查 PVC 处于 Pending 状态
由于多个原因,持久性卷声明 (PVC) 可能会处于 Pending
状态。例如:
- 计算资源不足
- 网络问题
- 不匹配的存储类或节点选择器
- 没有可用卷
-
具有持久性卷 (PV) 的节点处于
Not Ready
状态
使用 oc describe
命令识别原因,以查看有关卡住 PVC 的详细信息。
流程
运行以下命令来检索 PVC 列表:
$ oc get pvc
输出示例
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE lvms-test Pending lvms-vg1 11s
运行以下命令,检查与 PVC 关联的事件处于
Pending
状态:$ oc describe pvc <pvc_name> 1
- 1
- 将
<pvc_name>
替换为 PVC 的名称。例如:lvms-vg1
。
输出示例
Type Reason Age From Message ---- ------ ---- ---- ------- Warning ProvisioningFailed 4s (x2 over 17s) persistentvolume-controller storageclass.storage.k8s.io "lvms-vg1" not found
4.12.4.2. 恢复缺少的 LVMS 或 Operator 组件
如果您遇到存储类 "not found" 错误,请检查 LVMCluster
资源,并确保所有逻辑卷管理器存储(LVMS) pod 都在运行。如果 LVMCluster
资源不存在,您可以创建它。
流程
运行以下命令,验证 LVMCluster 资源是否存在:
$ oc get lvmcluster -n openshift-storage
输出示例
NAME AGE my-lvmcluster 65m
如果集群没有
LVMCluster
资源,请运行以下命令创建一个:$ oc create -n openshift-storage -f <custom_resource> 1
- 1
- 将
<custom_resource>
替换为根据您的要求量身定制的自定义资源 URL 或文件。
自定义资源示例
apiVersion: lvm.topolvm.io/v1alpha1 kind: LVMCluster metadata: name: my-lvmcluster spec: storage: deviceClasses: - name: vg1 default: true thinPoolConfig: name: thin-pool-1 sizePercent: 90 overprovisionRatio: 10
运行以下命令,检查 LVMS 中的所有 pod 是否处于
openshift-storage
命名空间中的Running
状态:$ oc get pods -n openshift-storage
输出示例
NAME READY STATUS RESTARTS AGE lvms-operator-7b9fb858cb-6nsml 3/3 Running 0 70m topolvm-controller-5dd9cf78b5-7wwr2 5/5 Running 0 66m topolvm-node-dr26h 4/4 Running 0 66m vg-manager-r6zdv 1/1 Running 0 66m
预期的输出是
lvms-operator
和vg-manager
的一个运行实例。每个节点预期有一个topolvm-controller
和topolvm-node
实例。如果
topolvm-node
一直处于Init
状态,则无法找到 LVMS 要使用的可用磁盘。要检索故障排除所需的信息,请运行以下命令来查看vg-manager
pod 的日志:$ oc logs -l app.kubernetes.io/component=vg-manager -n openshift-storage
4.12.4.3. 从节点故障中恢复
有时,持久性卷声明 (PVC) 处于 Pending
状态,因为集群中的特定节点失败。要识别出现故障的节点,您可以检查 topolvm-node
pod 的重启计数。增加了重启计数表示底层节点的潜在问题,这可能需要进一步调查和故障排除。
流程
运行以下命令,检查
topolvm-node
pod 实例的重启计数:$ oc get pods -n openshift-storage
输出示例
NAME READY STATUS RESTARTS AGE lvms-operator-7b9fb858cb-6nsml 3/3 Running 0 70m topolvm-controller-5dd9cf78b5-7wwr2 5/5 Running 0 66m topolvm-node-dr26h 4/4 Running 0 66m topolvm-node-54as8 4/4 Running 0 66m topolvm-node-78fft 4/4 Running 17 (8s ago) 66m vg-manager-r6zdv 1/1 Running 0 66m vg-manager-990ut 1/1 Running 0 66m vg-manager-an118 1/1 Running 0 66m
在解决了节点的问题后,如果 PVC 仍然处于
Pending
状态,您可能需要执行强制清理过程。
其他资源
4.12.4.4. 从磁盘失败中恢复
如果您在检查与持久性卷声明 (PVC) 关联的事件时看到失败信息,则可能代表底层卷或磁盘存在问题。磁盘和卷置备问题通常会首先出现一个通用的错误,如 Failed to provision volume with StorageClass <storage_class_name>
。一般随后会跟随一个更加具体的错误消息。
流程
运行以下命令,检查与 PVC 关联的事件:
$ oc describe pvc <pvc_name> 1
- 1
- 将
<pvc_name>
替换为 PVC 的名称。以下是磁盘或卷失败错误消息的一些示例及其原因:- Failed to check volume existence: 代表在验证卷是否已存在时出现问题。卷验证失败可能是由网络连接问题或其他故障造成的。
- Failed to bind volume: 如果可用持久性卷 (PV) 与 PVC 的要求不匹配,则无法绑定卷。
- FailedMount or FailedUnMount: 这个错误表示试图将卷挂载到节点或从节点卸载卷时出现问题。如果磁盘失败,pod 尝试使用 PVC 时可能会出现这个错误。
-
Volume is already exclusively attached to one node and can’t be attached to another: 这个错误可能会出现不支持
ReadWriteMany
访问模式的存储解决方案。
- 建立到发生问题的主机的直接连接。
- 解决磁盘问题。
在解决了磁盘的问题后,如果失败消息仍然存在或再次出现,则可能需要执行强制清理过程。
其他资源
4.12.4.5. 执行强制清理
如果在完成故障排除过程后仍然存在磁盘或节点相关的问题,可能需要执行强制清理过程。强制清理用于全面解决持久问题,并确保 LVMS 正常工作。
先决条件
- 已删除使用逻辑卷管理器存储 (LVMS) 驱动程序创建的所有持久性卷声明 (PVC)。
- 使用这些 PVC 的 pod 已停止。
流程
运行以下命令切换到
openshift-storage
命名空间:$ oc project openshift-storage
运行以下命令,确保没有剩余的
Logical Volume
自定义资源 (CR):$ oc get logicalvolume
输出示例
No resources found
运行以下命令,确保没有
LVMVolumeGroup
CR:$ oc get lvmvolumegroup
输出示例
No resources found
运行以下命令来删除所有
LVMVolumeGroupNodeStatus
CR:$ oc delete lvmvolumegroupnodestatus --all
运行以下命令来删除
LVMCluster
CR:$ oc delete lvmcluster --all