为Kubernetes引入容器存储接口(CSI)Alpha

Kubernetes的主要区别之一是强大的功能。 批量插件系统 使许多不同类型的存储系统能够:

  1. 必要时自动创建存储。
  2. 使存储对计划的任何位置的容器可用。
  3. 不再需要时自动删除存储。 但是,向Kubernetes添加对新存储系统的支持一直是一个挑战。

Kubernetes 1.9引入了 容器存储接口(CSI)的alpha实施 这使得安装新的批量插件就像部署Pod一样容易。它还使第三方存储提供商可以开发解决方案,而无需添加到核心Kubernetes代码库。

由于此功能在1.9中为alpha,因此必须明确启用它。不建议将Alpha功能用于生产用途,但可以很好地表明项目的发展方向(在这种情况下,朝着更可扩展和基于标准的Kubernetes存储生态系统发展)。

为什么选择Kubernetes CSI?

Kubernetes批量插件目前处于“树中”状态,这意味着它们是与核心kubernetes二进制文件链接,编译,构建和交付的。向Kubernetes(卷插件)添加对新存储系统的支持需要将代码检入核心Kubernetes存储库中。但是,与Kubernetes发行过程保持一致对于许多插件开发人员来说是痛苦的。

现有的 Flex Volume插件 尝试通过为外部卷插件公开基于exec的API来解决此难题。尽管它使第三方存储供应商可以在树外编写驱动程序,但是为了部署第三方驱动程序文件,它需要访问节点和主计算机的根文件系统。

除了难以部署之外,Flex并没有解决插件依赖的痛苦:卷插件往往具有许多外部需求(例如,在安装和文件系统工具上)。假定这些依赖关系在底层主机OS上通常是不可用的(安装它们需要访问节点计算机的根文件系统)。

CSI通过使存储插件可以在树外开发,通过标准Kubernetes原语进行容器化,部署以及通过用户了解和喜爱的Kubernetes存储原语(PersistentVolumeClaims,PersistentVolumes,StorageClasses)来使用来解决所有这些问题。

什么是CSI?

CSI的目标是为容器编排系统(CO)建立标准化机制,以将任意存储系统暴露于其容器化工作负载。 CSI规范源自各种容器编排系统(CO)的社区成员之间的合作,包括Kubernetes,Mesos,Docker和Cloud Foundry。该规范是独立于Kubernetes制定的,并保持在 //github.com/container-storage-interface/spec/blob/master/spec.md.

Kubernetes v1.9公开了CSI规范的alpha实现,使CSI兼容的卷驱动程序可以部署在Kubernetes上并由Kubernetes工作负载使用。

如何在Kubernetes群集上部署CSI驱动程序?

CSI插件作者将提供自己的说明,以在Kubernetes上部署其插件。

如何使用CSI卷?

假设CSI存储插件已经部署在您的集群上,则可以通过熟悉的Kubernetes存储原语(PersistentVolumeClaims,PersistentVolumes和StorageClasses)使用它。

CSI是Kubernetes v1.9中的alpha功能。要启用它,请设置以下标志:

CSI是Kubernetes v1.9中的alpha功能。要启用它,请设置以下标志:

API server binary:
--feature-gates=CSIPersistentVolume=true
--runtime-config=storage.k8s.io/v1alpha1=true
API server binary 和  kubelet binaries:
--feature-gates=MountPropagation=true
--allow-privileged=true

动态预配

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

例如,以下StorageClass允许通过名为“ com.example.team/csi-driver”的CSI卷插件动态创建“快速存储”卷。

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

调用卷配置时,参数“ type:pd-ssd”通过“ CreateVolume”调用传递到CSI插件“ com.example.team/csi-driver”。作为响应,外部卷插件会预配一个新卷,然后自动创建一个PersistentVolume对象来表示新卷。然后Kubernetes将新的PersistentVolume对象绑定到PersistentVolumeClaim,使其可以使用。

如果将“快速存储” StorageClass标记为默认,则不需要在PersistentVolumeClaim中包含storageClassName,它将默认使用。

预先配置的卷

您始终可以通过手动创建一个PersistentVolume对象来表示现有卷,从而在Kubernetes中公开一个预先存在的卷。例如,以下PersistentVolume公开了名称为“ existingVolumeName”的卷,该卷属于名为“ com.example.team/csi-driver”的CSI存储插件。

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或Pod模板中的CSI卷的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卷的Pod时,Kubernetes将针对外部CSI插件(ControllerPublishVolume,NodePublishVolume等)触发适当的操作,以确保指定的卷已附加,安装并可以由Pod中的容器使用。

有关更多详细信息,请参阅CSI实现。 设计文件文件资料.

如何创建CSI驱动程序?

Kubernetes对CSI Volume Driver的打包和部署的说明最少。记录了在Kubernetes上部署CSI Volume Driver的最低要求 这里.

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

作为建议的部署过程的一部分,Kubernetes团队提供了以下补充工具(帮助器)容器:

  • 外部附件

    • 监视Kubernetes VolumeAttachment对象并针对CSI端点触发ControllerPublish和ControllerUnpublish操作的Sidecar容器。
  • 外部供应商

    • 监视Kubernetes PersistentVolumeClaim对象并针对CSI端点触发CreateVolume和DeleteVolume操作的Sidecar容器。
  • 司机登记员

    • Sidecar容器,用于向kubelet注册CSI驱动程序(将来),并将驱动程序自定义NodeId(通过针对CSI端点的GetNodeID调用进行检索)添加到Kubernetes节点API对象上的注释中

存储供应商可以使用这些组件为其插件构建Kubernetes部署,同时使CSI驱动程序完全不了解Kubernetes。

在哪里可以找到CSI驱动程序?

CSI驱动程序由第三方开发和维护。您可以找到示例CSI驱动程序 这里,但这些纯粹是出于说明目的而提供的,并不打算用于生产工作负载。

那Flex呢?

Flex Volume插件 作为一种基于exec的机制存在,可以创建“树外”批量插件。尽管有一些缺点(如上所述),但Flex卷插件与新的CSI Volume插件共存。 SIG存储将继续维护Flex API,以便现有的第三方Flex驱动程序(已部署在生产集群中)继续运行。将来,新的卷功能将仅添加到CSI,而不是Flex。

树内卷插件会发生什么?

CSI达到稳定后,我们计划将大多数树内卷插件迁移到CSI。随着Kubernetes CSI实施趋于稳定,请继续关注更多细节。

alpha的局限性是什么?

CSI的alpha实施具有以下限制:

  • 不支持CreateVolume,NodePublishVolume和ControllerPublishVolume调用中的凭据字段。
  • 不支持块卷;仅文件。
  • 不支持指定文件系统,默认为ext4。
  • CSI驱动程序必须与提供的“外部附件”一起部署,即使它们未实现“ ControllerPublishVolume”。
  • CSI卷不支持Kubernetes调度程序拓扑感知:总之,共享有关在何处配置卷(区域,区域等)的信息,以允许k8s调度程序做出更明智的调度决策。

下一步是什么?

根据反馈和采用情况,Kubernetes团队计划将CSI实施从1.10或1.11推向beta。

我如何参与其中?

与所有Kubernetes一样,该项目是来自不同背景的许多贡献者共同努力的结果。非常感谢Vladimir Vivien(弗拉基米尔),JanŠafránek(沙弗拉恩),查克拉瓦尔西·内鲁里(Chakri-Nelluri),布拉德利·查尔兹(小孩),路易斯·潘邦(pa)和Saad Ali(萨阿里)在Kubernetes中为使CSI变为现实所做的不懈努力。

如果您有兴趣参与CSI或Kubernetes Storage System的任何部分的设计和开发,请加入 Kubernetes存储特殊兴趣组 (SIG)。我们正在迅速发展,并随时欢迎新的贡献者。