$ oc adm new-project openshift-local-storage
OpenShift Container Platform 可以使用本地卷预配持久存储。本地持久卷允许您使用标准持久卷声明接口访问本地存储设备,例如磁盘或分区。
本地卷无需手动将 Pod 调度到节点即可使用,因为系统知道卷节点约束。但是,本地卷仍然受底层节点可用性的影响,并不适用于所有应用程序。
本地卷只能用作静态创建的持久卷。 |
默认情况下,OpenShift Container Platform 中未安装本地存储操作符。请使用以下步骤安装和配置此操作符以启用集群中的本地卷。
访问 OpenShift Container Platform Web 控制台或命令行界面 (CLI)。
创建 `openshift-local-storage` 项目
$ oc adm new-project openshift-local-storage
可选:允许在基础设施节点上创建本地存储。
您可能希望使用本地存储操作符在基础设施节点上创建卷,以支持日志记录和监控等组件。
您必须调整默认节点选择器,以便本地存储操作符包含基础设施节点,而不仅仅是工作节点。
要阻止本地存储操作符继承集群范围的默认选择器,请输入以下命令
$ oc annotate namespace openshift-local-storage openshift.io/node-selector=''
可选:允许本地存储在单节点部署中的 CPU 管理池中运行。
在使用管理工作负载分区的单节点部署中使用本地存储操作符,并允许使用属于 `management` 池的 CPU。在使用管理工作负载分区的单节点安装中执行此步骤。
要允许本地存储操作符在管理 CPU 池中运行,请运行以下命令
$ oc annotate namespace openshift-local-storage workload.openshift.io/allowed='management'
要从 Web 控制台安装本地存储操作符,请按照以下步骤操作
登录到 OpenShift Container Platform Web 控制台。
导航到 **操作符** → **OperatorHub**。
在筛选框中键入 **本地存储** 以查找本地存储操作符。
点击 **安装**。
在 **安装操作符** 页面上,选择 **集群上的特定命名空间**。从下拉菜单中选择 **openshift-local-storage**。
将 **更新通道** 和 **批准策略** 的值调整为您想要的值。
点击 **安装**。
完成后,本地存储操作符将列在 Web 控制台的 **已安装操作符** 部分。
从 CLI 安装本地存储操作符。
创建一个对象 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 | 安装计划的用户批准策略。 |
通过输入以下命令来创建本地存储操作符对象
$ oc apply -f openshift-local-storage.yaml
此时,操作符生命周期管理器 (OLM) 现在已知晓本地存储操作符。操作符的集群服务版本 (CSV) 应出现在目标命名空间中,并且操作符提供的 API 应可用于创建。
通过检查所有 Pod 和本地存储操作符是否已创建来验证本地存储安装
检查所有必需的 Pod 是否已创建
$ oc -n openshift-local-storage get pods
NAME READY STATUS RESTARTS AGE
local-storage-operator-746bf599c9-vlt5t 1/1 Running 0 19m
检查集群服务版本 (CSV) YAML 清单以查看本地存储操作符是否在 `openshift-local-storage` 项目中可用
$ 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
所有检查都通过后,本地存储操作符已成功安装。
本地卷无法通过动态预配创建。相反,持久卷可以由本地存储操作符创建。本地卷预配程序会在定义的资源中指定的路径查找任何文件系统或块卷设备。
已安装本地存储操作符。
您有一个满足以下条件的本地磁盘
它已附加到节点。
它未挂载。
它不包含分区。
创建本地卷资源。此资源必须定义节点和本地卷的路径。
不要对同一设备使用不同的存储类名称。这样做会创建多个持久卷 (PV)。 |
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)
forceWipeDevicesAndDestroyAllData: false (4)
volumeMode: Filesystem (5)
fsType: xfs (6)
devicePaths: (7)
- /path/to/device (8)
1 | 安装本地存储操作符的命名空间。 | ||
2 | 可选:包含附加本地存储卷的节点列表的节点选择器。此示例使用从 `oc get node` 获取的节点主机名。如果未定义值,则本地存储操作符将尝试在所有可用节点上查找匹配的磁盘。 | ||
3 | 创建持久卷对象时使用的存储类的名称。如果本地存储操作符(Local Storage Operator)不存在该存储类,它会自动创建。请务必使用唯一标识此组本地卷的存储类。 | ||
4 | 此设置定义是否调用wipefs ,该命令会删除分区表签名(魔术字符串),使磁盘准备好用于本地存储操作符 (LSO) 配置。除了签名之外,不会擦除其他任何数据。默认值为“false”(不调用wipefs )。在需要重新使用磁盘但可能存在先前数据的场景中,将forceWipeDevicesAndDestroyAllData 设置为“true”可能很有用。在这种情况下,将此字段设置为 true 可避免管理员手动擦除磁盘。此类情况可能包括单节点 OpenShift (SNO) 集群环境(其中节点可以多次重新部署),或使用 OpenShift 数据基金会 (ODF) 时,先前数据可能保留在计划用作对象存储设备 (OSD) 的磁盘上。 |
||
5 | 卷模式,Filesystem 或 Block ,定义本地卷的类型。
|
||
6 | 首次挂载本地卷时创建的文件系统。 | ||
7 | 包含要从中选择的本地存储设备列表的路径。 | ||
8 | 将此值替换为指向LocalVolume 资源by-id 的实际本地磁盘文件路径,例如/dev/disk/by-id/wwn 。成功部署供应程序后,将为这些本地磁盘创建 PV。
|
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: "local-sc" (3)
forceWipeDevicesAndDestroyAllData: false (4)
volumeMode: Block (5)
devicePaths: (6)
- /path/to/device (7)
1 | 安装本地存储操作符的命名空间。 |
2 | 可选:包含附加本地存储卷的节点列表的节点选择器。此示例使用从 `oc get node` 获取的节点主机名。如果未定义值,则本地存储操作符将尝试在所有可用节点上查找匹配的磁盘。 |
3 | 创建持久卷对象时使用的存储类的名称。 |
4 | 此设置定义是否调用wipefs ,该命令会删除分区表签名(魔术字符串),使磁盘准备好用于本地存储操作符 (LSO) 配置。除了签名之外,不会擦除其他任何数据。默认值为“false”(不调用wipefs )。在需要重新使用磁盘但可能存在先前数据的场景中,将forceWipeDevicesAndDestroyAllData 设置为“true”可能很有用。在这种情况下,将此字段设置为 true 可避免管理员手动擦除磁盘。此类情况可能包括单节点 OpenShift (SNO) 集群环境(其中节点可以多次重新部署),或使用 OpenShift 数据基金会 (ODF) 时,先前数据可能保留在计划用作对象存储设备 (OSD) 的磁盘上。 |
5 | 卷模式,Filesystem 或 Block ,定义本地卷的类型。 |
6 | 包含要从中选择的本地存储设备列表的路径。 |
7 | 将此值替换为指向LocalVolume 资源by-id 的实际本地磁盘文件路径,例如dev/disk/by-id/wwn 。成功部署供应程序后,将为这些本地磁盘创建 PV。 |
如果在运行带有 RHEL KVM 的 OpenShift Container Platform,则必须为虚拟机磁盘分配序列号。否则,重新引导后将无法识别虚拟机磁盘。可以使用 |
在 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
编辑 |
无法通过动态配置创建本地卷。而是可以通过在对象定义中定义持久卷 (PV) 来创建持久卷。本地卷供应程序会在定义的资源中指定路径的任何文件系统或块卷设备中查找。
手动配置 PV 包括在删除 PVC 时跨 PV 重用可能发生数据泄漏的风险。建议使用本地存储操作符来自动执行配置本地 PV 时的设备生命周期。 |
本地磁盘附加到 OpenShift Container Platform 节点。
定义 PV。创建一个文件,例如example-pv-filesystem.yaml
或example-pv-block.yaml
,其中包含PersistentVolume
对象定义。此资源必须定义节点和本地卷的路径。
不要对同一设备使用不同的存储类名称。这样做会创建多个 PV。 |
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-pv-filesystem
spec:
capacity:
storage: 100Gi
volumeMode: Filesystem (1)
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-sc (2)
local:
path: /dev/xvdf (3)
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- example-node
1 | 卷模式,Filesystem 或 Block ,定义 PV 的类型。 |
2 | 创建 PV 资源时使用的存储类的名称。使用唯一标识此组 PV 的存储类。 |
3 | 包含要从中选择的本地存储设备列表的路径,或目录。您只能使用Filesystem volumeMode 指定目录。 |
原始块卷 ( |
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-pv-block
spec:
capacity:
storage: 100Gi
volumeMode: Block (1)
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-sc (2)
local:
path: /dev/xvdf (3)
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- example-node
1 | 卷模式,Filesystem 或 Block ,定义 PV 的类型。 |
2 | 创建 PV 资源时使用的存储类的名称。请务必使用唯一标识此组 PV 的存储类。 |
3 | 包含要从中选择的本地存储设备列表的路径。 |
在 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-sc 3m47s
example-pv1 1Gi RWO Delete Bound local-storage/pvc1 local-sc 12h
example-pv2 1Gi RWO Delete Bound local-storage/pvc2 local-sc 12h
example-pv3 1Gi RWO Delete Bound local-storage/pvc3 local-sc 12h
本地卷必须作为持久卷声明 (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)
1 | PVC 的名称。 |
2 | PVC 的类型。默认为Filesystem 。 |
3 | PVC 可用的存储量。 |
4 | 声明所需的存储类的名称。 |
在 OpenShift Container Platform 集群中创建 PVC,指定您刚刚创建的文件。
$ oc create -f <local-pvc>.yaml
将本地卷映射到持久卷声明后,可以在资源中指定它。
持久卷声明存在于相同的命名空间中。
在资源规范中包含定义的声明。以下示例在 pod 中声明持久卷声明。
apiVersion: v1
kind: Pod
spec:
# ...
containers:
volumeMounts:
- name: local-disks (1)
mountPath: /data (2)
volumes:
- name: local-disks
persistentVolumeClaim:
claimName: local-pvc-name (3)
# ...
1 | 要挂载的卷的名称。 |
2 | 在 pod 内挂载卷的路径。不要挂载到容器根目录/ 或主机和容器中相同的任何路径。如果容器具有足够的权限(例如主机/dev/pts 文件),这可能会损坏您的主机系统。可以使用/host 安全地挂载主机。 |
3 | 要使用的现有持久卷声明的名称。 |
在 OpenShift Container Platform 集群中创建资源,指定您刚刚创建的文件。
$ oc create -f <local-pod>.yaml
本地存储操作符自动化本地存储的发现和配置。使用此功能,可以在部署期间动态配置不可用时(例如在裸机、VMware 或带有附加设备的 AWS 存储实例中)简化安装。
自动发现和配置功能仅为技术预览版功能。技术预览版功能不受 Red Hat 生产服务级别协议 (SLA) 的支持,并且功能可能不完整。Red Hat 不建议在生产环境中使用它们。这些功能可让客户提前访问即将推出的产品功能,从而能够在开发过程中测试功能并提供反馈。 有关 Red Hat 技术预览版功能的支持范围的更多信息,请参阅 技术预览版功能支持范围。 |
用于部署 Red Hat OpenShift Data Foundation 本地部署或与平台无关的部署时,自动发现和配置功能完全受支持。 |
请使用以下步骤自动发现本地设备并自动为选定的设备配置本地卷。
谨慎使用 |
您拥有集群管理员权限。
您已安装本地存储操作员。
您已将本地磁盘连接到 OpenShift Container Platform 节点。
您可以访问 OpenShift Container Platform Web 控制台和 oc
命令行界面 (CLI)。
要从 Web 控制台启用本地设备的自动发现
单击 **操作员** → **已安装的操作员**。
在 openshift-local-storage
命名空间中,单击 **本地存储**。
单击 **本地卷发现** 选项卡。
单击 **创建本地卷发现**,然后选择 **表单视图** 或 **YAML 视图**。
配置 LocalVolumeDiscovery
对象参数。
单击 **创建**。
本地存储操作员将创建一个名为 auto-discover-devices
的本地卷发现实例。
要显示节点上可用设备的连续列表
登录到 OpenShift Container Platform Web 控制台。
导航到 **计算** → **节点**。
单击要打开的节点名称。将显示“节点详细信息”页面。
选择 **磁盘** 选项卡以显示所选设备的列表。
添加或移除本地磁盘时,设备列表会持续更新。您可以按名称、状态、类型、型号、容量和模式筛选设备。
要从 Web 控制台为已发现的设备自动配置本地卷
导航到 **操作员** → **已安装的操作员**,然后从操作员列表中选择 **本地存储**。
选择 **本地卷集** → **创建本地卷集**。
输入卷集名称和存储类名称。
选择 **所有节点** 或 **选择节点** 以相应地应用过滤器。
无论您使用 **所有节点** 还是 **选择节点** 筛选,都只有工作节点可用。 |
选择要应用于本地卷集的磁盘类型、模式、大小和限制,然后单击 **创建**。
几分钟后,将显示一条消息,指示“操作员已成功协调”。
或者,要从 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: local-sc (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
1 | 确定为从已发现的设备配置的持久卷创建的存储类。如果存储类不存在,本地存储操作员会自动创建它。请务必使用唯一标识此本地卷集的存储类。 |
2 | 使用本地卷集功能时,本地存储操作员不支持使用逻辑卷管理 (LVM) 设备。 |
创建本地卷集对象
$ 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 local-sc 88m
local-pv-2ef7cd2a 100Gi RWO Delete Available local-sc 82m
local-pv-3fa1c73 100Gi RWO Delete Available local-sc 48m
从节点中移除后,结果将被删除。符号链接必须手动删除。 |
可以将污点应用于节点以阻止它们运行常规工作负载。要允许本地存储操作员使用被污点的节点,必须将容忍度添加到 Pod
或 DaemonSet
定义中。这允许在这些被污点的节点上运行已创建的资源。
您可以通过 LocalVolume
资源将容忍度应用于本地存储操作员 Pod,并通过节点规范将污点应用于节点。节点上的污点指示节点排斥所有不耐受该污点的 Pod。使用其他 Pod 上没有的特定污点可确保本地存储操作员 Pod 也可在该节点上运行。
污点和容忍度包含键、值和效果。作为参数,它表示为 |
已安装本地存储操作符。
本地磁盘连接到带有污点的 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: "local-sc"
volumeMode: Block (4)
devicePaths: (5)
- /dev/xvdg
1 | 指定您添加到节点的键。 |
2 | 指定 Equal 运算符以要求 key /value 参数匹配。如果运算符为 Exists ,则系统会检查键是否存在并忽略值。如果运算符为 Equal ,则键和值必须匹配。 |
3 | 指定被污点节点的值 local 。 |
4 | 卷模式,Filesystem 或 Block ,定义本地卷的类型。 |
5 | 包含要从中选择的本地存储设备列表的路径。 |
可选:要仅在被污点的节点上创建本地持久卷,请修改 YAML 文件并添加 LocalVolume
规范,如下例所示
spec:
tolerations:
- key: node-role.kubernetes.io/master
operator: Exists
定义的容忍度将传递给生成的守护程序集,允许为包含指定污点的节点创建 diskmaker 和 provisioner Pod。
OpenShift Container Platform 为本地存储操作员提供以下指标
lso_discovery_disk_count
:每个节点上已发现的设备总数
lso_lvset_provisioned_PV_count
:由 LocalVolumeSet
对象创建的 PV 总数
lso_lvset_unmatched_disk_count
:由于条件不匹配,本地存储操作员未选择进行配置的磁盘总数
lso_lvset_orphaned_symlink_count
:不再匹配 LocalVolumeSet
对象条件的设备数量
lso_lv_orphaned_symlink_count
:不再匹配 LocalVolume
对象条件的设备数量
lso_lv_provisioned_PV_count
:为 LocalVolume
配置的 PV 总数
要使用这些指标,请务必
在安装本地存储操作员时启用对监控的支持。
升级到 OpenShift Container Platform 4.9 或更高版本时,请通过向命名空间添加 operator-metering=true
标签手动启用指标支持。
有关指标的更多信息,请参阅 管理指标。
有时必须删除本地卷和本地卷集。虽然删除资源中的条目并删除持久卷通常就足够了,但如果您想重用相同的设备路径或让不同的存储类对其进行管理,则需要执行其他步骤。
以下步骤概述了移除本地卷的示例。相同的步骤也可用于移除针对本地卷集自定义资源的符号链接。 |
持久卷必须处于已释放
或可用
状态。
删除仍在使用的持久卷可能会导致数据丢失或损坏。 |
编辑之前创建的本地卷以移除任何不需要的磁盘。
编辑集群资源
$ oc edit localvolume <name> -n openshift-local-storage
导航到devicePaths
下的行,并删除任何表示不需要的磁盘的行。
删除任何已创建的持久卷。
$ oc delete pv <pv-name>
删除节点上的目录和包含的符号链接。
以下步骤涉及以root用户身份访问节点。超出本步骤中步骤修改节点状态可能会导致集群不稳定。 |
$ oc debug node/<node-name> -- chroot /host rm -rf /mnt/local-storage/<sc-name> (1)
1 | 用于创建本地卷的存储类的名称。 |
要卸载本地存储操作符,必须移除操作符和在openshift-local-storage
项目中创建的所有资源。
不建议在本地存储PV仍在使用时卸载本地存储操作符。虽然在移除操作符后PV将保留,但如果在未移除PV和本地存储资源的情况下卸载并重新安装操作符,则可能会出现不确定的行为。 |
访问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控制台卸载本地存储操作符。
登录到 OpenShift Container Platform Web 控制台。
导航到**操作符** → **已安装的操作符**。
在筛选框中键入 **本地存储** 以查找本地存储操作符。
单击本地存储操作符末尾的选项菜单。
单击**卸载操作符**。
在出现的窗口中单击**移除**。
由本地存储操作符创建的PV将保留在集群中,直到删除。在这些卷不再使用后,通过运行以下命令删除它们
$ oc delete pv <pv-name>
删除openshift-local-storage
项目
$ oc delete project openshift-local-storage