kubernetes-handbook/concepts/csi.md

130 lines
6.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# CSI - Container Storage Interface容器存储接口
CSI 代表[容器存储接口](https://github.com/container-storage-interface/spec/blob/master/spec.md)CSI 试图建立一个行业标准接口的规范,借助 CSI 容器编排系统CO可以将任意存储系统暴露给自己的容器工作负载。有关详细信息请查看[设计方案](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/storage/container-storage-interface.md)。
`csi` 卷类型是一种 in-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。
```yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: fast-storage
provisioner: com.example.team/csi-driver
parameters:
type: pd-ssd
```
要触发动态配置,请创建一个 `PersistentVolumeClaim` 对象。例如,下面的 PersistentVolumeClaim 可以使用上面的 StorageClass 触发动态配置。
```yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-request-for-storage
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: fast-storage
```
当动态创建 Volume 时,通过 CreateVolume 调用,将参数 `typepd-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`
```yaml
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`
```yaml
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 实现的详细信息请参考[设计文档](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/storage/container-storage-interface.md)。
## 创建 CSI 驱动
Kubernetes 尽可能少地指定 CSI Volume 驱动程序的打包和部署规范。[这里](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/storage/container-storage-interface.md#third-party-csi-volume-drivers)记录了在 Kubernetes 上部署 CSI Volume 驱动程序的最低要求。
最低要求文件还包含[概述部分](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/storage/container-storage-interface.md#recommended-mechanism-for-deploying-csi-drivers-on-kubernetes),提供了在 Kubernetes 上部署任意容器化 CSI 驱动程序的建议机制。存储提供商可以运用这个机制来简化 Kubernetes 上容器式 CSI 兼容 Volume 驱动程序的部署。
作为推荐部署的一部分Kubernetes 团队提供以下 sidecar辅助容器
- [External-attacher](https://github.com/kubernetes-csi/external-attacher)
可监听 Kubernetes VolumeAttachment 对象并触发 ControllerPublish 和 ControllerUnPublish 操作的 sidecar 容器,通过 CSI endpoint 触发
- [External-provisioner](https://github.com/kubernetes-csi/external-provisioner)
监听 Kubernetes PersistentVolumeClaim 对象的 sidecar 容器,并触发对 CSI 端点的 CreateVolume 和DeleteVolume 操作;
- [Driver-registrar](https://github.com/kubernetes-csi/driver-registrar)
使用 Kubelet将来注册 CSI 驱动程序的 sidecar 容器,并将 `NodeId` (通过 `GetNodeID` 调用检索到 CSI endpoint添加到 Kubernetes Node API 对象的 annotation 里面。
存储供应商完全可以使用这些组件来为其插件构建 Kubernetes Deployment同时让它们的 CSI 驱动程序完全意识不到 Kubernetes 的存在。
另外 CSI 驱动完全是由第三方存储供应商自己维护的,在 kubernetes 1.9 版本中 CSI 还处于 alpha 版本。
## 参考
- [Introducing Container Storage Interface (CSI) Alpha for Kubernetes](http://blog.kubernetes.io/2018/01/introducing-container-storage-interface.html)
- [Container Storage Interface (CSI)](https://github.com/container-storage-interface/spec/blob/master/spec.md)