kubernetes学习笔记1:k8s挂载volume过程

k8s挂载volume过程:

第一步,用户创建包含PVC的pod,

第二步,PVC controller会不断观察APIserver,如果发现创建完成的PVC处于未绑定状态,它就会试图绑定pv跟PVC,

第三步,通过scheduler完成调度,

第四步,pod调度到节点之后,但是pv还没有被挂载attach,此时AD controller就会调用volumeplugin,把远端的volume挂载到目标节点的设备上,如/dev/vdb,

第五步,volume manager发现pod调度到自己节点上,并且完成了volume挂载,它就会执行mount操作,将本地设备,也就是刚才的/dev/vdb,挂载到pod在节点上的一个子目录,同时它可能最一些格式化,是否挂载到globalpath等这样附加操作,

第六步,绑定操作,就是将已经挂载到本地的volume映射到容器中。k8s存储架构:pv controller负责pv和PVC绑定,生命周期管理,包括创建,删除pv对象,pv和PVC状态的迁移,PVC根据volumemode,labelselector,storageclassname,Accessmode,size选择pv绑定,并根据需求进行数据卷的provision和delete操作,它有两个实现逻辑claimworkerPVC状态迁移和volumeworkerpv负责pv状态迁移,AD controller负责存储设备的attach和detach操作,将设备挂载到目标节点,它有很多informer,负责把集群中的pod状态,pv状态,node状态,PVC状态同步到本地,它还有有两个核心对象(desiredstateofworld和actualofworld),两个核心逻辑(desiredstateofworldpopulator和reconcile),volume manager管理卷的attach,detach,mount和UNmount操作,卷设备格式化以及挂载到一些公用目录上,它跟AD controller类似也包含desiredstateofworld和actualstateofworld,同时还有volumepluginmanager对象,主要节点上插件的管理,也有两个核心逻辑,volume plugins主要对上面所有挂载功能的实现,做具体的事情,上面的对象主要调用接口,从源码位置上分为in-tree和OUT-of-tree,从类型上分有很多,比如OUT-of-tree(csi,flexvolume),in-tree(nfs,cephfs,cinder),k8s通过volumepluginmanager对象管理插件,它有两种数据结果:plugins,prober。

scheduler实现对pod调度功能,会根据存储相关参数做存储相关的调度。

k8s存储卷调度,我们知道pod必须被调度到worker上才能运行。

flexvolume是volume plugins的扩展,主要实现attach/detach/mount/UNmount这些接口,这些接口已经被volume plugins实现,但是对于某些存储类型要扩展到volume plugins以外,所以把接口放在外面来实现,它是可以被kubelet驱动的可执行文件,每一次调用相当于执行一次ls这样的脚本,不是一个常驻内存的守护进程,flexvolume的stdout作为kubelet调用的返回结果,以json格式返回,它有几个接口:init,getvolumename,attach,waitforattach,mountdevice,getpath,setup,teardown,UNmount,detach,expandvolumedevice,nodeexpand。

flexvolume挂载过程有attach,mountdevice,mount,卸载过程就是挂载到逆过程。使用flexvolume跟其他类型的pv模板一样,只不过类型被定义为flexvolume,它有driver,fstype,options属性。

csi跟flexvolume类似,但是flexvolume只是给k8s这一个编排系统使用,csi可以满足不同的编排系统,csi是容器化部署,减少了环境依赖,增强安全,丰富插件功能,而且还可以通过rbac方式调用k8s的一些接口实现某些功能,但是必须在容器内部实现。

csi包含两部分:csi controller server(控制端功能,实现创建,删除,挂载等功能),csi node server(节点上的mount和UNmount功能),csi controller service和external csi sidecar通过unix socket通信,csi node server跟kubelet通过unix socket通信。

csi接口主要包含通用管控接口(通用信息,插件名字和driver信息和插件提供的能力和健康检查等),节点管控接口(nodestagevolume和nodeunstagevolume相当于flexvolume的mountdevice和unmountdevice。nodepublishvolume和nodeUNpublishvolume相当于setup和teardown),中心管控接口(createvolume和deletevolume相当于provision和delete存储卷的一个接口,controllerpublishvolume和controllerUNpublishvolume相当于attach和detach)。

csi系统结构:csi通过crd形式实现,引入了几个对象类型:volumeattachment,csinode,csidriver,csi controller server(有AD controller和volumeplugin用来创建volumeattachment)和csi node server(volumemanager和volumeplugin,用来调用csi plugin做mount和UNmount操作,driver Register主要实现csi plugin注册功能)。

csi对象有volumeattachment(描述挂载和卸载信息),csidriver(描述csi plugin列表,需要管理员根据插件类型创建,还定义k8s调用csi plugin行为),csinode(定义集群中的节点信息)。

使用csi跟flexvolume一样,只不过类型为csi,有属性driver(指定插件),volumehandler(指示pv的唯一标签),volumeattribute(附加参数),nodeaffinity(定义调度场景)。

posted @ 2020-04-28 15:52  ppjj  阅读(756)  评论(0)    收藏  举报