Kubernetes必备知识: Kubernetes Flexvolume

简介: FlexVolume 是 Kubernetes v1.8+ 支持的一种存储插件扩展方式。类似于 CNI 插件,它需要外部插件将二进制文件放到预先配置的路径中(如 /usr/libexec/kubernetes/kubelet-plugins/volume/exec/),并需要在系统中安装好所有需要的依赖。可以想到,这是一种out-tree的扩展方式,不需要新增加一种存储插件,去更改k8s的源码。

所属技术领域:

K8s

|名词定义|

FlexVolume 是 Kubernetes v1.8+ 支持的一种存储插件扩展方式。类似于 CNI 插件,它需要外部插件将二进制文件放到预先配置的路径中(如 /usr/libexec/kubernetes/kubelet-plugins/volume/exec/),并需要在系统中安装好所有需要的依赖。可以想到,这是一种out-tree的扩展方式,不需要新增加一种存储插件,去更改k8s的源码。

|技术特点|

 Flexvolume的特点
1.Flexvolume实现了VolumePlugin的Attach/Detach/Mount/Unmount接口定义,这些接口由第三方实现,并按照一定规则调用接口。
2.Flexvolume是一个有Kubelet驱动的可执行文件,每一次接口调用均为一次可执行文件的命令行调用;不是常驻内存的守护进程;
3.调用Flexvolume的Stdout作为kubelet调用的返回结果,要求json格式
4.默认存放地址:/user/libexec/kubernetes/kubelet-plugins/volume/exec/alicloud~disk/disk
所有挂载均先将远程设备挂载到本地主机,然后从主机通过bind映射到容器内部
图片.png

 Felxvolume接口介绍
图片.png

 Flexvolume挂载分析
快存储需要Attach、格式化、Mount等操作,所以流程较长,步骤多;
MountDevice是Mount的一部分,执行一些公共操作:格式化、挂载device到GlobalPath等;
文件存储无需Attach操作,只需从远端mount到主机,流程要简单;
开发Flexvolume驱动的过程即为实现Flexvolume接口的过程,实现中通过调用OpenApi等方式挂载第三方存储设备。
图片.png

 Flexvolume代码示例
图片.png

 Flexvolume使用示例
Flexvolume存储卷的定义格式和其他In-Tree存储类型格式一致,区别在存储类型为Flexvolume;
Flexvolume参数定义:
 driver:定义插件类型,会根据这个参数到某个目录下面找插件的可执行文件;
 fsType:定义存储卷文件系统类型
 options:为一个Map参数类型,可以定义所有与存储类型、挂载相关的具体参数
可以通过Selector、Label的方式,定向配置PV、PVC绑定管理;PV可以通过Label或者NodeAffinity配置调度信息;
Flexvolume 存储卷可以使用静态存储或者动态存储方式,动态存储卷需要在集群中部署Provisioner插件;下面例子可以看出:
 EBS存储卷(ID d-wz9bkj7jhbb4jo77n1tz)先挂再到主机上,设备名为/dev/vdb舌v、v而u、设备名;
 然后/dev/vdb挂载到一个全局目录;然后再挂载到Pod所在目录;
 最后从Pod目录映射到Pod(容器)内部的/data目录
图片.png

 与kubelet 的关系
前面讲到自定义的存储插件是放到/usr/libexec/kubernetes/kubelet-plugins/volume/exec/下,具体目录是/usr/libexec/kubernetes/kubelet-plugins/volume/exec//。
在pod的spec中申明用到了你自定义的插件后,格式为 /,实际上是kubelet 按照接口规范去调用对应插件。
所以需要注意以下几点:
 在debug的过程中,FlexVolume的日志需要在kubelet.log中查看
 部署方式一般都是daemonset。这样可以保证每台node 都会存在自定义插件。
从k8s1.8 开始支持了动态插件发现,flexvolume支持动态检测驱动程序的功能。系统运行时,可以安装,升级/降级和卸载驱动程序,而不是在系统初始化时要求驱动程序存在或必须重新启动kubelet或控制器管理器。

|资料来源|

名词定义:https://studygolang.com/articles/23351
技术特点:https://studygolang.com/articles/23351

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
存储 Kubernetes 安全
Kubernetes必备知识: PersistentVolumeClaim
PersistentVolumeClaim(简称PVC)是用户存储的请求,PVC消耗PV的资源,可以请求特定的大小和访问模式,需要指定归属于某个Namespace,在同一个Namespace的Pod才可以指定对应的PVC。 当需要不同性质的PV来满足存储需求时,可以使用StorageClass来实现。 每个 PVC 中都包含一个 spec 规格字段和一个 status 声明状态字段。
3765 0
Kubernetes必备知识: PersistentVolumeClaim
|
存储 Kubernetes 负载均衡
【Kubernetes的Service Mesh发展历程及Istio架构、存储供应使用NFS flexvolume CSI接口】
【Kubernetes的Service Mesh发展历程及Istio架构、存储供应使用NFS flexvolume CSI接口】
240 0
|
canal Kubernetes 负载均衡
Kubernetes必备知识: 主流网络方案
常见的容器网络方案可以从协议栈层级、穿越形态、隔离方式这三种形式进行划分。 协议栈层级: 第一种:协议栈二层。 第二种:协议栈三层(纯路由转发)。 第三种:协议栈二层加三层。
1105 0
Kubernetes必备知识: 主流网络方案
|
Kubernetes 算法 容灾
Kubernetes必备知识: 调度流程
scheduler 是k8s master的一部分,作为插件存在于k8s生态体系。
929 0
Kubernetes必备知识: 调度流程
|
存储 Kubernetes Linux
Kubernetes必备知识: 容器接口CRI
每种容器运行时各有所长,许多用户都希望Kubernetes支持更多的运行时。在Kubernetes 1.5发布版里,我们引入了CRI–一个能让kubelet无需编译就可以支持多种容器运行时的插件接口。CRI包含了一组protocol buffers,gRPC API,相关的库,以及在活跃开发下的额外规范和工具。CRI目前是Alpha版本。 支持可替换的容器运行时在Kubernetes中概念中并非首次。在1.3发布版里,我们介绍了rktnetes项目,它可以让rkt容器引擎作为Docker容器运行时的一个备选。然而,不管是Docker还是Rkt都需要通过内部、不太稳定的接口直接集成到kubele
740 0
Kubernetes必备知识: 容器接口CRI
|
Kubernetes 算法 API
Kubernetes必备知识: 配置调度器
Kubernetes调度程序是一项策略丰富,可感知拓扑,特定于工作负载的功能,会显着显著影响可用性,性能和容量。调度程序需要考虑单个和集体的资源需求,服务质量需求,硬件/软件/策略约束,亲和力和反亲和力规范,数据位置,工作负载间的干扰,期限等。特定于工作负载的需求将在必要时通过API公开。
622 0
Kubernetes必备知识: 配置调度器
|
数据采集 缓存 Kubernetes
Kubernetes必备知识: 扩展调度器
Kubernetes 自带了一个默认调度器kube-scheduler,其内置了很多节点预选和优选的调度算法,一般调度场景下可以满足要求。但是在一些特殊场景下,默认调度器不能满足我们复杂的调度需求。我们就需要对调度器进行扩展,以达到调度适合业务场景的目的。
1006 0
Kubernetes必备知识: 扩展调度器
|
存储 Kubernetes 容器
Kubernetes必备知识: StorageClass
StorageClass提供了一种描述存储类(class)的方法,不同的class可能会映射到不同的服务质量等级和备份策略或其他策略等。 StorageClass 对象中包含 provisioner、parameters 和 reclaimPolicy 字段,当需要动态分配 PersistentVolume 时会使用到。当创建 StorageClass 对象时,设置名称和其他参数,一旦创建了对象就不能再对其更新。也可以为没有申请绑定到特定 class 的 PVC 指定一个默认的 StorageClass 。
1995 0
Kubernetes必备知识: StorageClass
|
存储 Kubernetes 网络协议
Kubernetes必备知识: StatefulSet
StatefulSet是为了解决有状态服务的问题(对应Deployments和ReplicaSets是为无状态服务而设计),其应用场景包括  稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现  稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现  有序部署,有序扩展,即Pod是有顺序的
728 0
Kubernetes必备知识: StatefulSet
|
Kubernetes 网络协议 安全
Kubernetes必备知识: pod网络模型
k8s对Pods之间如何进行组网通信提出了要求,k8s对集群的网络有以下要求: • 所有的Pods之间可以在不使用NAT网络地址转换的情况下相互通信 • 所有的Nodes之间可以在不使用NAT网络地址转换的情况下相互通信 • 每个Pod自己看到的自己的ip和其他Pod看到的一致
3867 0
Kubernetes必备知识: pod网络模型