一、容器存储虚拟化的机巧
以rbd块存储的容器存储卷为例,我们掀开容器存储卷的盖板,从宿主机视角看容器存储虚拟化落地的机巧:
1、容器内/data绑定挂载自宿主机路径/var/lib/kubelet/pods/$pod_id/.../$pv-name
2、宿主机/var/lib/kubelet/pods/$pod_id/.../$pv-name路径由文件挂载自设备/dev/rbd1
3、宿主机/dev/rbd1设备映射自远端存储ceph rbd块设备
上述挂载映射路径见示意图:
二、海纳百川的容器存储集成方案
分布式存储历经数十年发展,形成了以对象、块以及文件为主的主流存储形态,在各类行业市场久经考验。
计算虚拟化新贵docker&kubernetes自问世来与分布式存储前辈打得火热,陆续提供了in-tree plugin、flexvolume以及csi系列容器存储集成方案,实现海纳百川的容器存储虚拟化。
in-tree plugin为kubernetes版本早期内建的存储插件,支持ceph、nfs等主流第三方存储。
in-tree plugin在丰富了kubernetes容器存储虚拟化选项的同时,也带来了kubernetes代码上的繁冗与版本迭代效率的下降。
flexvolume是kubernetes指给社区可自助存储集成的曲径小道,支持mount、unmount与init等最小方法集,可快速实现第三方存储集成方案。
CSI是kubernetes提供社区可自助存储集成的康庄大道。基于csi规范,支持attach、dettach、mount与unmount的接口能力,实现自动化的第三方存储集成方案。
三、百川通衢的CSI规范
CSI (container storage interface)是由Kubernetes、Cloud Foundry 以及Mesos等联合制定的容器存储行业接口规范,
目标指引社区开发者将第三方厂商分布式存储接入至容器化应用。
下图为符合CSI规范的存储插件在kubernetes中的实践:
结合kubernetes,csi插件与pod交互实现pod内存储卷到远端分布式存储的映射,详细交互过程如下:
1、kube-apiserver响应外部请求,创建PVC X
2、external provisioner调用createvolume接口在外部存储系统上创建存储卷,而后请求kube-apiserver创建PV Y对象
3、kube-controllermanager内PersistentVolumeController绑定PVC X和PV Y
4、kube-apiserver响应外部请求,创建新Pod,而后此Pod被kube-scheduler调度至节点A上
5、kube-controllermanager内AttachDetachController控制器创建VolumeAttachment对象Z
6、external provisioner调用controllerPublishvolume接口实现外部存储卷到节点A的绑定
7、kubelet的VolumeManagerReconciler调用csiNode的NodeStageVolume和NodePublishVolume方法完成存储卷的格式化以及mount过程
至此,此Pod实现对外部块存储卷的成功挂载
四、水到渠成
前文所述,kubernetes通过in-tree plugin、flexvolume以及csi插件能力实现容器存储虚拟化的落地。
换句话说,csi等存储插件实现了容器存储卷从pvc声明起始,到宿主上pv、存储设备以及远端块存储的创建,配置的全流程自动化。