共计 4316 个字符,预计需要花费 11 分钟才能阅读完成。
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. 存储创建
流程图
流程分析
(1)用户创建 pvc 对象;
(2)external-provisioner 组件监听到 pvc 的新增事件,调用 csi 组件进行存储的创建;
(3)csi 组件调用 ceph 创建底层存储;
(4)底层存储创建完成后,external-provisioner 根据存储信息,拼接 pv 对象,创建 pv 对象;
(5)pv controller 监听 pvc 对象,寻找合适的 pv 对象,与 pvc 对象绑定。
2. 存储扩容
流程图
流程分析
(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 操作
(2)kubelet 启动参数 –enable-controller-attach-detach=false,kubelet 端 volume manager 进行 Attach/Detach 操作
流程分析
(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
(2)volume manager
流程分析
(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. 删除存储
流程图
流程分析
(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 接入存储的实例分析问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注丸趣 TV 行业资讯频道了解更多相关知识。