9.容器存储接口(CSI)

容器存储接口(CSI)

容器存储接口(Container Storage Interface,简称CSICSI试图建立一个行业标准接口的规范,借助CSI容器编排系统(CO)可以将任意存储系统暴露给自己的容器工作负载。有关详细信息,请查看设计方案

csi 卷类型是一种out-tree(即跟其它存储插件在同一个代码路径下,随Kubernetes的代码同时编译的) 的CSI卷插件,用于Pod与在同一节点上运行的外部CSI卷驱动程序交互。部署CSI兼容卷驱动后,用户可以使用 csi 作为卷类型来挂载驱动提供的存储。

CSI持久化卷支持是在Kubernetes v1.9中引入的,作为一个alpha特性,必须由集群管理员明确启用。换句话说,集群管理员需要在apiservercontroller-managerkubelet组件的 “--feature-gates =” 标志中加上 “CSIPersistentVolume = true”。

CSI持久化卷具有以下字段可供用户指定:

  • driver:一个字符串值,指定要使用的卷驱动程序的名称。必须少于63个字符,并以一个字符开头。驱动程序名称可以包含 ““ - ”“_” 或数字。
  • volumeHandle:一个字符串值,唯一标识从CSI卷插件的 CreateVolume 调用返回的卷名。随后在卷驱动程序的所有后续调用中使用卷句柄来引用该卷。
  • readOnly:一个可选的布尔值,指示卷是否被发布为只读。默认是false

使用说明

下面将介绍如何使用CSI

动态配置

可以通过为CSI创建插件 StorageClass 来支持动态配置的CSI Storage插件启用自动创建/删除 。

例如,以下 StorageClass 允许通过名为 com.example.team/csi-driverCSI Volume Plugin动态创建 “fast-storage” Volume。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: fast-storage
provisioner: com.example.team/csi-driver
parameters:
  type: pd-ssd

要触发动态配置,请创建一个 PersistentVolumeClaim 对象。例如,下面的PersistentVolumeClaim可以使用上面的StorageClass触发动态配置。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-request-for-storage
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  storageClassName: fast-storage

当动态创建Volume时,通过CreateVolume调用,将参数 type:pd-ssd 传递给CSI插件 com.example.team/csi-driver 。作为响应,外部Volume插件会创建一个新Volume,然后自动创建一个 PersistentVolume 对象来对应前面的PVC 。然后,Kubernetes会将新的 PersistentVolume 对象绑定到 PersistentVolumeClaim,使其可以使用。

如果fast-storageStorageClass被标记为默认值,则不需要在 PersistentVolumeClaim 中包含StorageClassName,它将被默认使用。

预配置Volume

您可以通过手动创建一个 PersistentVolume 对象来展示现有Volumes,从而在Kubernetes中暴露预先存在的Volume。例如,暴露属于 com.example.team/csi-driver 这个CSI插件的 existingVolumeName Volume

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-manually-created-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  csi:
    driver: com.example.team/csi-driver
    volumeHandle: existingVolumeName
    readOnly: false

附着和挂载

您可以在任何的pod或者podtemplate中引用绑定到CSI volume上的 PersistentVolumeClaim

kind: Pod
apiVersion: v1
metadata:
  name: my-pod
spec:
  containers:
    - name: my-frontend
      image: dockerfile/nginx
      volumeMounts:
        - mountPath: "/var/www/html"
          name: my-csi-volume
  volumes:
    - name: my-csi-volume
      persistentVolumeClaim:
        claimName: my-request-for-storage

当一个引用了CSI Volumepod被调度时, Kubernetes将针对外部CSI插件进行相应的操作,以确保特定的Volumeattached、mounted, 并且能被pod中的容器使用。

关于CSI实现的详细信息请参考设计文档

创建CSI驱动

Kubernetes尽可能少地指定CSI Volume驱动程序的打包和部署规范。这里记录了在Kubernetes上部署CSI Volume驱动程序的最低要求。

最低要求文件还包含概述部分,提供了在Kubernetes上部署任意容器化CSI驱动程序的建议机制。存储提供商可以运用这个机制来简化Kubernetes上容器式CSI兼容Volume驱动程序的部署。

作为推荐部署的一部分,Kubernetes团队提供以下sidecar(辅助)容器:

  • External-attacher

    可监听Kubernetes VolumeAttachment对象并触发ControllerPublishControllerUnPublish操作的sidecar容器,通过CSI endpoint触发 ;

  • External-provisioner

    监听Kubernetes PersistentVolumeClaim对象的sidecar容器,并触发对CSI端点的CreateVolumeDeleteVolume操作;

  • Driver-registrar(DEPRECATED)

    使用Kubelet(将来)注册CSI驱动程序的sidecar容器,并将 NodeId (通过 GetNodeID 调用检索到CSI endpoint)添加到Kubernetes Node API对象的annotation里面。

  • Cluster Driver Registrar

    创建CSIDriver这个集群范围的CRD对象。

  • Node Driver Registrar

    替代Driver-registrar

存储供应商完全可以使用这些组件来为其插件构建Kubernetes Deployment,同时让它们的CSI驱动程序完全意识不到Kubernetes的存在。

另外CSI驱动完全是由第三方存储供应商自己维护的,在kubernetes 1.9版本中CSI还处于alpha版本。

参考

上一页