温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

k8s通过ceph-csi接入存储的实例分析

发布时间:2021-12-16 09:46:25 来源:亿速云 阅读:429 作者:柒染 栏目:云计算

k8s通过ceph-csi接入存储的实例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

概述

下面的分析是k8s通过ceph-csi接入ceph存储(csi相关组件的分析以rbd为例进行分析),对所涉及的k8s对象与组件进行了简单的介绍,以及对存储进行操作的流程分析,存储相关操作包括了存储创建、存储扩容、存储挂载、解除存储挂载以及存储删除操作。

关联链接

ceph-csi套件分析目录导航

涉及k8s对象

1. PersistentVolume

持久存储卷,集群级别资源,代表了存储卷资源,记录了该存储卷资源的相关信息。

回收策略

(1)retain:保留策略,当删除PVC的时候,PV与外部存储资源仍然存在。

(2)delete:删除策略,当与pv绑定的pvc被删除的时候,会从k8s集群中删除PV对象,并执行外部存储资源的删除操作。

(3)resycle(已废弃)

pv状态迁移

available --> bound --> released

2. PersistentVolumeClaim

持久存储卷声明,namespace级别资源,代表了用户对于存储卷的使用需求声明。

pvc状态迁移

pending --> bound

3. StorageClass

定义了创建pv的模板信息,集群级别资源,用于动态创建pv。

涉及组件与作用

下面先简单介绍下涉及的组件与作用,后面会有单独详细的介绍各个组件的作用。

1. controller manager

PV controller

负责pv、pvc的绑定与生命周期管理,并根据需求进行创建/删除底层存储的操作,并创建/删除pv对象。

本次的分析为k8s通过ceph-csi来使用ceph存储。本次分析中,创建/删除底层存储、创建/删除pv对象的操作由external-provisioner来触发完成,所以本次分析中的PV controller只负责pv、pvc的绑定与生命周期管理。

AD controller

主要负责存储设备的Attach/Detach操作(如创建、删除VolumeAttachment对象,将数据卷挂载到特定node节点上等);以及更新node.Status.VolumesAttached。

本次的分析为k8s通过ceph-csi来使用ceph存储。本次分析中,AD controller只创建/删除VolumeAttachment对象,而不会真正的将数据卷挂载到节点/从节点上解除挂载;csi-attacer组件也不会做挂载/解除挂载操作,只是更新VolumeAttachment对象,真正的节点挂载/解除挂载操作由kubelet中的volume manager调用ceph-csi来完成。

2. kubelet

volume manager

主要是管理卷的Attach/Detach(与AD controller作用相同,通过kubelet启动参数控制哪个组件来做该操作,后续会详细介绍)、mount/umount等操作。

本次的分析为k8s通过ceph-csi来使用ceph存储。本次分析中,volume manager的Attach/Detach操作只创建/删除VolumeAttachment对象,而不会真正的将数据卷挂载到节点/从节点上解除挂载;csi-attacer组件也不会做挂载/解除挂载操作,只是更新VolumeAttachment对象,真正的节点挂载/解除挂载操作由kubelet中volume manager调用rc.operationExecutor.MountVolume/rc.operationExecutor.UnmountDevice方法时,调用ceph-csi来完成。

3. volume plugin

扩展各种存储类型的卷的管理能力,实现第三方存储的各种操作能力与k8s存储系统的结合。调用第三方存储的接口或命令,从而提供数据卷的创建/删除、attach/detach、mount/umount的具体操作实现,可以认为是第三方存储的代理人。前面分析组件中的对于数据卷的创建/删除、attach/detach、mount/umount操作,全是调用volume plugin来完成。

后续对volume plugin的详细分析,以通过ceph-csi操作rbd为例进行分析。

根据源码所在位置,volume plugin分为in-tree与out-of-tree。

in-tree

在k8s源码内部实现,和k8s一起发布、管理,更新迭代慢、灵活性差。

out-of-tree

代码独立于k8s,由存储厂商实现,有csi、flexvolume两种实现。

本次的分析为k8s通过ceph-csi来使用ceph存储。本次分析中的volume plugin是指ceph-csi及其相关组件,包括ceph-csi、external-provisioner、external-attacher、external-resizer等。

存储相关操作流程分析

下面对每个操作的整体流程进行分析,后面会对涉及的每个组件进行源码分析。

1. 存储创建

流程图

k8s通过ceph-csi接入存储的实例分析

流程分析

(1)用户创建pvc对象;

(2)external-provisioner组件监听到pvc的新增事件,调用csi组件进行存储的创建;

(3)csi组件调用ceph创建底层存储;

(4)底层存储创建完成后,external-provisioner根据存储信息,拼接pv对象,创建pv对象;

(5)pv controller监听pvc对象,寻找合适的pv对象,与pvc对象绑定。

2. 存储扩容

流程图

k8s通过ceph-csi接入存储的实例分析

流程分析

(1)修改pvc对象,修改申请存储大小;

(2)修改成功后,external-resizer监听到该pvc的update事件,发现pvc.Spec.Resources.Requests.storgage比pvc.Status.Capacity.storgage大,于是调csi controller端扩容,进行底层存储扩容,扩容完毕后更新pv对象的.Spec.Capacity.storgage;

(3)kubelet的volume manager在reconcile()调谐过程中发现pv.Spec.Capacity.storage大于pvc.Status.Capacity.storage,于是调csi node端扩容,对dnode上存储对应的文件系统扩容,成功后kubelet更新pvc.Status.Capacity.storage。

3. 存储挂载

流程图

kubelet启动参数--enable-controller-attach-detach,该启动参数设置为 true 表示启用 Attach/Detach controller进行Attach/Detach 操作,同时禁用 kubelet 执行 Attach/Detach 操作(默认值为 true)。实际上Attach/Detach 操作就是创建/删除VolumeAttachment对象。

(1)kubelet启动参数--enable-controller-attach-detach=true,Attach/Detach controller进行Attach/Detach 操作
k8s通过ceph-csi接入存储的实例分析

(2)kubelet启动参数--enable-controller-attach-detach=false,kubelet端volume manager进行Attach/Detach 操作 k8s通过ceph-csi接入存储的实例分析

流程分析

(1)用户创建一个挂载了pvc的pod;

(2)AD controller或volume manager中的reconcile()发现有volume未执行attach操作,于是进行attach操作,即创建VolumeAttachment对象;

(3)external-attacher组件list/watch VolumeAttachement对象,更新VolumeAttachment.status.attached=true;

(4)AD controller更新node对象的.Status.VolumesAttached属性值,将该volume记为attached;

(5)kubelet中的volume manager获取node.Status.VolumesAttached属性值,发现volume已被标记为attached;

(6)于是volume manager中的reconcile()调用ceph-csi组件的NodeStageVolume与NodePublishVolume完成挂载。

4. 解除存储挂载

流程图

(1)AD controller
k8s通过ceph-csi接入存储的实例分析

(2)volume manager k8s通过ceph-csi接入存储的实例分析

流程分析

(1)用户删除声明了pvc的pod;

(2)AD controller或volume manager中的reconcile()发现有volume未执行dettach操作,于是进行dettach操作,即删除VolumeAttachment对象;

(3)AD controller或volume manager等待VolumeAttachment对象删除成功;

(4)AD controller更新新node对象的.Status.VolumesAttached属性值,将标记为attached的该volume从属性值中去除;

(5)kubelet中的volume manager获取node.Status.VolumesAttached属性值,找不到相关的volume信息;

(6)于是volume manager中的reconcile()调用ceph-csi组件的NodeUnpublishVolume与NodeUnstageVolume完成解除挂载。

5. 删除存储

流程图

k8s通过ceph-csi接入存储的实例分析

流程分析

(1)用户删除pvc对象;

(2)pv controller发现与pv绑定的pvc对象被删除,于是更新pv的状态为released;

(3)external-provisioner watch到pv更新事件,并检查pv的状态是否为released,以及回收策略是否为delete;

(4)接下来external-provisioner组件会调用ceph-csi的DeleteVolume来删除存储;

(5)ceph-csi组件的DeleteVolume方法,调用ceph集群命令,删除底层存储;

(6)external-provisioner组件删除pv对象。

关于k8s通过ceph-csi接入存储的实例分析问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

k8s
AI