21 K8S之容器存储接口CSI
存储卷管理器通过调用存储卷插件实现当前节点上存储卷相关的附加、分离、挂载/卸载等操作,对于未被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/目录所在的设备)聚集为存储集群,而后利用这些存储管理分布式、带有复制功能的块存储,且支持快照及数据备份操作。
Longhorn存储架构

3个Pod分别使用了一个Longhorn存储卷,每个卷有一个专用的控制器(Engine)资源和两个副本(Replica)资源,它们都是为了便于描述其应用而由Longhorn引入的自定义资源类型。