承接上文,块存储的CSI要比对象存储复杂一些,但总的处理逻辑还是一致的。下面以华为fusionstorage的CSI为例进行介绍,该插件支持了多个后端存储,如fusionstorage和oceanstor。下面是CSI插件与后端存储(fusionstorage)交互用到的配置文件。其中pools
为事先创建好的存储池,parameters
为所有k8s的node节点的hostname:ip
对,用于执行attach块存储操作。
csi.json: |
{
"backends": [
{
"storage": "fusionstorage-san",
"name": "***",
"url": "https://*.*.*.*:28443",
"user": "***",
"password": "***",
"pools": ["***"],
"parameters": {"SCSI": {"***": "*.*.*.*"}}
}
]
}
如上图所示,Node上的CSI容器挂载了Node的/dev
,/etc
,/var/lib/kubelet
目录。整体挂载流程为:在后端存储创建一个卷(如果不存在),并将其attach到node节点的/dev目录下(具体的attach动作由iSCSI客户端,NFS,FC等方式完成);由于容器挂载了/dev目录,在容器中直接格式化该块存储并挂载到/var/lib/kubelet中的pod目录即可。/etc目录只用于在csi容器中获取node节点的hostname(PS:在容器中挂载node节点的/dev和/etc目录是比较危险的,如果容器损坏了这些目录,可能导致node节点的系统错误)。
创建并挂载卷的调用过程如下(下载):
参考: