什么是 Kubernetes CSI?

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是:

  1. 用户通过PVC请求存储卷。
  2. Kubernetes API调用外部存储端点,请求CSI插件进行存储分配。
  3. CSI插件连接存储系统并完成存储分配。
  4. CSI插件返回存储信息给Kubernetes。
  5. Kubernetes将PVC绑定到存储卷,生成PersistentVolume供Pod使用。

例如,我们可以部署一个NFS的CSI插件,将NFS存储接入Kubernetes。主要步骤是:

  1. 部署NFS服务,并导出共享存储。
  2. 部署CSI插件(以Deployment形式),连接NFS存储。
  3. 创建StorageClass,使用这个CSI插件的配置。
  4. 创建PVC,通过StorageClass动态分配NFS存储。
  5. Pod使用PVC创建的存储卷。

所以总结来说,CSI主要具有以下特点:

  1. 标准化接口:支持块存储、文件存储等不同类型的存储。
  2. 简单部署:以DaemonSet形式部署,节点只有一个Pod。
  3. 权限最小:以非root账号运行。
  4. 启用第三方存储:允许第三方存储系统开发CSI插件,与Kubernetes集成。