27.12.2. FlexVolume 驱动程序
FlexVolume 驱动程序是一个可执行文件,它位于集群中的所有机器上(master 和节点)上明确定义的目录中。OpenShift Container Platform 会在需要附加、分离、挂载或卸载由带有 flexVolume
的 PersistentVolume
代表的卷时调用 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
(失败) 。
操作应该是幂等的,这意味着附加已附加的卷或已挂载的卷的挂载应该可以成功操作。
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
操作在节点上找到该设备。-
参数: <
;json>
<node-name>
- 执行于:master
预期输出:默认 JSON +
设备
(如果已知):{ "status": "Success", "message": "", "device": "/dev/xvda" 1 }
- 1
- 如果已知,则节点上的设备名称。
-
参数: <
waitforattach
等待卷完全附加到节点及其设备发生。如果前面的
附加
操作返回了 <device-name
>,它将作为输入参数提供。否则,<device-name
> 为空,操作必须查找节点上的设备。-
参数: <
;device-name> <
;json>
- 执行于:节点
预期输出:默认 JSON +
设备
{ "status": "Success", "message": "", "device": "/dev/xvda" 1 }
- 1
- 节点上的设备名称。
-
参数: <
detach
将给定卷从节点分离。
<volume-name>
是getvolumename
操作返回的设备名称。<volume-name
> 中的任何/
字符将自动替换为~
。-
参数: <
;volume-name> &
lt;node-name>
- 执行于:master
- 预期输出:默认 JSON
-
参数: <
isattached
检查卷是否已附加到节点。
-
参数: <
;json>
<node-name>
- 执行于:master
预期输出:
附加
默认 JSON +{ "status": "Success", "message": "", "attached": true 1 }
- 1
- 将卷的状态附加到节点。
-
参数: <
mountdevice
将卷的设备挂载到目录。
<device-name>
是上一个waitforattach
操作返回的设备名称。-
参数: <
;mount-dir> <
;device-name> <
;json>
- 执行于:节点
- 预期输出:默认 JSON
-
参数: <
unmountdevice
从目录中卸载卷的设备。
-
参数:
<mount-dir>
- 执行于:节点
-
参数:
所有其他操作都应该返回带有 {"status"的 JSON:"不支持"}
和退出代码 1
。
master 启动的 attach/detach 操作会被默认启用。如果没有启用,则附加/组操作由卷应该附加到或从中分离的节点启动。在这两种情况下,Flex 驱动程序调用的语法和所有参数都相同。