所属技术领域:
K8s
|名词定义|
FlexVolume 是 Kubernetes v1.8+ 支持的一种存储插件扩展方式。类似于 CNI 插件,它需要外部插件将二进制文件放到预先配置的路径中(如 /usr/libexec/kubernetes/kubelet-plugins/volume/exec/),并需要在系统中安装好所有需要的依赖。可以想到,这是一种out-tree的扩展方式,不需要新增加一种存储插件,去更改k8s的源码。
|技术特点|
Flexvolume的特点
1.Flexvolume实现了VolumePlugin的Attach/Detach/Mount/Unmount接口定义,这些接口由第三方实现,并按照一定规则调用接口。
2.Flexvolume是一个有Kubelet驱动的可执行文件,每一次接口调用均为一次可执行文件的命令行调用;不是常驻内存的守护进程;
3.调用Flexvolume的Stdout作为kubelet调用的返回结果,要求json格式
4.默认存放地址:/user/libexec/kubernetes/kubelet-plugins/volume/exec/alicloud~disk/disk
所有挂载均先将远程设备挂载到本地主机,然后从主机通过bind映射到容器内部
Felxvolume接口介绍
Flexvolume挂载分析
快存储需要Attach、格式化、Mount等操作,所以流程较长,步骤多;
MountDevice是Mount的一部分,执行一些公共操作:格式化、挂载device到GlobalPath等;
文件存储无需Attach操作,只需从远端mount到主机,流程要简单;
开发Flexvolume驱动的过程即为实现Flexvolume接口的过程,实现中通过调用OpenApi等方式挂载第三方存储设备。
Flexvolume代码示例
Flexvolume使用示例
Flexvolume存储卷的定义格式和其他In-Tree存储类型格式一致,区别在存储类型为Flexvolume;
Flexvolume参数定义:
driver:定义插件类型,会根据这个参数到某个目录下面找插件的可执行文件;
fsType:定义存储卷文件系统类型
options:为一个Map参数类型,可以定义所有与存储类型、挂载相关的具体参数
可以通过Selector、Label的方式,定向配置PV、PVC绑定管理;PV可以通过Label或者NodeAffinity配置调度信息;
Flexvolume 存储卷可以使用静态存储或者动态存储方式,动态存储卷需要在集群中部署Provisioner插件;下面例子可以看出:
EBS存储卷(ID d-wz9bkj7jhbb4jo77n1tz)先挂再到主机上,设备名为/dev/vdb舌v、v而u、设备名;
然后/dev/vdb挂载到一个全局目录;然后再挂载到Pod所在目录;
最后从Pod目录映射到Pod(容器)内部的/data目录
与kubelet 的关系
前面讲到自定义的存储插件是放到/usr/libexec/kubernetes/kubelet-plugins/volume/exec/下,具体目录是/usr/libexec/kubernetes/kubelet-plugins/volume/exec//。
在pod的spec中申明用到了你自定义的插件后,格式为 /,实际上是kubelet 按照接口规范去调用对应插件。
所以需要注意以下几点:
在debug的过程中,FlexVolume的日志需要在kubelet.log中查看
部署方式一般都是daemonset。这样可以保证每台node 都会存在自定义插件。
从k8s1.8 开始支持了动态插件发现,flexvolume支持动态检测驱动程序的功能。系统运行时,可以安装,升级/降级和卸载驱动程序,而不是在系统初始化时要求驱动程序存在或必须重新启动kubelet或控制器管理器。
|资料来源|
名词定义:https://studygolang.com/articles/23351
技术特点:https://studygolang.com/articles/23351