3.7. 使用 FlexVolume 的持久性存储

OpenShift Container Platform 支持 FlexVolume,这是一个树外插件,使用可执行模型与驱动程序进行接口。

要从没有内置插件的后端使用存储,您可以通过 FlexVolume 驱动程序来扩展 OpenShift Container Platform,并为应用程序提供持久性存储。

Pod 通过 flexvolume 树内插件与 FlexVolume 驱动程序交互。

其他资源

3.7.1. 关于 FlexVolume 驱动程序

FlexVolume 驱动程序是一个可执行文件,它位于集群中所有节点的一个明确定义的目录中。OpenShift Container Platform 会在需要挂载或卸载由带有 flexVolumePersistentVolume 对象代表的卷时调用 FlexVolume 驱动程序。

重要

OpenShift Container Platform 不支持 FlexVolume 的 attach 和 detach 操作。

3.7.2. FlexVolume 驱动程序示例

FlexVolume 驱动程序的第一个命令行参数始终是一个操作名称。其他参数都针对于每个操作。大多数操作都使用 JSON 字符串作为参数。这个参数是一个完整的 JSON 字符串,而不是包括 JSON 数据的文件名称。

FlexVolume 驱动程序包含:

  • 所有 flexVolume.options
  • flexVolume 的一些选项带有 kubernetes.io/前缀 ,如 fsTypereadwrite
  • 如果使用 secret,secret 的内容带有 kubernetes.io/secret/ 前缀。

FlexVolume 驱动程序 JSON 输入示例

{
	"fooServer": "192.168.0.1:1234", 1
        "fooVolumeName": "bar",
	"kubernetes.io/fsType": "ext4", 2
	"kubernetes.io/readwrite": "ro", 3
	"kubernetes.io/secret/<key name>": "<key value>", 4
	"kubernetes.io/secret/<another key name>": "<another key value>",
}

1
flexVolume.options 中的所有选项。
2
flexVolume.fsType 的值。
3
基于 flexVolume.readOnlyro/rw
4
flexVolume.secretRef引用的 secret 的所有键及其值。

OpenShift Container Platform 需要有关驱动程序标准输出的 JSON 数据。如果没有指定,输出会描述操作的结果。

FlexVolume 驱动程序默认输出示例

{
	"status": "<Success/Failure/Not supported>",
	"message": "<Reason for success/failure>"
}

驱动程序的退出代码应该为 0(成功),或 1(失败) 。

操作应该是”幂等”的,这意味着挂载一个已被挂载的卷的结果是一个成功的操作。

3.7.3. 安装 FlexVolume 驱动程序

用于扩展 OpenShift Container Platform 的 FlexVolume 驱动程序仅在节点上执行。要实现 FlexVolume,需要调用的操作列表和安装路径都是必需的。

先决条件

  • FlexVolume 驱动程序必须实现以下操作:

    init

    初始化驱动程序。它会在初始化所有节点的过程中被调用。

    • 参数: 无
    • 执行于:节点
    • 预期输出:默认 JSON
    mount

    挂载一个卷到目录。这可包括挂载该卷所需的任何内容,包括查找该设备,然后挂载该设备。

    • 参数: <mount-dir> <json>
    • 执行于:节点
    • 预期输出:默认 JSON
    unmount

    从目录中卸载卷。这可以包括在卸载后清除卷所必需的任何内容。

    • 参数: <mount-dir>
    • 执行于:节点
    • 预期输出:默认 JSON
    mountdevice
    将卷的设备挂载到一个目录,然后 pod 可以从这个目录绑定挂载。

这个 call-out 不会传递 FlexVolume spec 中指定的 "secrets"。如果您的驱动需要 secret,不要实现这个 call-out。

  • 参数: <mount-dir> <json>
  • 执行于:节点
  • 预期输出:默认 JSON

    unmountdevice
    从目录中卸载卷的设备。
  • 参数: <mount-dir>
  • 执行于:节点
  • 预期输出:默认 JSON

    • 所有其他操作都应该返回带有 {"status":"Not supported"} 及退出代码 1 的 JSON。

流程

安装 FlexVolume 驱动程序:

  1. 确保可执行文件存在于集群中的所有节点上。
  2. 将可执行文件放在卷插件路径: /etc/kubernetes/kubelet-plugins/volume/exec/<vendor>~<driver>/<driver>

例如,要为存储 foo 安装 FlexVolume 驱动程序,请将可执行文件放在: /etc/kubernetes/kubelet-plugins/volume/exec/openshift.com~foo/foo

3.7.4. 使用 FlexVolume 驱动程序消耗存储

OpenShift Container Platform 中的每个 PersistentVolume 都代表存储后端中的一个存储资产,例如一个卷。

流程

  • 使用 PersistentVolume 对象来引用已安装的存储。

使用 FlexVolume 驱动程序示例定义持久性卷对象

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv0001 1
spec:
  capacity:
    storage: 1Gi 2
  accessModes:
    - ReadWriteOnce
  flexVolume:
    driver: openshift.com/foo 3
    fsType: "ext4" 4
    secretRef: foo-secret 5
    readOnly: true 6
    options: 7
      fooServer: 192.168.0.1:1234
      fooVolumeName: bar

1
卷的名称。这是如何通过持久性卷声明或从 pod 识别它。这个名称可以与后端存储中的卷的名称不同。
2
为这个卷分配的存储量。
3
驱动程序的名称。这个字段是必须的。
4
卷中的文件系统。这个字段是可选的。
5
对 secret 的引用。此 secret 中的键和值在调用时会提供给 FlexVolume 驱动程序。这个字段是可选的。
6
read-only 标记。这个字段是可选的。
7
FlexVolume 驱动程序的额外选项。除了用户在 options 字段中指定的标记外,以下标记还会传递给可执行文件:
"fsType":"<FS type>",
"readwrite":"<rw>",
"secret/key1":"<secret1>"
...
"secret/keyN":"<secretN>"
注意

secret 只会传递到 mount 或 unmount call-outs。