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 输入示例
OpenShift Container Platform 需要有关驱动程序标准输出的 JSON 数据。如果没有指定,输出会描述操作的结果。
FlexVolume 驱动程序默认输出
{
"status": "<Success/Failure/Not supported>",
"message": "<Reason for success/failure>"
}
{
"status": "<Success/Failure/Not supported>",
"message": "<Reason for success/failure>"
}
驱动程序的退出代码应该为 0(成功),或 1(失败) 。
操作应该是幂等的,这意味着附加已附加的卷或已挂载的卷的挂载应该可以成功操作。
FlexVolume 驱动程序以两种模式工作:
OpenShift Container Platform master 使用 attach/detach 操作将卷附加到节点,并从节点分离它。当节点因任何原因而变得无响应时,这很有用。然后,master 可以终止节点上的所有 pod,将所有卷从它分离,并将卷附加到其他节点来恢复应用程序,同时仍可访问原始节点。
并非所有存储后端都支持从另一台机器执行卷的主发起断开。
支持由 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" }{ "status": "Success", "message": "", "volumeName": "foo-volume-bar"1 }Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 存储后端
foo中卷的唯一名称。
-
参数:
attach将 JSON 代表的卷附加到给定节点。此操作应返回节点上设备名称(如果已知),即,如果在运行之前由存储后端分配了该设备。如果设备未知,则必须通过后续
waitforattach操作在节点上找到该设备。-
参数: <
;json><node-name> - 执行于:master
预期输出:默认 JSON +
设备(如果已知):{ "status": "Success", "message": "", "device": "/dev/xvda" }{ "status": "Success", "message": "", "device": "/dev/xvda"1 }Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 如果已知,则节点上的设备名称。
-
参数: <
waitforattach等待卷完全附加到节点及其设备发生。如果前面的
附加操作返回了 <device-name>,它将作为输入参数提供。否则,<device-name> 为空,操作必须查找节点上的设备。-
参数: <
;device-name> <json> - 执行于:节点
预期输出:默认 JSON +
设备{ "status": "Success", "message": "", "device": "/dev/xvda" }{ "status": "Success", "message": "", "device": "/dev/xvda"1 }Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 节点上的设备名称。
-
参数: <
detach将给定卷从节点分离。
<volume-name>是getvolumename操作返回的设备名称。<volume-name> 中的任何/字符将自动替换为~。-
参数: <
;volume-name> <node-name> - 执行于:master
- 预期输出:默认 JSON
-
参数: <
isattached检查卷是否已附加到节点。
-
参数: <
;json><node-name> - 执行于:master
预期输出:
附加默认 JSON +{ "status": "Success", "message": "", "attached": true }{ "status": "Success", "message": "", "attached": true1 }Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将卷的状态附加到节点。
-
参数: <
mountdevice将卷的设备挂载到目录。
<device-name>是上一个waitforattach操作返回的设备名称。-
参数: <
;mount-dir> <device-name> <json> - 执行于:节点
- 预期输出:默认 JSON
-
参数: <
unmountdevice从目录中卸载卷的设备。
-
参数:
<mount-dir> - 执行于:节点
-
参数:
所有其他操作都应该返回带有 {"status"的 JSON:"不支持"} 和退出代码 1。
master 启动的 attach/detach 操作会被默认启用。如果没有启用,则附加/组操作由卷应该附加到或从中分离的节点启动。在这两种情况下,Flex 驱动程序调用的语法和所有参数都相同。