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 驱动程序调用的语法和所有参数都相同。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.