☄️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背景

可以参考我之前写的博客
notion image

CSI文档

Identity Service

查询插件的元信息和能力,通常在初始化阶段由CO(container Orchestrator容器编排工具)调用

Controller Service 中心管控接口

负责处理卷的生命周期,用于控制平面操作,如创建、删除、扩展存储卷,负责对存储资源的协调和调度

Node Service 节点管控接口

负责管理实际的存储节点,处理对于节点上存储的访问、挂载、卸载等操作,将存储设备挂载到k8s节点上的容器中
 
 

核心目录结构

非完整目录结构,只有/pkg下保留关键部分
 

创建PV的过程

若想创建PV,那么此时会调用CSICreateVolume
CreateVolume调用结束后,集群中LVMVolume CR创建成功,LVMVolume Controller监听到后,调用informer的AddFunc,将其加入WorkQueue中,
processNextWorkItem 作为消费者,从workQueue中读取 item
后续调用链为processNextWorkItemsyncHandlersyncVolCreateVolumeRunCommandSplit,在此执行lvcreate 指令

总结流程:

  1. 用户创建 PV,触发 CSICreateVolume 请求。
  1. CreateVolume 请求会解析参数并调用 CreateLVMVolume 来创建 LVM 逻辑卷。
  1. LVMVolume CR 被创建并保存到 Kubernetes 中。
  1. LVMVolume Controller 监听到 CR 的变化,将其加入工作队列。
  1. 工作队列的消费者(processNextWorkItem)处理任务,调用 syncHandler
  1. syncHandler 调用 RunCommandSplit 执行 lvcreate 命令,在节点上创建实际的逻辑卷。
  1. 逻辑卷创建完成后,LVMVolume CR 更新状态,表示卷已准备好。
 

Pod引用PVC的过程

对于使用PVC动态创建PV的场景,由storageClass对应的provisioner实现PV的创建,k8s调度器会根据节点的资源情况和Pod要求,将pod调度到合适节点,但在这个阶段会确认Pod最终在哪一个Node上运行,但不会立刻执行PVC的挂载
当POd被调度到Node上准备开始运行时,k8s会执行容器的启动流程
  • 在容器启动过程中,Kubernetes 会通过 CSI 插件的 NodePublishVolume 操作将 PVC 挂载到容器内。这是实际的挂载操作,它会在节点上找到对应的存储卷(PV)并将其挂载到指定的目录(mountPath
 
 

总结流程:

  1. PVC 创建:由 Provisioner 动态创建 PV。
  1. Pod 调度:调度器根据资源情况将 Pod 调度到合适的节点。
  1. NodePublishVolume 挂载:在 Pod 容器启动时,执行实际的卷挂载操作。
  1. 挂载类型:根据请求类型,执行 块设备挂载文件系统挂载,并处理相关的 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...
Article List