Kubernetes CSI 简介:工作流程和原理
Kubernetes CSI 简介:工作流程和原理
Kubernetes CSI(容器存储接口)是Kubernetes中用于管理存储资源的重要组件。本文将以NFS为例,详细介绍CSI驱动的工作流程和原理,帮助读者理解CSI如何实现存储资源的管理和使用。
CSI 概述
CSI驱动通常分为两个部分:
- Controller plugin:负责存储资源的管理,如卷的创建、删除、扩容、快照等。
- Node plugin:处理节点级别的存储操作,负责在具体的节点上执行卷的挂载和卸载等任务。
CSI与Kubernetes组件的交互:
- Controller plugin与kube-api-server交互,监听存储资源的变更并执行相应操作。
- Node plugin向kubelet注册自己,而后kubelet会向其发起调用。
为了简化CSI驱动程序的开发,社区提供了很多CSI Sidecar Containers,包括:
- external-provisioner:用于卷的动态配置。监听PVC对象,向CSI驱动程序发起CreateVolume或DeleteVolume调用。
- node-driver-registrar:负责将CSI驱动注册到kubelet,以便后续的调用。
- external-attacher:用于卷的attach/detach hooks集成。
- external-resizer:用于卷的扩容。
- external-snapshotter:处理卷的快照。
- livenessprobe:监控CSI驱动程序的健康状况。
CSI 使用过程
1. CSI 驱动准备阶段
确保集群中已正确安装CSI驱动,通常:
- Controller plugin以Deployment或StatefulSet的方式部署。
- Node plugin由于是节点级别的操作,所以部署为DaemonSet,每个节点运行一个Pod。
安装完成后,Controller plugin会向kube-api-server监听相关的资源对象,Node plugin则会向kubelet注册自己。
2. 卷的动态配置
集群管理员创建StorageClass对象来声明存储类型。用户创建PVC对象并指定StorageClass,此时Controller plugin中的:
- provisioner监听到PVC创建后,向nfs-driver发起gRPC CreateVolume调用。
- nfs-driver向NFS server准备好共享存储目录。
- 最后,provisioner创建PV。至此,PVC与PV完成了绑定。
3. 创建 Pod 并使用卷
用户创建Pod并使用卷。kube-api-server接受到请求,kube-scheduler将Pod调度到节点上。该节点上的kubelet向Node plugin发起gRPC NodePublishVolume调用,由Node plugin中的nfs-driver(具体的CSI驱动程序)完成文件目录的挂载。至此,Pod中的应用程序便可以使用挂载好的文件目录了,就像使用本地文件系统一样。
然而,Pod中的应用程序实际操作的却是NFS远程共享目录,这又是怎么做到的?
Linux VFS
Linux在实际的文件系统之上,其实还有一层VFS(virtual filesystem)虚拟文件系统。
VFS是一个抽象层,它允许应用程序通过统一的系统调用来操作不同类型的文件系统。无论是本地文件系统还是远程文件系统(如NFS),操作都经过VFS中转。对于挂载了NFS目录的系统,VFS会将相应的系统调用转交给NFS客户端,NFS客户端则使用RPC网络通信与NFS服务器进行交互。
总结
除了NFS之外,CephFS等其他分布式存储系统也采用了类似的工作原理和流程。CSI定义了标准化的gRPC协议,以及CSI驱动的交互过程和架构,使得各种存储系统可以通过统一的接口集成到Kubernetes中。