CSI(Container Storage Interface)

在这里插入图片描述

On the one hand

CSI (Container Storage Interface) is a standardized industry specification for exposing storage systems to container orchestrators such as Kubernetes. It allows storage vendors to develop their own CSI drivers, enabling seamless integration and management of storage resources within containerized environments.

CSI defines a set of APIs and interfaces that enable communication between the orchestrator and the storage system. This allows Kubernetes to dynamically provision and attach storage volumes to containers, making the storage management process more flexible and efficient.

The primary standard for CSI interfaces consists of four main components:

  1. Controller Service: Manages the life cycle of volumes, including creation, deletion, and resizing. It also handles volume topology and storage capabilities discovery.
  2. Node Service: Handles volume-related operations on nodes, such as attaching and detaching volumes, mounting and unmounting file systems, and performing snapshot operations.
  3. Identity Service: Provides identity information about the CSI driver, including its name and supported capabilities.
  4. Volume Migration: Allows the migration of volumes between different storage systems.

To implement CSI in Kubernetes, a CSI driver is required. The CSI driver is responsible for implementing the CSI specification and communicating with the storage system. It provides functionality to create, delete, and manage volumes, as well as handle volume attachment and detachment.

In Kubernetes, the CSIDriver resource object file is used to define the configuration for a CSI driver. This file specifies the driver name, the version of CSI specification it supports, and any required parameters for its deployment.

To use CSI on Kubernetes, the following generalized steps can be followed:

  1. Deploy the CSI driver: Install the CSI driver on the Kubernetes cluster. This involves deploying the driver’s container image and creating a corresponding CSIDriver resource object.
  2. Create StorageClass: Define a StorageClass object that specifies the desired storage parameters, such as the provisioner, reclaim policy, and volume attributes.
  3. Provision a PersistentVolumeClaim (PVC): Create a PVC object that references the desired StorageClass. This will trigger the dynamic provisioning of the required storage volume.
  4. Use the PersistentVolume (PV): Once the PVC is bound to a PV, it can be used by pods in the Kubernetes cluster. Mount the PV to the desired pod, and the storage volume will be available to the application running in the pod.
  5. Teardown and deletion: When no longer needed, delete the PVC or PV, and the CSI driver will handle the necessary operations for detaching and deleting the storage volume.

In conclusion, CSI provides a standardized interface for integrating storage systems with container orchestrators like Kubernetes. By following the general steps outlined above, users can easily provision, attach, and manage storage volumes within their Kubernetes environments using CSI drivers. This improves the flexibility and scalability of storage management in containerized applications.


On the other hand

CSI(Container Storage Interface)

CSI(Container Storage Interface)是一个为容器存储管理而设计的开放标准。它由CNCF(Cloud Native Computing Foundation)推动和维护,致力于提供一致且可扩展的接口,使不同的存储供应商能够轻松地集成和管理容器存储。

CSI的目标是解耦存储系统与容器运行时之间的依赖关系,以提供更大的灵活性和可插拔性。通过定义标准接口和协议,CSI允许存储供应商开发独立的CSI插件,以与容器运行时进行交互。这样一来,用户可以根据自己的需求选择适合的存储解决方案,而不受特定容器运行时的限制。

CSI定义了节点服务接口(Node Service Interface)和控制器服务接口(Controller Service Interface),用于处理与底层存储系统的交互。节点服务接口负责挂载和卸载容器卷、创建和删除快照等底层操作,而控制器服务接口用于管理存储卷的创建、删除和调整等高级操作。

通过CSI,存储供应商可以实现自己的CSI插件,并以标准接口与容器运行时进行集成。这种可插拔性使得用户可以根据自己的需求选择最适合的存储解决方案,并且避免了对特定容器运行时的依赖。

CSI接口的主要标准

下面是CSI接口的主要标准说明:

  1. 插件模型:CSI采用插件模型,将存储驱动与容器运行时解耦。这意味着不同的存储供应商可以独立开发和维护自己的CSI插件。
  2. 标准接口:CSI定义了多个标准接口,包括节点服务接口(Node Service Interface)和控制器服务接口(Controller Service Interface)。
  3. 节点服务接口:用于处理与底层节点(如宿主机)上的存储系统的交互,包括挂载和卸载容器卷、创建和删除快照等操作。
  4. 控制器服务接口:用于处理与存储控制器的交互,包括创建、删除和调整容器卷、创建和删除快照等操作。
  5. 接口定义语言(IDL):CSI使用Protocol Buffers作为接口定义语言,用于定义接口方法和数据结构。
  6. 异步和同步操作:CSI支持异步和同步操作。异步操作可提高效率和性能,而同步操作则提供了更直观的编程模型。
  7. 动态配置:CSI支持动态配置功能,使得存储供应商可以在运行时动态设置存储驱动的参数和属性。
  8. 多阶段操作:CSI支持多阶段操作,允许存储驱动在多个阶段处理操作请求,从而提供更复杂的存储管理功能。
  9. 事件通知:CSI定义了事件通知机制,用于向容器运行时发送存储相关的事件,如存储容量不足或快照创建完成等。

CSI标准的主要目标是实现与容器运行时的解耦和存储系统的可插拔性,同时提供一致且可扩展的接口,使得存储供应商可以轻松地与容器化环境集成。通过CSI,存储供应商能够为容器提供各种类型的存储解决方案,同时容器开发者和运维团队也能够更简便地管理和使用容器存储。

CSI驱动程序

  • kubectl get csidrivers

CSI驱动程序的作用是将底层存储系统的功能暴露给容器编排平台,使其能够管理存储资源的创建、删除、扩容等操作。CSI驱动程序必须实现一组标准的接口,以便容器编排平台可以与其进行交互。

CSI驱动程序通常由存储供应商或第三方开发者开发,并与特定的存储系统集成。其主要功能包括:

  1. Volume操作:实现在底层存储系统上创建、删除、扩容等卷操作。
  2. Snapshot操作:支持在底层存储系统上创建、删除、恢复快照。
  3. Storage Capacity操作:提供底层存储系统的存储容量信息。
  4. Node操作:与容器运行节点进行交互,包括挂载和卸载卷、获取节点信息等。
  5. Controller操作:与容器编排平台进行交互,包括卷的生命周期管理、提供控制器服务等。

通过CSI驱动程序,容器编排平台可以利用底层存储系统的各种功能,实现高效的存储资源管理和数据持久化。CSI规范的引入使得容器编排平台与存储系统之间的集成更加灵活和标准化,降低了不同平台和存储供应商之间的耦合度。

CSIDriver资源对象文件

Name:         nfs.csi.com
Namespace:  
Labels:       <none>
Annotations:  <none>
API Version:  storage.k8s.io/v1
Kind:         CSIDriver
Metadata:
  Creation Timestamp:  2023-03-28T10:20:45Z
  Managed Fields:
    API Version:  storage.k8s.io/v1beta1
    Fields Type:  FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          .:
          f:kubectl.kubernetes.io/last-applied-configuration:
      f:spec:
        f:attachRequired:
        f:fsGroupPolicy:
        f:podInfoOnMount:
        f:volumeLifecycleModes:
    Manager:         kubectl-client-side-apply
    Operation:       Update
    Time:            2023-03-28T10:20:45Z
  Resource Version:  242576
  UID:               6e5cfd19-5517-475a-bfae-70af863a1e69
Spec:
  Attach Required:    false
  Fs Group Policy:    ReadWriteOnceWithFSType
  Pod Info On Mount:  false
  Volume Lifecycle Modes:
    Persistent
Events:  <none>

CSIDriver资源对象文件描述

这是一个名为nfs.csi.com的CSIDriver资源对象文件。CSIDriver是Kubernetes中用来定义外部存储插件的对象,它为CSI(Container Storage Interface)驱动程序提供了一种在Kubernetes集群中使用外部存储提供商的方式。

该文件定义了以下属性:

  • Name: 指定了CSIDriver的名称为nfs.csi.com。
  • Creation Timestamp: CSIDriver对象的创建时间戳。
  • API Version: 指定了该对象使用的API版本为storage.k8s.io/v1。
  • Kind: 指定了该对象的种类为CSIDriver。
  • Spec: 定义了CSIDriver的配置规范,包含以下属性:
  • Attach Required: 表示是否需要在Pod挂载卷时进行挂载。在这个例子中,设置为false,表示不需要进行挂载。
  • Fs Group Policy: 指定了文件系统组策略。在这个例子中,设置为ReadWriteOnceWithFSType,表示读写一次性使用特定文件系统类型。
  • Pod Info On Mount: 指定了是否在挂载卷时将Pod信息附加到卷上。在这个例子中,设置为false,表示不需要附加Pod信息。
  • Volume Lifecycle Modes: 指定了卷的生命周期模式。在这个例子中,设置为Persistent,表示卷是持久的,保持一直存在。

除了这些属性,Metadata部分还包含了一些元数据信息,例如Creation Timestamp、Managed Fields等。

整体而言,这个文件定义了一个名为nfs.csi.com的CSIDriver对象,使用了特定的配置规范来定义该CSIDriver与外部存储插件的交互方式。

在K8s上使用CSI接口的一般化步骤

使用CSI(Container Storage Interface)接口在Kubernetes上进行存储管理,需要按照以下步骤进行操作:

  1. 确保Kubernetes集群已经安装和配置完成,并且CSI驱动程序已经被正确安装到节点上。CSI驱动程序通常由存储供应商提供。
  2. 创建CSI插件对象:在Kubernetes中创建一个CSI插件对象来配置CSI插件的信息。这个对象定义了插件的名称、版本和支持的存储功能。
  3. 创建CSI驱动程序:在Kubernetes中创建CSI驱动程序对象来描述将要使用的CSI插件。这个对象定义了CSI插件的名称、版本、插件的路径和节点的拓扑信息。
  4. 创建StorageClass对象:在Kubernetes中创建StorageClass对象来定义存储的规格(如容量、性能要求等)。StorageClass对象将会引用到先前创建的CSI驱动程序。
  5. 通过PersistentVolumeClaim(PVC)请求存储:在Kubernetes中创建一个PersistentVolumeClaim对象来请求存储。PVC对象将引用先前创建的StorageClass对象。
  6. Kubernetes将根据PVC对象中定义的StorageClass属性来选择和调度适合的PersistentVolume(PV)。
  7. 创建Pod对象并挂载存储:在Kubernetes中创建Pod对象,并在Pod的容器配置中通过VolumeMounts定义存储的挂载点。Pod对象将引用先前创建的PVC对象。
  8. 当Pod启动时,Kubernetes会自动创建一个持久卷(PersistentVolume)并挂载到Pod所在的节点上,然后Pod会从挂载的存储卷中读取或写入数据。
  9. 更新存储:如果需要更新存储(如扩容),可以通过更新StorageClass对象来实现。Kubernetes将自动应用这些更改并重新挂载存储。

总结起来,使用CSI接口在Kubernetes上进行存储管理的步骤涉及到创建CSI插件对象、创建CSI驱动程序对象、创建StorageClass对象、通过PVC请求存储、创建Pod并挂载存储。这些步骤会使Kubernetes集群能够与CSI插件进行交互,实现动态配置和管理存储。