什么是存储插件:
容器一旦被删除,在运行时容器内部产生的所有文件数据,也会随同容器销毁而一起被清理掉,所以提供了volume方式将容器产生的临时数据持久化保存下来。
在k8s中,可通过pod.spec.volumes属性,查看默认支持的各种类型的Volume:本地存储(emptyDir / hostPath)、网络存储(如NFS)等。
k8s还提供了插件机制,允许其他类型的外部存储服务以插件方式,接入到Kubernetes系统中来。
有两种接入方式:In-Tree(在k8s源码内部实现,随k8s一起发布,更新慢不灵活) 和 Out-Of-Tree(独立于k8s,目前主要有CSI和FlexVolume两种,CSI为主流)。
存储插件的功能,最终是为应用创建出对应的volume使用。
FlexVolume插件
Flexvolume方式:需要先在每个节点上,安装存储插件的执行脚本(或可执行文件),此脚本需要实现flexvolume的相关存储接口。
当运行一个POD应用,要执行mount动作时,k8s通过kubelet调用VolumePlugin,然后直接执行插件脚本来完成的,这个插件脚本可以是shell,也可以是二进制文件,只要实现了相关的存储接口功能就行。
插件执行脚本的默认存放路径为:/usr/libexec/kubernetes/kubelet-plugins/volume/exec/<vendor~driver>/<driver>
路径中vendor~driver名称,与Pod中flexVolume.driver字段值要匹配,如foo~cifs/cifs,对应pod的driver名称就是foo/cifs。
存储接口包括:
init: 初始化存储插件时调用
attach: 将存储卷挂载到Node节点上
detach: 将存储卷从Node上卸载
waitforattach: 等待attach操作成功
isattached: 检查存储卷是否已经挂载
mountdevice: 将设备挂载到指定目录中
unmountdevice: 将设备取消挂载
mount: 将存储卷挂载到指定目录中
unmount: 将存储卷取消挂载
类似NFS存储服务,无需实现 attach/detach 这些接口,只需要实现 init/mount/umount 这三个接口即可。
执行脚本中,实现这些接口,需要返回如下json数据:
{
"status": "<Success/Failure/Not supported>",
"message": "<Reason for success/failure>",
"device": "<Path to the device attached. This field is valid only for attach & waitforattach call-outs>"
"volumeName": "<Cluster wide unique name of the volume. Valid only for getvolumename call-out>"
"attached": <True/False (Return true if volume is attached on the node. Valid only for isattached call-out)>
"capabilities": <Only included as part of the Init response>
{
"attach": <True/False (