4.10. 使用本地卷的持久性存储
OpenShift Container Platform 可以使用本地卷来置备持久性存储。本地持久性卷允许您使用标准持久性卷声明接口访问本地存储设备,如磁盘或分区。
无需手动将 pod 调度到节点即可使用本地卷,因为系统了解卷节点的约束。但是,本地卷仍会受到底层节点可用性的影响,而且并不适用于所有应用程序。
本地卷只能用作静态创建的持久性卷。
4.10.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 project openshift-local-storage openshift.io/node-selector=''
使用 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。
运行以下命令以获取 OpenShift Container Platform 的主版本和次版本。下一步中需要
channel
值。$ OC_VERSION=$(oc version -o yaml | grep openshiftVersion | \ grep -o '[0-9]*[.][0-9]*' | head -1)
创建对象 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: "${OC_VERSION}" 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.10.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
。 - 5
- 第一次挂载本地卷时所创建的文件系统。
- 6
- 包含要从中选择的本地存储设备列表的路径。
- 7
- 使用到
LocalVolume
资源by-id
的实际本地磁盘文件路径(如/dev/disk/by-id/wwn
)替换这个值。当置备程序已被成功部署时,会为这些本地磁盘创建 PV。
注意原始块卷(
volumeMode: block
)不能以文件系统格式化。只有在 pod 上运行的任何应用程序都可以使用原始块设备时,才应使用此模式。例如: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。
在 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.10.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.10.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.10.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.10.6. 为本地存储设备自动发现和置备
Local Storage Operator 自动进行本地存储发现和置备。使用此功能,您可以在部署过程中不提供动态置备(如使用裸机、VMware 或带有附加设备的 AWS 存储实例)时简化安装。
自动发现和置备只是一个技术预览功能。技术预览功能不被红帽产品服务等级协议 (SLA) 支持,且可能在功能方面有缺陷。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的详情,请参阅 https://access.redhat.com/support/offerings/techpreview/。
使用以下步骤自动发现本地设备,并为所选设备自动置备本地。
请小心使用 LocalVolumeSet
对象。当您从本地磁盘自动置备持久性卷(PV)时,本地 PV 可能会声明所有匹配的设备。如果使用 LocalVolumeSet
对象,请确保 Local Storage Operator 是管理该节点上本地设备的唯一实体。
先决条件
- 有集群管理员权限。
- 已安装 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.10.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.10.8. 删除 Local Storage Operator 资源
4.10.8.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.10.8.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