2.8. 使用 FlexVolume 的持久性存储
OpenShift Container Platform 支持 FlexVolume,这是一个树外插件,使用可执行模型与驱动程序进行接口。
要从没有内置插件的后端使用存储,您可以通过 FlexVolume 驱动程序来扩展 OpenShift Container Platform,并为应用程序提供持久性存储。
Pod 通过 flexvolume
树内插件与 FlexVolume 驱动程序交互。
其他参考资源
2.8.1. 关于 FlexVolume 驱动程序
FlexVolume 驱动程序是一个可执行文件,它位于集群中所有节点的一个明确定义的目录中。OpenShift Container Platform 会在需要挂载或卸载由带有 flexVolume
的 PersistentVolume
代表的卷时调用 FlexVolume 驱动程序。
OpenShift Container Platform 不支持 FlexVolume 的 attach 和 detach 操作。
2.8.2. FlexVolume 驱动程序示例
FlexVolume 驱动程序的第一个命令行参数始终是一个操作名称。其他参数都针对于每个操作。大多数操作都使用 JSON 字符串作为参数。这个参数是一个完整的 JSON 字符串,而不是包括 JSON 数据的文件名称。
FlexVolume 驱动程序包含:
-
所有
flexVolume.options
。 -
flexVolume
的一些选项带有kubernetes.io/
前缀 ,如fsType
和readwrite
。 -
如果使用 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>", }
OpenShift Container Platform 需要有关驱动程序标准输出的 JSON 数据。如果没有指定,输出会描述操作的结果。
FlexVolume 驱动程序默认输出示例
{ "status": "<Success/Failure/Not supported>", "message": "<Reason for success/failure>" }
驱动程序的退出代码应该为 0
(成功),或 1
(失败) 。
操作应该是”幂等”的,这意味着挂载一个已被挂载的卷的结果是一个成功的操作。
2.8.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 驱动程序:
- 确保可执行文件存在于集群中的所有节点上。
- 将可执行文件放在卷插件路径: /etc/kubernetes/kubelet-plugins/volume/exec/<vendor>~<driver>/<driver>。
例如,要为存储 foo
安装 FlexVolume 驱动程序,请将可执行文件放在: /etc/kubernetes/kubelet-plugins/volume/exec/openshift.com~foo/foo。
2.8.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。