☄️openEBS lvm_localpv
type
status
date
slug
summary
tags
category
icon
password
Blocked by
Blocking
AI summary
背景
一直想学习CSI相关内容,恰好自己对LVM比较熟悉,openEBS lvm_localpv 有实现CSI,那么就来看看其具体实现吧https://github.com/openebs/lvm-localpv
LVM背景
可以参考我之前写的博客

CSI文档
Identity Service
查询插件的元信息和能力,通常在初始化阶段由CO(container Orchestrator容器编排工具)调用
Controller Service 中心管控接口
负责处理卷的生命周期,用于控制平面操作,如创建、删除、扩展存储卷,负责对存储资源的协调和调度
Node Service 节点管控接口
负责管理实际的存储节点,处理对于节点上存储的访问、挂载、卸载等操作,将存储设备挂载到k8s节点上的容器中
核心目录结构
非完整目录结构,只有
/pkg
下保留关键部分创建PV的过程
若想创建PV,那么此时会调用
CSI
的CreateVolume
CreateVolume
调用结束后,集群中LVMVolume
CR创建成功,LVMVolume Controller监听到后,调用informer的AddFunc
,将其加入WorkQueue中,而
processNextWorkItem
作为消费者,从workQueue中读取 item后续调用链为
processNextWorkItem
→ syncHandler
→ syncVol
→ CreateVolume
→ RunCommandSplit
,在此执行lvcreate
指令总结流程:
- 用户创建 PV,触发
CSI
的CreateVolume
请求。
CreateVolume
请求会解析参数并调用CreateLVMVolume
来创建 LVM 逻辑卷。
LVMVolume
CR 被创建并保存到 Kubernetes 中。
LVMVolume Controller
监听到 CR 的变化,将其加入工作队列。
- 工作队列的消费者(
processNextWorkItem
)处理任务,调用syncHandler
。
syncHandler
调用RunCommandSplit
执行lvcreate
命令,在节点上创建实际的逻辑卷。
- 逻辑卷创建完成后,
LVMVolume
CR 更新状态,表示卷已准备好。
Pod引用PVC的过程
对于使用PVC动态创建PV的场景,由storageClass对应的provisioner实现PV的创建,k8s调度器会根据节点的资源情况和Pod要求,将pod调度到合适节点,但在这个阶段会确认Pod最终在哪一个Node上运行,但不会立刻执行PVC的挂载
当POd被调度到Node上准备开始运行时,k8s会执行容器的启动流程
- 在容器启动过程中,Kubernetes 会通过 CSI 插件的
NodePublishVolume
操作将 PVC 挂载到容器内。这是实际的挂载操作,它会在节点上找到对应的存储卷(PV)并将其挂载到指定的目录(mountPath
)
总结流程:
- PVC 创建:由 Provisioner 动态创建 PV。
- Pod 调度:调度器根据资源情况将 Pod 调度到合适的节点。
NodePublishVolume
挂载:在 Pod 容器启动时,执行实际的卷挂载操作。
- 挂载类型:根据请求类型,执行 块设备挂载 或 文件系统挂载,并处理相关的 IO 限制
监控指标
对于磁盘IO,openEBS lvm_localPV会关注这些指标
Capacity-based Metrics
- 节点上的总预配容量:节点上所有卷组(Volume Groups,VG)的总容量。使用命令
vgs -o vg_size <vg_name>
可以获取特定卷组(VG)的总容量(vg_size)。如果不指定<vg_name>
,则会列出所有卷组的总容量。
- 节点上的总空闲容量:节点上所有卷组(VG)的总空闲容量。使用命令
vgs -o vg_free <vg_name>
可以获取特定卷组(VG)的空闲容量(vg_free)。如果不指定<vg_name>
,则会列出所有卷组的空闲容量。
- 节点上的总已用容量:节点上所有卷组(VG)的总已用容量。通过
vg_size
减去vg_free
得到已用容量(vg_used)值。
- 节点上的总已分配容量:节点上所有逻辑卷(LV)的总容量。使用命令
lvs -o lv_size <lv_full_name>
可以获取特定逻辑卷(LV)的容量(lv_size)。如果不指定<lv_full_name>
,则会列出所有逻辑卷的容量。
- 节点上所有 PVC 的总已用容量:节点上所有逻辑卷(LV)对应 PVC 的总已用容量。使用命令
lvs -o lv_size,data_percent,snap_percent,metadata_percent <lv_full_name>
可以获取特定逻辑卷(LV)的已用容量(lv_used)。如果不指定<lv_full_name>
,则会列出所有逻辑卷的已用容量。
usage-based Metrics
- IOPs
- 读取 IOPs:每秒从逻辑卷(LV)完成的读取请求数量。
- 写入 IOPs:每秒向逻辑卷(LV)完成的写入请求数量。
- Throughput
- 读取吞吐量:每秒从逻辑卷(LV)读取的字节数。
- 写入吞吐量:每秒向逻辑卷(LV)写入的字节数。
- Latency
- 读取延迟:每个读取请求从发起到响应的平均时间(单位:毫秒)。
- 写入延迟:每个写入请求从发起到响应的平均时间(单位:毫秒)。
- 等待中的 I/O:排队等待处理的读取和写入请求的数量,尚未被服务。
- 状态:逻辑卷(LV)的状态,指示其是“活动”还是“不可用”。
Prev
Golang GMP模型
Next
常见的网络设备
Loading...