云原生钻石课程 | 第5课:Kubernetes存储架构原理深度剖析(下)
点击上方“程序猿技术大咖”,关注并选择“设为星标”
回复“加群”获取入群讨论资格!
本篇文章来自《华为云云原生王者之路训练营》钻石系列课程第5课,由云原生存储解决方案Everest2.0的架构设计专家Jabin主讲,跟随K8S的存储演进史,进一步了解容器存储的架构设计。
K8s初期为存算分离所做的解耦设计Volume,采用强耦合、灵活性差的in-tree模式,虽然已经让用户专注于业务功能设计。但这类存储卷的生命周期是跟随pod的,只能用作存储临时数据,无法做为最终数据使用。随着K8S的不断成熟,为支持更多的应用场景,提供了一种脱离pod生命周期的、用户可管理的存储抽象设计低耦合、灵活性更强的PersistentVolume/PersistentVolumeClaim。
PV/PVC如何与Flexvolume/CSI的插件一起工作呢?那就是我们接下来要学习的StorageClass。
01
StorageClass工作原理分析
StorageClass工作原理解读
StorageClass是存储类,简称sc。K8S平台为存储提供商提供存储接入的一种声明,通过sc和相应的存储插件(csi/flexvolume)为容器应用提供动态分配存储卷的能力。
sc用以指定存储池的:
供应商的名字:everest-csi-provisioner
分配PV卷的回收策略:Delete/Retain
分配PV卷的绑定模式:Immediate/WaitForFirstConsumer
存储是否支持扩容:true/false
驱动名字:disk.csi.everest.io、……
驱动类型:块存储、文件存储、对象存储……
StorageClass应用场景解读
无论在资源管控严格还是资源管控敏捷的场景,资源管理员都希望通过创建k8s的存储接口来管理容器存储资源。
k8s通过存储声明(pvc)、存储类(sc)和存储插件(driver)联合工作,满足用户一键式定义、创建存储。
用户在StatefulSet模板中定义对存储的需要
StatefulSet控制器负责将claim模板转换为pvc
结合自定的sc和sc中指定的driver,创建应用所需要的pv卷
有状态应用使用动态PV卷示例
定义一个有状态应用:etcd
在workload模板中定义volumeClaimTemplates来使用动态PV卷:
使用kubectl指令创建应用:
查询sts、pods、pvc如下:
02
CSI容器存储接口架构解读
Kubernetes中存储相关的组件解读
PV Controller:负责 PV/PVC 的绑定,并根据需求进行数据卷的 Provision/Delete 操作
代码位置:pkg/controller/volume/persistentvolume/
AD Controller:负责VolumeAttachement的生命周期管理,并通过external-attacher将设备挂载到目标节点或从目标节点卸载。VA是控制块存储设备的 Attach/Detach 操作的逻辑对象
代码位置:pkg/controller/volume/attachdetach/
Kubelet volumeManager:管理存储卷的 Mount/Unmount 操作、卷设备的格式化等操作,如果当前节点并没有交给AD Controller管理,那么就是volumeManager负责管理VA的生命周期
代码位置:pkg/kubelet/volumemanager/
Volume plugin:K8S平台为存储提供商提供存储接入的插件接口,其中包含in-tree的多种存储插件和out-tree的两种存储插件。通过该插件机制进而为容器应用提供各种类型的存储。社区推荐的是CSI架构的扩展插件
代码位置:pkg/volume/csi
什么是云原生存储?
云原生从技术视角来看是一种还在不断演进中的设计思想,它主要是为了充分利用云计算的优势、促进云计算技术发展而构建和运行应用的设计思想;从用户视角看是一种让用户从迭代慢、运维重、升级难的包袱中解脱出来,聚焦业务开展的设计思想。
云原生应用是基于云原生技术构建、运行的应用程序,它具有:行为可预测,快速弹性扩缩容;持续交付,使研发流程更敏捷;基于API构建,团队协作更顺畅;独立性强,促进DevOps的开展;依赖少,轻量,故障恢复快速。
云原生存储从技术视角看是合以应用为中心、可被声明和组合实现、是API驱动和服务自治、具有敏捷等特性的存储系统;从用户视角看是大的是使能云原生应用特性的存储系统。
以CSI存储架构为例,解读容器存储架构,如下图所示:
控制接口A:K8S平台通过控制接口调用存储提供商发布的控制API;
控制接口B:K8S平台通过sideCar(external-provisioner/attacher等)调用存储提供商发布的控制API;
数据接口C:数据面,存储通过文件系统、块设备等方式为K8S平台中运行的workload提供存储读写等能力;
CSI存储架构解读
external-provisioner:块存储/文件存储/对象存储的创建/删除组件,用以作为sideCar与存储提供商的driver插件统一完成存储的创建/删除操作。
external-attacher:块存储的attach/detach组件,用以作为sideCar与存储提供商的driver插件统一完成块存储与虚机/裸机的挂载/卸载操作。
external-snapshotter:块存储的快照组件,用以作为sideCar与存储提供商的driver插件统一完成块存储的快照操作。
external-resizer:块存储的扩容组件,用以作为sideCar与存储提供商的driver插件统一完成扩容操作。
node-driver-registrar:存储插件注册模块,用以作为sideCar与存储提供商的driver插件统一完成pv存储卷的格式化、mount/unmount操作。
CSI存储接口解读
CSI接口共分为3类:identity、odeServer和ontrollerServer。
CSI服务共分为2类:
NodeServer:kubelet对已经绑定到节点上的存储卷的操作,如mount/umount、格式化等;
ControllerServer:对存储服务管理的操作,如创建/删除、快照、扩容等
自研CSI插件的构建思路
CSI接口调用流程,我们以块存储为例,图示接口调用,如下图所示:
CSI插件的sideCar和node-driver之间的关系,如下图所示:
控制面的sideCar与driver通过Deployment/StatefulSet部署;
数据面的sideCar与driver通过DaemonSet部署;
sideCar容器和driver容器在pod中通过UDS(unix domain socket)调用,完成卷的生命周期管理;
Kubelet与node-driver之间通过UDS调用,完成节点上卷的格式化、挂载给容器使用操作。
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发送NodeGetInfo()请求;
5)Kubelet根据收集到的信息,创建CSINode信息
6)Kubelet调用NotifyRegistrationStatus()通知node-driver-registrar注册情况。
03
云原生存储最佳实践:从FlexVolume插件向CSI插件迁移
CSI插件和Flexvolume插件对比
Flexvolume插件
Flexvolume 插件是以二进制发布,并且集成在kube-controller-manager和kubelet的插件目录下: /usr/libexec/kubernetes/kubelet- plugins/volume/exec;
控制面:以二进制的形式集成到kube-controller-manager容器中;
数据面:以DaemonSet的形式部署,安装到node插件目录下,然后驱动插件向kubelet注册;
功能:创建/删除、挂载/卸载、绑定/去绑定操作。
CSI插件
CSI插件以全容器形式部署,通过sideCar+driver构建完整的解决方案;
控制面:以Deployment或StatefulSet部署在用户集群中,通过订阅pvc、va等k8s对象,实现存储卷的生命周期管理;
数据面:以DaemonSet的形式部署,通过kubelet gRPC(UDS)调用实现本节点上的存储与容器的绑定操作管理;
功能:创建/删除、挂载/卸载、绑定/去绑定,以及增强功能扩容、快照等
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插件调用;
csi-migration-lib库解读
csi-migration-lib里有几个接口,只需将这些接口定义即可:
CCE服务中CSI存储兼容Flexvolume持久卷的方案解读
华为CCE服务为了能够让用户使用CSI存储插件中提供的增强能力,在K8S 1.15版本中提供了兼容Flexvolume PV存储的CSI插件。
TranslateInTreeStorageClassToCSI:
TranslateInTreePVToCSI:
TranslateCSIPVToInTree:
感谢您的阅读,也欢迎您发表关于这篇文章的任何建议,关注我,技术不迷茫!
云原生钻石课程 | 第4课:Kubernetes存储架构原理深度剖析(上)
云原生钻石课程 | 第3课:Kubernetes高级调度器原理详解
彻底搞懂 K8S Pod Pending 故障原因及解决方案
MySQL性能优化(七):MySQL执行计划,真的很重要,来一起学习吧
微服务架构下的核心话题 (三):微服务架构的技术选型
喜欢就点个"在看"呗,留言、转发朋友圈
云原生钻石课程 | 第5课:Kubernetes存储架构原理深度剖析(下)相关推荐
- 云原生钻石课程 | 第6课:Kubernetes网络架构原理深度剖析(上)
点击上方"程序猿技术大咖",关注并选择"设为星标" 回复"加群"获取入群讨论资格! 本篇文章来自<华为云云原生王者之路训练营>钻 ...
- 云原生钻石课程 | 第2课:Kubernetes 技术架构深度剖析
点击上方"程序猿技术大咖",关注并选择"设为星标" 回复"加群"获取入群讨论资格! 本篇文章来自<华为云云原生王者之路训练营>钻 ...
- 【云驻共创】华为云云原生之Kubernetes网络架构原理深度剖析(上)
文章目录 前言 一.Kubernetes诞生背景 1.云原生的概念 2.云原生架构 3.Kubernetes(k8s) 二.Kubernetes基本网络模型剖析 1.概念厘清 1.1 二层桥接 VS ...
- 云原生钻石课程|第8课:Kubernetes运维管理详解(上)
点击上方"程序猿技术大咖",关注并选择"设为星标" 回复"加群"获取入群讨论资格! 本篇文章来自<华为云云原生王者之路训练营>钻 ...
- 云原生钻石课程 | 第1课:容器运行时技术深度剖析
点击上方"程序猿技术大咖",关注并选择"设为星标" 回复"加群"获取入群讨论资格! 本篇文章来自<华为云云原生王者之路训练营>钻 ...
- 课时 21:Kubernetes 存储架构及插件使用(阚俊宝)
本文将主要分享以下三方面的内容: Kubernetes 存储体系架构: Flexvolume 介绍及使用: CSI 介绍及使用. Kubernetes 存储体系架构 引例: 在 Kubernetes ...
- 从零开始入门 K8s | Kubernetes 存储架构及插件使用
作者 | 阚俊宝 阿里巴巴高级技术专家 本文整理自<CNCF x Alibaba 云原生技术公开课>第 21 讲. 关注"阿里巴巴云原生"公众号,回复关键词**&quo ...
- 福利!百度免费开放内部云原生精品课程
近年来,云原生的关注度居高不下,全世界的开发者都对由此而兴起的一众技术十分追捧,中国的开发者们也经历了从关注"云原生概念"到关注"云原生落地实践"的转变.在企业 ...
- 【腾讯云原生降本增效大讲堂】Kubernetes云上资源的分析与优化
嘉宾 | 胡启明 出品 | CSDN云原生 2022年6月30日,中国信通院.腾讯云.FinOps产业标准工作组联合发起的<原动力x云原生正发声 降本增效大讲堂>系列直播活动第2讲如期举行 ...
最新文章
- linux里面查看llvm的版本,linux llvm安装
- python多版本和隔离环境配置
- JS日历控件集合----附效果图、源代码
- 网易宣布:招30人![免费加入]网易java人才培养计划!
- linux vi 撤销与恢复,vi撤销与恢复
- 搜狗浏览器广告拦截插件_拦截烦人的网页广告,增加上网体验
- 学python买什么书-想学python看哪些书
- 【Luogu4921】情侣?给我烧了!(组合计数)
- 基于jQuery或Zepto实现实时监控用户浏览信息
- 关于oracle的笔记
- 网络信息安全常用术语
- python deap_python 的 DEAP框架学习
- def demo什么意思python_你知道Python的所有入门级知识吗?,这些,都,会,了
- linux启动lighttpd服务,Linux下Lighttpd的安装配置
- 四金及个人所得税的计算方法
- 如何提取Excel中部分内容?
- C语言编写取单词首字母,C语言练习之单词首字母大写
- O2O、C2C、B2B、B2C是什么意思 有什么区别
- 早,每天都是一段全新的旅程
- Python3 shutil(高级文件操作 模块)
热门文章
- Chrome浏览器的自动安装下载工具
- Save Failed Compilation unit name must end with .java, or one of the registered java-like extension
- rip连动bfd实验+理论
- linux ping 命令详解
- 欢送离职同事聚餐通知
- 15 分钟无门槛构建服务器性能监控系统
- matlab实验代码(总)
- python xlsx追加数据_python 实现众多excel表格中关键数据追加项目配置库台账.xlsx...
- 五个人捕鱼和分鱼的计算
- C语言编程>第二十五周 ② 下列程序中,函数fun的功能是:将大写字母转换为对应小写字母之后的第五个字母,若为小写字母为v~z,使小写字母的值减21,转换后的小写字母作为函数值返回。