思考题:
1. Register过程: csi 插件应该作为 daemonSet 部署到每个节点(node)。然后插件 container 挂载 hostpath 文件夹,把插件可执行文件放在其中,并启动rpc服务(identity, controller, node)。External component Driver Registrar 利用 kubelet plugin watcher 特性watch指定的文件夹路径来自动检测到这个存储插件。然后通过调用identity rpc服务,获得driver的信息,并完成注册。
2. Provision过程:部署External Provisioner。 Provisioner 将会 watch apiServer 中 PVC 资源的创建,并且PVC 所指定的 storageClass 的 provisioner是我们上面启动的插件。那么,External Provisioner 将会调用 插件的 controller.createVolume() 服务。其主要工作应该是通过阿里云的api 创建网络磁盘,并根据磁盘的信息创建相应的pv。
3. Attach过程:部署External Attacher。Attacher 将会监听 apiServer 中 VolumeAttachment 对象的变化。一旦出现新的VolumeAttachment,Attacher 会调用插件的 controller.ControllerPublish() 服务。其主要工作是调用阿里云的api,把相应的磁盘 attach 到声明使用此 PVC/PV 的 pod 所调度到的 node 上。挂载的目录:/var/lib/kubelet/pods/<Pod ID>/volumes/aliyun~netdisk/<name>
4. Mount过程:mount 不可能在远程的container里完成,所以这个工作需要kubelet来做。kubelet 的 VolumeManagerReconciler 控制循环,检测到需要执行 Mount 操作的时候,通过调用 pkg/volume/csi 包,调用 CSI Node 服务,完成 volume 的 Mount 阶段。具体工作是调用 CRI 启动带有 volume 参数的container,把上阶段准备好的磁盘 mount 到 container指定的目录。
展开