点击上方“程序猿技术大咖”,关注并选择“设为星标”

回复“加群”获取入群讨论资格!

本篇文章来自《华为云云原生王者之路训练营》钻石系列课程第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存储架构原理深度剖析(下)相关推荐

  1. 云原生钻石课程 | 第6课:Kubernetes网络架构原理深度剖析(上)

    点击上方"程序猿技术大咖",关注并选择"设为星标" 回复"加群"获取入群讨论资格! 本篇文章来自<华为云云原生王者之路训练营>钻 ...

  2. 云原生钻石课程 | 第2课:Kubernetes 技术架构深度剖析

    点击上方"程序猿技术大咖",关注并选择"设为星标" 回复"加群"获取入群讨论资格! 本篇文章来自<华为云云原生王者之路训练营>钻 ...

  3. 【云驻共创】华为云云原生之Kubernetes网络架构原理深度剖析(上)

    文章目录 前言 一.Kubernetes诞生背景 1.云原生的概念 2.云原生架构 3.Kubernetes(k8s) 二.Kubernetes基本网络模型剖析 1.概念厘清 1.1 二层桥接 VS ...

  4. 云原生钻石课程|第8课:Kubernetes运维管理详解(上)

    点击上方"程序猿技术大咖",关注并选择"设为星标" 回复"加群"获取入群讨论资格! 本篇文章来自<华为云云原生王者之路训练营>钻 ...

  5. 云原生钻石课程 | 第1课:容器运行时技术深度剖析

    点击上方"程序猿技术大咖",关注并选择"设为星标" 回复"加群"获取入群讨论资格! 本篇文章来自<华为云云原生王者之路训练营>钻 ...

  6. 课时 21:Kubernetes 存储架构及插件使用(阚俊宝)

    本文将主要分享以下三方面的内容: Kubernetes 存储体系架构: Flexvolume 介绍及使用: CSI 介绍及使用. Kubernetes 存储体系架构 引例: 在 Kubernetes ...

  7. 从零开始入门 K8s | Kubernetes 存储架构及插件使用

    作者 | 阚俊宝 阿里巴巴高级技术专家 本文整理自<CNCF x Alibaba 云原生技术公开课>第 21 讲. 关注"阿里巴巴云原生"公众号,回复关键词**&quo ...

  8. 福利!百度免费开放内部云原生精品课程

    近年来,云原生的关注度居高不下,全世界的开发者都对由此而兴起的一众技术十分追捧,中国的开发者们也经历了从关注"云原生概念"到关注"云原生落地实践"的转变.在企业 ...

  9. 【腾讯云原生降本增效大讲堂】Kubernetes云上资源的分析与优化

    嘉宾 | 胡启明 出品 | CSDN云原生 2022年6月30日,中国信通院.腾讯云.FinOps产业标准工作组联合发起的<原动力x云原生正发声 降本增效大讲堂>系列直播活动第2讲如期举行 ...

最新文章

  1. linux里面查看llvm的版本,linux llvm安装
  2. python多版本和隔离环境配置
  3. JS日历控件集合----附效果图、源代码
  4. 网易宣布:招30人![免费加入]网易java人才培养计划!
  5. linux vi 撤销与恢复,vi撤销与恢复
  6. 搜狗浏览器广告拦截插件_拦截烦人的网页广告,增加上网体验
  7. 学python买什么书-想学python看哪些书
  8. 【Luogu4921】情侣?给我烧了!(组合计数)
  9. 基于jQuery或Zepto实现实时监控用户浏览信息
  10. 关于oracle的笔记
  11. 网络信息安全常用术语
  12. python deap_python 的 DEAP框架学习
  13. def demo什么意思python_你知道Python的所有入门级知识吗?,这些,都,会,了
  14. linux启动lighttpd服务,Linux下Lighttpd的安装配置
  15. 四金及个人所得税的计算方法
  16. 如何提取Excel中部分内容?
  17. C语言编写取单词首字母,C语言练习之单词首字母大写
  18. O2O、C2C、B2B、B2C是什么意思 有什么区别
  19. 早,每天都是一段全新的旅程
  20. Python3 shutil(高级文件操作 模块)

热门文章

  1. Chrome浏览器的自动安装下载工具
  2. Save Failed Compilation unit name must end with .java, or one of the registered java-like extension
  3. rip连动bfd实验+理论
  4. linux ping 命令详解
  5. 欢送离职同事聚餐通知
  6. 15 分钟无门槛构建服务器性能监控系统
  7. matlab实验代码(总)
  8. python xlsx追加数据_python 实现众多excel表格中关键数据追加项目配置库台账.xlsx...
  9. 五个人捕鱼和分鱼的计算
  10. C语言编程>第二十五周 ② 下列程序中,函数fun的功能是:将大写字母转换为对应小写字母之后的第五个字母,若为小写字母为v~z,使小写字母的值减21,转换后的小写字母作为函数值返回。