存储卷管理器通过调用存储卷插件实现当前节点上存储卷相关的附加、分离、挂载/卸载等操作,对于未被 Kubernetes 内置(In-Tree)的卷插件所支持的存储系统或服务来说,扩展定义新的卷插件是解决问题的唯一途径。但将存储供应商提供的第三方存储代码打包到 Kubernetes 的核心代码可能会导致可靠性及安全性方面的问题,因而这就需要一种简单、便捷的、外置于 Kubernetes 代码树(Out-Of-Tree)的扩展方式,FlexVolume 和 CSI(容器存储接口)就是这样的存储卷插件,它们自身是内置的存储卷插件,但实现的却是第三方存储卷的扩展接口。


FlexVolume 是 Kubernetes 自 v1.8 版本进入 GA(高可用)阶段的一种存储插件扩展方式,它要求将外部插件的二进制文件部署在预先配置的路径中(例如/usr/libexec/kubernetes/kubelet-plugins/volume/exec/),并设定系统环境满足其正常运行所需要的全部依赖关系。事实上,一个 FlexVolume 类型的插件就是一款可被 kubelet 驱动的可执行文件,它实现了特定存储的挂载、卸载等存储插件接口,而对该类插件的调用相当于请求运行该程序文件,并要求返回 JSON 格式的响应内容。


而自 Kubernetes 的 v1.13 版进入 GA 阶段的 CSI 是一种更加开放的存储卷插件接口标准,它独立于 Kubernetes,由 CSI 社区制定,可被 Mesos 和 CloudFoundry 等编排系统共同支持,而且能够以容器化形式部署,更加符合云原生的要义。除了允许第三方供应商外置实现存储插件之外,CSI 支持使用存储类、PV 和 PVC 等组件,因而它们与内置的存储卷插件具有一脉相承的功能和特性。


第三方需要提供的 CSI 组件主要是两个 CSI 存储卷驱动程序,一个是节点插件(Identity+Node),用于同 kubelet 交互实现存储卷的挂载和卸载等功能,另一个是自定义控制器(Identity+Controller),负责处理来自 API Server 的存储卷管理请求,例如创建和删除等,它的功能类似于控制器管理器中的 PV 控制器。


为了降低部署外部容器化的 CSI 卷驱动程序时的复杂度,Kubernetes 团队提供了一个以 Sidecar 容器运行的应用——Kubernetes CSI Helper,以辅助自动完成 UNIX Sock 套接字注册及 NodeID 的初始化。


Longhorn 是由 Rancher 实验室创建的一款云原生的、轻量级、可靠且易用的开源分布式块存储系统,后来由 CNCF 孵化。它借助 CSI 存储卷插件以外置的存储解决方案形式运行。Longhorn 遵循微服务的原则,利用容器将小型独立组件构建为分布式块存储,并使用编排工具来协调这些组件,从而形成弹性分布式系统。部署到 Kubernetes 集群上之后,Longhorn 会自动将集群中所有节点上可用的本地存储(默认为/var/lib/longhorn/目录所在的设备)聚集为存储集群,而后利用这些存储管理分布式、带有复制功能的块存储,且支持快照及数据备份操作。