Red Hat Training

A Red Hat training course is available for OpenShift Container Platform

27.12.2. FlexVolume 驱动程序

FlexVolume 驱动程序是一个可执行文件,它位于集群中的所有机器上(master 和节点)上明确定义的目录中。OpenShift Container Platform 会在需要附加、分离、挂载或卸载由带有 flexVolumePersistentVolume 代表的卷时调用 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(失败) 。

操作应该是幂等的,这意味着附加已附加的卷或已挂载的卷的挂载应该可以成功操作。

FlexVolume 驱动程序以两种模式工作:

OpenShift Container Platform master 使用 attach/detach 操作将卷附加到节点,并从节点分离它。当节点因任何原因而变得无响应时,这很有用。然后,master 可以终止节点上的所有 pod,将所有卷从它分离,并将卷附加到其他节点来恢复应用程序,同时仍可访问原始节点。

重要

并非所有存储后端都支持从另一台机器执行卷的主发起断开。

27.12.2.1. 带有 master-initiated attach/detach 的 FlexVolume 驱动程序

支持由 master 控制的 attach/detach 的 FlexVolume 驱动程序必须实现以下操作:

init

初始化驱动程序。它在 master 和节点初始化过程中被调用。

  • 参数: 无
  • 执行于:master、node
  • 预期输出:默认 JSON
getvolumename

返回卷的唯一名称。此名称在所有 master 和节点上都一致,因为它在后续的 detach 调用中使用为 < volume-name>。< volume-name > 中的任何 / 字符将自动替换为 ~

  • 参数:<json>
  • 执行于:master、node
  • 预期输出: 默认 JSON + volumeName

    {
    	"status": "Success",
    	"message": "",
    	"volumeName": "foo-volume-bar" 1
    }
    1
    存储后端 foo 中卷的唯一名称。
attach

将 JSON 代表的卷附加到给定节点。此操作应返回节点上设备名称(如果已知),即,如果在运行之前由存储后端分配了该设备。如果设备未知,则必须通过后续 waitforattach 操作在节点上找到该设备。

  • 参数: &lt ;json> <node-name>
  • 执行于:master
  • 预期输出:默认 JSON + 设备 (如果已知):

    {
    	"status": "Success",
    	"message": "",
    	"device": "/dev/xvda" 1
    }
    1
    如果已知,则节点上的设备名称。
waitforattach

等待卷完全附加到节点及其设备发生。如果前面的 附加 操作返回了 &lt ;device-name >,它将作为输入参数提供。否则,<device-name > 为空,操作必须查找节点上的设备。

  • 参数: &lt ;device-name> &lt ;json>
  • 执行于:节点
  • 预期输出:默认 JSON + 设备

    {
    	"status": "Success",
    	"message": "",
    	"device": "/dev/xvda" 1
    }
    1
    节点上的设备名称。
detach

将给定卷从节点分离。<volume-name>getvolumename 操作返回的设备名称。< volume-name > 中的任何 / 字符将自动替换为 ~

  • 参数: &lt ;volume-name> & lt;node-name>
  • 执行于:master
  • 预期输出:默认 JSON
isattached

检查卷是否已附加到节点。

  • 参数: &lt ;json> <node-name>
  • 执行于:master
  • 预期输出: 附加默认 JSON +

    {
    	"status": "Success",
    	"message": "",
    	"attached": true 1
    }
    1
    将卷的状态附加到节点。
mountdevice

将卷的设备挂载到目录。<device-name> 是上一个 waitforattach 操作返回的设备名称。

  • 参数: &lt ;mount-dir> &lt ;device-name> &lt ;json>
  • 执行于:节点
  • 预期输出:默认 JSON
unmountdevice

从目录中卸载卷的设备。

  • 参数: <mount-dir>
  • 执行于:节点

所有其他操作都应该返回带有 {"status"的 JSON:"不支持"} 和退出代码 1

注意

master 启动的 attach/detach 操作会被默认启用。如果没有启用,则附加/组操作由卷应该附加到或从中分离的节点启动。在这两种情况下,Flex 驱动程序调用的语法和所有参数都相同。