容器存储接口(Container Storage Interface),简称 CSI,CSI 试图建立一个行业标准接口的规范,借助 CSI 容器编排系统(CO)可以将任意存储系统暴露给自己的容器工作负载。有关详细信息,请查看设计方案。
csi
卷类型是一种 out-tree(即跟其它存储插件在同一个代码路径下,随 Kubernetes 的代码同时编译的)的 CSI 卷插件,用于 Pod 与在同一节点上运行的外部 CSI 卷驱动程序交互。部署 CSI 兼容卷驱动后,用户可以使用 csi
作为卷类型来挂载驱动提供的存储。
CSI 持久化卷支持是在 Kubernetes v1.9 中引入的,作为一个 alpha 特性,必须由集群管理员明确启用。换句话说,集群管理员需要在 apiserver、controller-manager 和 kubelet 组件的“--feature-gates =
”标志中加上“CSIPersistentVolume = true
”。
CSI 持久化卷具有以下字段可供用户指定:
driver
:一个字符串值,指定要使用的卷驱动程序的名称。必须少于 63 个字符,并以一个字符开头。驱动程序名称可以包含“。”、“ - ”、“_”或数字。volumeHandle
:一个字符串值,唯一标识从 CSI 卷插件的CreateVolume
调用返回的卷名。随后在卷驱动程序的所有后续调用中使用卷句柄来引用该卷。readOnly
:一个可选的布尔值,指示卷是否被发布为只读。默认是 false。
使用说明
下面将介绍如何使用 CSI。
动态配置
可以通过为 CSI 创建插件 StorageClass
来支持动态配置的 CSI Storage 插件启用自动创建/删除。
例如,以下 StorageClass
允许通过名为 com.example.team/csi-driver
的 CSI 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-storage
StorageClass 被标记为默认值,则不需要在 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 或者 pod 的 template 中引用绑定到 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 Volume 的 pod 被调度时,Kubernetes 将针对外部 CSI 插件进行相应的操作,以确保特定的 Volume 被 attached、mounted,并且能被 pod 中的容器使用。
关于 CSI 实现的详细信息请参考设计文档。
创建 CSI 驱动
Kubernetes 尽可能少地指定 CSI Volume 驱动程序的打包和部署规范。这里记录了在 Kubernetes 上部署 CSI Volume 驱动程序的最低要求。
最低要求文件还包含概述部分,提供了在 Kubernetes 上部署任意容器化 CSI 驱动程序的建议机制。存储提供商可以运用这个机制来简化 Kubernetes 上容器式 CSI 兼容 Volume 驱动程序的部署。
作为推荐部署的一部分,Kubernetes 团队提供以下 sidecar(辅助)容器:
-
可监听 Kubernetes VolumeAttachment 对象并触发 ControllerPublish 和 ControllerUnPublish 操作的 sidecar 容器,通过 CSI endpoint 触发;
-
监听 Kubernetes PersistentVolumeClaim 对象的 sidecar 容器,并触发对 CSI 端点的 CreateVolume 和 DeleteVolume 操作;
-
Driver-registrar(DEPRECATED)
使用 Kubelet(将来)注册 CSI 驱动程序的 sidecar 容器,并将
NodeId
(通过GetNodeID
调用检索到 CSI endpoint)添加到 Kubernetes Node API 对象的 annotation 里面。 -
创建 CSIDriver 这个集群范围的 CRD 对象。
-
替代 Driver-registrar。
存储供应商完全可以使用这些组件来为其插件构建 Kubernetes Deployment,同时让它们的 CSI 驱动程序完全意识不到 Kubernetes 的存在。
另外 CSI 驱动完全是由第三方存储供应商自己维护的,在 kubernetes 1.9 版本中 CSI 还处于 alpha 版本。