CSI(Container Storage Interface)是 Kubernetes 中定义的存储接口规范。它允许第三方存储提供商开发自定义的存储插件与 Kubernetes 集成。
在 CSI 接口出现之前,Kubernetes 存储的接入主要依赖于:
- 内置的Volume插件:如emptyDir、hostPath等。
- FlexVolume插件:第三方存储提供商开发FlexVolume插件与Kubernetes集成。
但FlexVolume存在以下问题:
- 部署方式复杂,需要在每个节点安装且版本对应。
- 权限问题,需要以root权限运行。
- 不支持块存储、文件存储的统一接口。
CSI接口的目的是解决FlexVolume的这些问题,它具有以下特点:
- 标准化接口:定义统一的接口规范以支持不同类型的存储,如块存储、文件存储等。
- 启用第三方存储:允许第三方存储系统开发自己的CSI插件与Kubernetes集成。
- 简单部署:以DaemonSet在每个节点上只部署一个Pod,避免了FlexVolume在每个节点都需要安装的问题。
- 权限问题最小:CSI插件以非root账户运行,避免了FlexVolume的权限问题。
CSI包含两个重要组件:
- CSI插件:由存储供应商开发,运行在Kubernetes集群的节点上,负责与存储系统交互。
- 外部存储端点:提供与CSI插件交互的接口,由Kubernetes API服务器暴露。
CSI的Workflow是:
- 用户通过PVC请求存储卷。
- Kubernetes API调用外部存储端点,请求CSI插件进行存储分配。
- CSI插件连接存储系统并完成存储分配。
- CSI插件返回存储信息给Kubernetes。
- Kubernetes将PVC绑定到存储卷,生成PersistentVolume供Pod使用。
例如,我们可以部署一个NFS的CSI插件,将NFS存储接入Kubernetes。主要步骤是:
- 部署NFS服务,并导出共享存储。
- 部署CSI插件(以Deployment形式),连接NFS存储。
- 创建StorageClass,使用这个CSI插件的配置。
- 创建PVC,通过StorageClass动态分配NFS存储。
- Pod使用PVC创建的存储卷。
所以总结来说,CSI主要具有以下特点:
- 标准化接口:支持块存储、文件存储等不同类型的存储。
- 简单部署:以DaemonSet形式部署,节点只有一个Pod。
- 权限最小:以非root账号运行。
- 启用第三方存储:允许第三方存储系统开发CSI插件,与Kubernetes集成。