容器存储标准权威解读 | CSI白皮书(下)

五迷三道 提交于 2021-01-03 16:42:46

应用上云,怎能没有容器!点击上方容器魔方关注我


上篇文章我们主要对CSI出现的行业背景,设计要点以及架构等做了总体介绍,本篇我们将对CSI SPEC进行解析,详细介绍每个服务接口的功能。

注:本篇文章基于CSI SPEC 3.0版本编写。


CSI SPEC详解


在CSI SPEC中,总共有三组RPC集:

Identity Service:Node Plugin和Controller Plugin都必须实现这些RPC集。

Controller Service:Controller插件必须实现这些RPC集。

Node Service:node插件必须实现这些RPC集。

接下来让我们逐一讲解每个RPC服务。


1.Identity Service RPC


身份服务RPC允许CO查询插件的功能,健康状况和其他元数据。 

GetPluginInfo:获取插件的版本和名字。

GetPluginCapabilities:此方法返回插件所支持的功能。主要检测插件是否实现Controller Service和是否支持卷访问拓扑限制。插件的相同版本的所有实例,必须返回相同的功能集。

Probe:主要用途是验证插件是否处于健康和就绪状态。


2.Controller Service RPC


CreateVolume:配置新的存储卷,主要请求参数包括:名字、卷容量、卷功能(表明是块存储卷还是文件系统卷,以及访问模式)、参数、预填充数据源(目前仅支持从snapshot预填充),以及卷拓扑限制等。

DeleteVolume:删除指定volume ID的存储卷。

ControllerPublishVolume:使存储卷在某个所需节点上可用。例如Cinder、RBD等,需要将volume attach到某个节点上。

ControllerUnpublishVolume:执行ControllerPublishVolume相反的操作,也就是使卷在某个节点上不可用,例如将volume从某个节点detach

ValidateVolumeCapabilities:验证预先配置的卷是否满足CO需求的能力,可以指定卷功能(表明是块存储卷还是文件系统卷,以及访问模式)、卷属性以及卷拓扑限制等进行验证。

ListVolumes:返回所有可用的存储卷,支持分页功能。

GetCapacity: 返回存储资源池总可用容量。如果您的存储容量有限,则需要执行此操作。假设存储资源池只能提供1TB的存储空间。配置和创建新卷时,应检测存储资源池的可用存储容量。

ControllerGetCapabilities:返回Controller插件支持的功能。比如有些controller plugin不支持GetCapacity,有些则不支持CreateSnapshot等。

CreateSnapshot:创建指定volume ID的存储快照,用来备份数据。

DeleteSnapshot:删除指定ID的存储快照。

ListSnapshots: 返回所有可用的存储快照,支持分页功能。


3.Node Service RPC


NodeStageVolume:CO调用此方法以将volume mount到指定路径。通常,此路径是节点上的全局路径。此方法调用必须在NodePublishVolume之前,NodeStageVolume是每个卷/每个节点执行一次。比如在Kubernetes中,Cinder卷在attach到节点后,会将其mount到全局目录,然后mount到pod目录(通过NodePublishVolume)。两步mount操作的原因是因为Kubernetes允许您多个pod使用单个卷。

NodeUnstageVolume:执行NodeStageVolume相反的操作,从指定目录unmount卷。

NodePublishVolume: CO调用此方法将卷从指定全局路径mount到目标路径。通常做的操作是bind mount。bind mount允许您将路径mount到不同的路径。此方法调用必须在NodeStageVolume之后,NodePublishVolume是每个卷/每个工作负载执行一次。

NodePublishVolume:执行NodePublishVolume相反操作,从目标路径unmount卷。

NodeGetId:返回运行此插件的节点的唯一ID,这个方法在0.3版本中已经被弃用。

NodeGetCapabilities:主要用来检测node plugin支持的功能。和ControllerGetCapabilities类似,返回Node插件的功能。

NodeGetInfo:获取node节点信息,返回值包括node ID,节点上最多可发布的volume数量,以及node可访问的拓扑信息。


开发建议


以上我们详细介绍了CSI SPEC的RPC集,相信你对这部分有了一定的了解,接下来,你可以动手实现自己的CSI plugin。

https://kubernetes-csi.github.io/docs/Drivers.html

有很多存储商公开发布的CSI plugin,你也可以作为参考编写。


在开发过程中,我们要注意以下事项:


所有的功能实现都是幂等的。假设你已经发送CreateVolume请求创建一个卷,此时你重复发送相同的请求,我们不应该再次创建新的卷,相反我们应该返回相同的response,因为卷已经创建。所以我们在实现的时候,应该首先检查卷是否存在,如果卷不存在,我们再去创建。

采用良好的日志系统记录错误信息,方便用于插件调试。

创建或者attach卷不是即时操作,需要若干分钟时间,实现过程中,需要waitForCreation 或者waitForAttach等方法等待操作结束。

社区提供了测试套csi-sanity(https://github.com/kubernetes-csi/csi-test/tree/master/cmd/csi-sanity)可以用来测试插件实现是否符合CSI规范,具体可以查看https://kubernetes-csi.github.io/docs/Testing-Drivers.html。


推荐阅读

容器存储标准权威解读 | CSI白皮书(上)

前方高能 | 容器化应用操作原来可以这样简单

Istio技术与实践05:如何用istio实现流量管理


点击阅读原文,了解Meetup详情

本文分享自微信公众号 - CNCF(lf_cncf)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!