Flexvolume
Flexvolume的Volume Plugin只包含了一部分Flexvolume的实现代码,这部分代码只有Proxy功能和一些默认实现
AD Controller和Volume Manager调用Volume Plugins的接口时,接口只是把调用转到相应的Flexvolume的可被Kubelet驱动的可执行文件的命令行调用(因此Flexvolume不是一个常驻内存的守护进程);若Flexvolume中没有定义某个接口,就会调用默认实现。
![](https://img2020.cnblogs.com/blog/1424868/202106/1424868-20210618172546262-128331189.png)
下面是命令格式和调用的实例:
![](https://img2020.cnblogs.com/blog/1424868/202106/1424868-20210618172546583-1548925612.png)
Flexvolum包含以下接口:
-
init
主要做一些初始化的操作,比如部署插件、更新插件时的初始化操作
会返回DriveCapabilities类型的数据结构,用来说明Flexvolume插件有哪些功能
-
GetVolumeName
返回插件名
-
Attach:
挂载功能的实现
根据 --enable-controller-attach-detach标签来决定是由AD Controller还是 Kubelet来发起挂载操作
-
WaitforAttach:
Attach经常是异步操作,因此需要等待挂载完成,才能需要进行下面的操作
-
MountDevice、Setup
此处将mount分为MountDevice和SetUp两部分
MountDevice主要做一些简单的预处理工作,比如设备格式化、挂载到 GlobalMount目录中等
Setup使用Bind方式将GlobalPath中的设备挂载到Pod的本地目录
-
GetPath
获取每个Pod对应的本地挂载目录
-
TearDown、UnmountDevice、Detach
实现的是上面一些接口的逆过程
-
ExpandVolumeDevice
扩容存储卷,由Expand Controller发起调用
-
NodeExpand:
扩容文件系统,由Kubelet发起调用。
上面这些接口不一定需要全部实现,如果某个接口没有实现的话,可以按如下格式返回以告诉调用者没有实现这个接口:
{
"status": "Not supported",
"message": "error message"
}
Flexvolume的代码示例:![](https://img2020.cnblogs.com/blog/1424868/202106/1424868-20210618172546513-1415593455.png)
![](https://img2020.cnblogs.com/blog/1424868/202106/1424868-20210618172546513-1415593455.png)