rbind 在本地卷挂载上的使用

rbind usage on local volume mounting

我有一个配置为由自动挂载程序管理的目录(如 here 所述)。我需要在多个 pods 中使用此目录(以及安装在其中的所有目录)作为本地持久卷。

我能够触发容器内的自动挂载程序,但在某些用例中,当容器启动时此目录不为空。这使得子目录显示为空并且无法触发自动挂载程序(在容器内)

我做了一些调查,发现当使用本地 PV 时,在源目录和由 kubelet 管理的一些内部目录之间有一个 mount -o bind 命令(this 是源代码中的行)。 我实际上需要的是使用 rbind(递归绑定 - here 是一个很好的解释)。

使用rbind还需要对卸载卷的部分进行一些更改(需要递归卸载)

我不想给 kubelet 打补丁并重新编译它..但是。 所以我的问题是:是否有一些官方方法可以为 Kubernetes 提供一些自定义 mounter/unmounter?

同时,我确实找到了这个 use-case 的解决方案。

基于 Kubernetes docs 有一个叫做 Out-Of-Tree Volume Plugins

的东西

The Out-of-tree volume plugins include the Container Storage Interface (CSI) and FlexVolume. They enable storage vendors to create custom storage plugins without adding them to the Kubernetes repository

即使鼓励使用 CSI,我还是选择 FlexVolume 来实现我的自定义驱动程序。 Here 是一个详细的文档。

这个驱动其实是一个py脚本,支持三个动作:init/mount/unmount(--rbind用来挂载automounter管理的那个目录,像this). It is deployed using a DaemonSet (docs here一样卸载它)

就是这样!