简介(未完成)
Kubernetes存储方案发展过程概述
- 最开始是通过Volume Plugin实现集成外部存储系统,即不同的存储系统对应不同的Volume Plugin。Volume Plugin实现代码全都放在了Kubernetes主干代码中(in-tree),也就是说这些插件与核心Kubernetes二进制文件一起链接、编译、构建和发布。
- 从1.8开始,Kubernetes停止往Kubernetes代码中增加新的存储支持。从1.2开始,推出了一种新的插件形式支持外部存储系统,即FlexVolume。FlexVolume类似于CNI插件,通过外部脚本集成外部存储接口,这些脚本默认放在
/usr/libexec/kubernetes/kubelet-plugins/volume/exec/
,需要安装到所有Node节点上。 - 从1.9开始又引入了Container Storage Interface(CSI)容器存储接口
volume 插件设计
整体设计
CSI 插件体系的设计思想,就是把Dynamic Provision 阶段以及 Kubernetes 里的一部分存储管理功能(比如“Attach 阶段”和“Mount 阶段”,实际上是通过调用 CSI 插件来完成的),从主干代码里剥离出来,做成了几个单独的组件。这些组件会通过 Watch API 监听 Kubernetes 里与存储相关的事件变化,比如 PVC 的创建,来执行具体的存储管理动作。
CSI 的设计思想,把插件的职责从“两阶段处理”,扩展成了Provision、Attach 和 Mount 三个阶段。其中,Provision 等价于“创建磁盘”,Attach 等价于“挂载磁盘到虚拟机”,Mount 等价于“将该磁盘格式化后,挂载在 Volume 的宿主机目录上”。
一个 CSI 插件只有一个二进制文件,但它会以 gRPC 的方式对外提供三个服务(gRPC Service),分别叫作:CSI Identity、CSI Controller 和 CSI Node。
- Identity Service用于返回一些插件信息;
- Controller Service实现Volume的CURD操作;
- Node Service运行在所有的Node节点,用于实现把Volume挂载在当前Node节点的指定目录,该服务会监听一个Socket,controller通过这个Socket进行通信,可以参考官方提供的样例CSI Hostpath driver Sample[2]。