云原生之下,视频云业务的10大实践经验分享(谈谈使用云服务的经验)
523
2022-05-30
课程目标:
1.了解Kubernetes容器存储发展历程
2.了解StorageClass工作原理
3.了解CSI容器存储接口架构
4.了解Kubernetes out-tree存储兼容in-tree存储的机制
目录:
1. StorageClass工作原理分析
2. CSI容器存储接口架构解读
3.云原生存储最佳实践:从FlexVolume插件向CSI插件迁移
K8S初期为存算分离所做的解耦设计Volume,米用强耦合、灭活性.左HII-Tee保T工上种t橐收数)徳于业务功能设计。但这类存储卷的生命周期是跟随pod的,只能用作存储临时数据,无法做为最终数据使用。
随着K8S的不断成熟,为支持更多的应用场景,提供了一种脱离pod生命周期的、用户可管理的存储抽象设计低耦合、灵活性更强的PersistentVolume/PersistentVolumeClaim。
PV/PVC如何与Flexvolume/CSI的插件一起工作呢?那就是我们接下来要学习的StorageClass。
1. StorageClass工作原理分析
StorageClass工作原理解读
StorageClass是存储类,简称sc。 K8S平台为存储提供商提供存储接入的一种声明,通过sc和相应的存储插件(csi/flexvolume)为容器应用提供动态分配存储卷的能力。
sc用以指定存储池的:
1.供应商的名字: everest-csi-provisioner
2.分配PV卷的回收策略:Delete/Retain
3.分配PV卷的绑定模式: lmmediate/WaitForFirstConsumer
4.存储是否支持扩容: true/false
5.驱动名字: disk.csi.everest.io、.....
6.驱动类型:块存储、文件存储、对象存储........
StorageClass应用场景解读
无论在资源管控严格还是资源管控敏捷的场景,资源管理员都希望通过创建k8s的存储接口来管理容器存储资源。
k8s通过存储声明(pvc)、存储类(SC)和存储抽件(ariver)从口L1P,满足用户一键式定义、创建存储。
1.用户在StatefulSet模板中定义对存储的需要
2.StatefulSet控制器负责将claim模板转换为pvc
3.结合自定的sc和sc中指定的driver,创建应用所需要的pv卷。
2.CSI容器存储接口架构解读
什么是云原生存储?
云原生的理解:
1.从技术视角看:一种还在不断演进中的设计思想,它主要是为了充分利用云计算的优势、促进云计算技术发展而构建和运行应用的设计思想;
2.从用户视角看:一种让用户从迭代慢、运维重、升级难的包袱中解脱出来,聚焦业务开展的设计思想。
云原生应用的理解:基于云原生技术构建、运行的应用程序,它具有:
1.行为可预测,快速弹性扩缩容;
2.持续交付,使研发流程更敏捷;
3.基于API构建,团队协作更顺畅;
4.独立性强,促进DevOps的开展;
5.依赖少,轻量,故障恢复快速。
云原生存储的理解:
1.从技术视角看:符合以应用为中心、可被声明和组合实现、是API驱动和服务自治、具有敏捷等特性的存储系统;
2.从用户视角看:最大的是使能云原生应用特性的存储系统。
CSI是容器存储接口规范,被K8S选为存储接入规范。
以CSI存储架构为例,解读容器存储架构,如下图所示:
1.控制接口A:K8S平台通过控制接口调用存储提供商发布的控制APl;
2.控制接口B:K8S平台通过sideCar (external-provisioner/attacher等)调用存储提供商发布的控制APl;
3.数据接口C:数据面,存储通过文件系统、块设备等方式为K8S平台中运行的workload提供存储读写等能力;
CSI存储接口解读
1.CSI接口可分为三类:identity、ControllerServer、nodeServer。
CSI服务共分为2类:
①NodeServer: kubelet对已经绑定到节点上的存储卷的操作,如mount/umount.格式化等;
②ControllerServer:对存储服务管理的操作,如创建/删除、快照、扩容等
自研CSI插件的构建思路
1.CSI接口调用流程,我们以块存储为例,图示接口调用,如右图所示;
2.CSI插件的sideCar和node-driver之间的关系,如下图所示:
控制面的sideCar与driver通过Deployment/StatefulSet部署;
数据面的sideCar与driver通过DaemonSet部署;
sideCar容器和driver容器在pod中通过UDS(unix domain socket)调用,完成卷的生命周期管理;
Kubelet与node-driver之间通过UDS调用,完成节点上卷的格式化、挂载给容器使用操作。
CSI架构中sideCar与driver之间是采用UDS(Unix Domain Socket)通讯的。
CSI插件注册流程解读:
CSI插件在kubernetes中的注册流程:
1.Kubelet启动后,plugin Manager不断watch插件目录:
/var/lib/kubelet/plugin_registry/,主要方法是:kubelet.getPluginsRegistrationDir()
2.通过DaemonSet部署的csi-driver,在节点启动后:
①Drivers容器启动后,创建gRPC server,并监听csi.sock
②sideCar容器启动后,也创建一个gRPC server,并监听{driverName}.-reg.sock,node-driver-registrar通过UDS调用GetPluginInfo)向driver请求driver信息;
3.Kubelet pluginManager发现{driverName}.-reg.sock后,会纳入插件管理里;csi VolumePlugin会向{driverName}.-reg.sock通过gRPC client向node-driver-registrar发送GetInfo()请求;
4.Kubelet csi VolumeManager向driver的csi.sock发送NodeGetlnfo()请求;
5.Kubelet根据收集到的信息,创建CSINode信息
6.Kubelet调用NotifyRegistrationStatus()通知node-driver-registrar注册情况。
3.云原生存储最佳实践:从FlexVolume插件向CSI插件迁移
CSI存储兼容in-tree插件存储的方案解读:
k8s社区里通过CSIMigration来实现in-tree的存储插件向CSI插件“迁移”,或称之为兼容,这部分兼容会逐步“日落”并下线。
CSIMigration,归根到底就是起到一个转换器作用,在保证北向API不改变的情况下进行转换成CSI的持久卷,并能够被CSI插件管理。
主要涉及到的组件有:
1. Kube-controller-manager:
添加支持CSIMigration的插件——appendAttachableLegacyProviderVolumes;
Dsw、AttachDetach控制器、expand控制器中添加CSIMigration的csiMigratedPluginManager和intreeToCSITranslator,负责将intree的volume配置信息转换为CSI格式的配置信息,以供后续CSI插件调用;
2. Kubelet:
添加支持CSIMigration的插件———appendLegacyProviderVolumes
volumeManger中添加CSIMigration的csiMigratedPluginManager和intreeToCSITranslator,负责将intree的volume配置信息转换为CSI格式的配置信息,以供后续CSI插件调用;
本课总结:
StatefulSet:简称sts,有状态应用,一种k8s为用户提供一组具有有序、唯一、稳定的应用实例集合。
Volume:卷,k8s为存算分离所做的解耦设计,让用户更加专注于业务功能设计。它在k8s中是依托于pod而使用的。
PersistentVolume:简称pv,持久化存储,是k8s为云原生应用提供一种拥有独立生命周期的、用户可管理的存储抽象设计。
PersistentVolumeClaim:简称pvc,持久化存储声明,是K8S为解耦云原生应用和数据存储而设计的,通过pvc可以让资源管控更细更灵活、团队职责分离应用模板更通用,进一步解除了用户被云平台锁定的顾虑。
StorageClass:简称sc,存储类,是K8S平台为存储提供商提供存储接入的一种声明,通过sc和相应的存储插件(csi/flexvolume)为容器应用提供动态分配存储卷的能力。
参考链接:
1.相关内容的华为云官网链接: https://support.huaweicloud.com/usermanual-cce/cce_01_0042.html
2.CCE云容器引擎官方首页: https://www.huaweicloud.com/product/cce.html
3. Kubernetes CSI官方文档: https://kubernetes-csi.github.io/docs/introduction.html
4. Kubernetes官方文档:
StatefulSet: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/
Storage: https://kubernetes.io/docs/concepts/storage/
Kubernetes 云原生 容器
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。