1.StorageClass工作原理分析
2.CSI容器存储接口架构解读
3.云原生存储**实践:从FlexVolume插件向CSI插件迁移
StorageClass是存储类,简称sc。
可以理解为K8S平台为存储提供商提供存储接入的一种声明,通过sc和相应的存储插件
(csi/flexvolume)为容器应用提供动态分配存储卷的能力。
从图1.1可以看出pod 使用 pvc ,pvc会指定 StorageClass 要使用哪一个 driver来提供存储,再通过 driver 来创建一个 pv 来与 pvc 进行绑定,最终为 pod 服务
图1.1
sc用以指定存储池的:
1.供应商的名字:everest-csi-provisioner
2.分配PV卷的回收策略:Delete/Retain
3.分配PV卷的绑定模式:Immediate/WaitForFirstConsumer
4.存储是否支持扩容:true/false 5 驱动名字:disk.csi.everest.io、…
5. 驱动名字:disk.csi.everest.io、…
6.驱动类型:块存储、文件存储、对象存储…

无论在资源管控严格还是资源管控敏捷的场景,资源管理员都希望通过创建 k8s的存储接口来管理容器存储资源。
k8s通过存储声明(pvc)、存储类(sc)和存储插件(driver)联合工作,来满足用户一键式定义、创建存储。
1.用户在StatefulSet模板中定义对存储的需要
2.StatefulSet控制器负责将claim模板转换为pvc
3.结合自定的sc和sc中指定的driver,创建应用所需要的pv卷。


1.定义一个有状态应用:etcd;
2.在workload模板中定义volumeClaimTemplates来使用动态PV卷;
3.使用kubectl指令创建应用;
4.查询sts、pods、pvc如下:







2.2什么是云原生存储
既然谈到了csi就不免了解一下云原生存储
- 云原生的理解:
1.从术视角看:一种还在不断演进中的设计思想,它主要是为了充分利用云计算的优势、促进云计算技术发展而构建和运行应用的设计思想;
2.从户视角看:一种让用户从选代慢、运维重、升级难的包袱中解脱出来,聚焦业务开展的设计思想。
- 云原生应用的理解:
基于云原生技术构建、运行的应用程序,它具有:
1.行为可预测,快速弹性扩缩容;
2.持续交付,使研发流程更敏捷;
3.基于API构建,团队协作更顺畅;
4.独立性强,促进DevOps的开展;
5.依赖少,轻量,故障恢复快速。
- 云原生存储的理解:
1.从技术视角看:符合以应用为中心可被声明和组合实现、是API驱动和服务自治、
具有敏捷等特性的存储系统; Container Orchestrators;
2.从用户视角看:最大的是使能云原生应用特性的存储系统。
- 以CSI存储架构为例,解读容器存储架构,如下图1所示:
1.控制接口A:K8S平台通过控制接口调用存储提供商发布的控制API;
2.控制接口B:K8S平台通过sideCar(external-provisioner/attacher等)调用存储提供商发布的控制API;
3.数据接口C:数据面,存储通过文件系统、块设备等方式为K8S平台中运行的 workload提供存储读写等能力。

图2.1
2.3 CSI存储架构解读

2.4 CSI存储接口解读
- CSI接口共分为3类:
1.identity

2.nodeServer
3. controllerServer
- CSI服务共分为2类:
1. NodeServer:kubelet对已经绑定到节点上的存储卷的操作,如mount/umount格式化等;
2.ControllerServer:对存储服务管理的操作,如创建/删除、快照、扩容等


2.5 自研CSI插件的构建思路
- CSI接口调用流程,我们以块存储为例,图示接口调用,如图5.1所示;
- CSI插件的sideCar和node-driver之间的关系,如图5.2所示:
1.控制面的sideCar与driver通过Deployment/StatefulSet部署;
2.数据面的sideCar与driver通过DaemonSet部署;
3.sideCar容器和driver容器在pod中通过UDS(unixdomain socket)调用,完成卷的生命周期管理
4.Kubelet与node-driver之间通过UDS调用,完成节点上卷的格式化、挂载给容器使用操作。

csi接口调用流程图2.5.1

图2.5.2
2.6 CSI插件注册流程解读
- CSI插件在kubernetes中的注册流程:
1.Kubelet启动后,plugin Manager不断watch插件目录:
/var/lib/kubelet/plugin registry/,主要方法是:
kubelet.getPluginsRegistrationDir()
2.通过DaemonSet部署的csi-driver,在节点启动后:
2.1 Drivers容器启动后,创建gRPCserver,并监听csi.sock
2.2 sideCar容器启动后,也创建一个gRPCserver,并监听{driverName).-reg.sock,node-driver-registrar通过UDS调用 GetPlugininfo0向driver请求driver信息;
3.Kubelet pluginManager发现{driverName}.-reg.sock后,会纳入插件管理里;
csi VolumePlugin会向{driverName}.-regsock通过gRPCclient向node-driver registrar发
送Getlnfo()请求;
4.Kubelet csi VolumeManager向driver的csisock发送NodeGetInfo()请求;
5.Kubelet根据收集到的信息,创建CSINode信息;
6.Kubelet调用NotifyRegistrationStatus()通知node-driver-reqistrar注册情况。


3.1 CSI插件和Flexvolume插件对比

1.Flexvolume 插件是以二进制发布,并且集成在kube-controller-manager和 kubelet的插件目录下:/usr/libexec/kubernetes/kubelet-plugins/volume/exec;
2.控制面:以二进制的形式集成到kube-controller-manager容器中;
3.数据面:以DaemonSet的形式部署,安装到node插件目录下,然后驱动插件向kubelet注册;
#Is /usr/libexec/kubernetes/kubelet-plugins/volume/exec
huawei.com~fuxiefs huawei.com~fuxinfs huawei.com~fuxiobs huawei.com~fuxivol
4.功能:创建/删除、挂载/卸载、绑定/去绑定操作。

1.CSI插件以全容器形式部署,通过sideCar+driver构建完整的解决方案;
2.控制面:以Deployment或StatefulSet部署在用户集群中,通过订阅pvc、va等k8s对象,实现存储卷的生命周期管理;
3.数据面:以DaemonSet的形式部署,通过kubeletgRPC(UDS)调用实现本节点上的存储与容器的绑定操作管理;
4. 功能:创建/删除、挂载/卸载、绑定/去绑定,以及增强功能扩容、快照等。
3.2 CSI存储兼容in-tree插件存储的方案解读
k8s社区里通过CSIMigration来实现in-tree的存储插件向CSI插件“迁移”,或称之为兼容,这部分兼容会逐步“日落”并下线。
CSIMigration,归根到底就是起到一个转换器作用,在保证北向API不改变的情况下进行转换成CSI的持久卷,并能够被CSI插件管理。
- 主要涉及到的组件有:
1.Kube-controller-manager:
1.1.添加支持CSIMigration的插件--appendAttachableLegacyProviderVolumes;
1.2.DSW、AttachDetach控制器、expand控制器中添加CSIMigration的csiMigratedPluginManager和intreeToCSITranslator,负责将intree的volume配置信息转换为CSI格式的配置信息,以供后续CSI插件调用;
2.Kubelet:
2.1.添加支持CSIMigration的插件--appendLegacyProviderVolumes
2.2.volumeMange中添CSIMigration的csiMigratedPluginManager和intreeToCSITranslator,负责将intree的volume配置信息转换为CSI格式的配置信息,以供后续CSI插件调用;

3.3 csi-migration-lib库解读

3.4 CCE服务中CSI存储兼容Flexvolume持久卷的方案解读
华为CCE服务为了能够让用户使用CSI存储插件中提供的增强能力,在K8S1.15版本中提供了兼容Flexvolume PV存储的CSI插件。

总结
在本文的最后呢,做一下总结,另外在最后还提供了参考链接,有想基于csi开发存储插件的的可以看一下官方的文档,介绍的比较详细一些。
<p><strong>名称</strong></p> </td><td style="vertical-align:top"> <p><strong>简介</strong></p> </td></tr><tr><td style="vertical-align:top"> <p>StatefulSet</p> </td><td style="vertical-align:top"> <p>简称sts,有状态应用,一种k8s为用户提供一组具有有序、唯一、稳定的应用实例集合。</p> </td></tr><tr><td style="vertical-align:top"> <p>Volume</p> </td><td style="vertical-align:top"> <p>卷,k8s为存算分离所做的解耦设计,让用户更加专注于业务功能设计。它在k8s中是依托于pod而使用的。</p> </td></tr><tr><td style="vertical-align:top"> <p>PersistentVolume</p> </td><td style="vertical-align:top"> <p>简称pv,持久化存储,是k8s为云原生应用提供一种拥有独立生命周期的用户可管理的存储抽象设计。</p> </td></tr><tr><td style="vertical-align:top"> <p>PersistentVolumeClaim</p> </td><td style="vertical-align:top"> <p>简称pvc,持久化存储声明,是K8S为解耦云原生应用和数据存储而设计的通过pvc可以让资源管控更细更灵活、团队职责分离、应用模板更通用,进一步解除了用户被云平台锁定的顾虑。</p> </td></tr><tr><td style="vertical-align:top"> <p>StorageClass</p> </td><td style="vertical-align:top"> <p>简称sc,存储类,是K8S平台为存储提供商提供存储接入的一种声明,通过sc和相应的存储插件(csi/flexvolume)为容器应用提供动态分配存储卷的能力。</p> </td></tr></tbody></div>
讯享网

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/148788.html