所属技术领域:
K8s
|名词定义|
csi 是一个标准的容器存储接口,规定了如何实现一个容器的存储接口,CSI 本身的定义是基于 gRPC 的,所以有一套样例库可以使用,这里分析一下 kuberntes 实现 csi 的方式,为了兼容 CSI kubernete 其实搞得挺绕的,目前这个 CSI 还是定制中包括后期的 Snapshot 的接口怎么设计等等还在讨论中。kubernetes CSI 主要基于几个外部组件和内部功能的一些改动。
|技术特点|
CSI对象
VolumeAttachments:
描述一个Volume卷挂载、卸载相关的信息。包含:卷的名字、挂载目的节点、使用的插件、当前状态等信息。代表一个挂载操作期望;
AD Controller在执行挂载一个CSI PV的时候,会调用csi-attacher(in-Tree)创建一个VolumeAttachment;
External-attacher通过watch VolumeAttachment,发现有需要挂载的数据卷时,调用csi-plugin的ControllerPublishVolume方法,执行attach操作
VolumeAttachment是由AD Controller调用csi-attacher删除
CSIDriver:
描述集群中部署的CSI Plugin列表,需要管理员根据插件类型创建;
定义Kubernetes调用CSI Plugin的行为
-AttachRequired:定义Plugin是否支持Attach功能,如果定义为false,Kubernetes不会调用Attach接口;
-podinfoOnMount:定义Kubernetes调用Mount接口时,是否带上Pod信息;
已经Beta,Kubernetes API已经默认支持,可以直接创建使用;
1.13之前版本需要手动打开Feature Gate,并创建CSI Driver
CSINode:
定义集群中CSI节点信息,node-driver-registrar启动时创建
CSINode的作用
-每一个新的CSI Plugin注册后,都会在CSINode里添加一个CSINode信息;
-Controller Manager、Scheduler依赖CSINode信息来确定一个节点的CSI驱动是否可用;
-ControllerManager实现了Topoloy-Aware Provsion的时候,通过CSINode信息获取拓扑信息;
已经Beta,Kubernetes API已经默认支持,可以直接创建使用;
1.13之前版本需要手动打开Feature Gate,并创建CSINodeinfo;
CSI组件-Node-Driver-Registrar
负责与Kubelet配合实现CSI插件的注册功能:
- Node-Driver-Registrar向CSI Plugin调用GetPluginInfo接口,获得Plugin DriverName;
2.启动监听服务,监听:/var/lib/kubelet/plugins_registry/diskplugin.csi.alibabacloud.com-reg.sock地址;监听2个接口:
-GetInfo:提供Plugin的相关信息,类型、名字、实际插件socket地址、版本;
-NotifyRegistrationStatus:接收kubelet的Plugin注册结果,注册失败时插件会停止;
3.kubelet向Node-Driver-Registrar调用GetInfo,获取plugin的信息(名字、实际插件的socket地址)(由Watch发现socket文件后触发调用操作)
4.kubelet向真实csi插件发送NodeGetInfo请求,获取:NodeID、节点拓扑等插件信息;将CSI插件加入Plugin列表;
5.调用kubelets API,更新Node信息:
-更新节点:Annotations:添加csi.volume.kubernetes.io/nodeid信息;
-更新节点:Labels:添加拓扑信息,topology.diskplugin.csi.alibabacloud.com/zone=*
-更新节点:status.allocatable和status.capacity字段,添加MaxAttachLimit信息;
-创建(更新)CSINode:添加节点对应的插件信息(nodeid,driverName,拓扑信息等)
6.调用Node-Driver-Registrar的NotifyRegistionStatus接口,通知Plugin已经注册成功(或失败);
CSI组件-Externel-Attacher
调用CSI Plugin接口实现数据卷的挂载、卸载;
通过WatcherVolumeAttachment对象,根据其状态调用ControllerPublishVolume接口;
如果在CSIDriver对象中对一个驱动的attachedRequired参数定义为false,则上述Attach流程不会执行,定义为true时,(AD Controller)才会进行Attach操作;
像文件存储这类存储类型,不需要进行attach、格式化操作存储类型,一般会跳过上述流程;
CSI部署
CSI 使用示例
CSI其他功能
CSI 近期Features