k8s OpenLocal存储
参考项目https://github.com/alibaba/open-local v0.7.1
NodeLocalStorage定义
NodeLocalStorage cr表示每个k8s节点本地存储资源信息。
controller创建后由节点上agent更新status,从而维护存储信息。
apiVersion: csi.aliyun.com/v1alpha1 kind: NodeLocalStorage spec: nodeName: [node name] # 与节点名称相同 listConfig: # 可被 Open-Local 分配的存储设备列表,形式为正则表达式。Status 中 .nodeStorageInfo.deviceInfo 和 .nodeStorageInfo.volumeGroups 满足该正则表达式的设备名称将成为 Open-Local 具体可分配的存储设备列表,并在 Status 的 .filteredStorageInfo 中显示。Open-Local 先通过 include 得出全量列表,然后通过 exclude 从全量列表中剔除不需要的项 devices: # Device(独占盘)名单 include: # include 正则 - /dev/vd[a-d]+ exclude: # exclude 正则 - /dev/vda - /dev/vdb vgs: # LVM(共享盘)白黑名单,这里的共享盘名称指的是 VolumeGroup 名称 include: - share - paas[0-9]* - open-local-pool-[0-9]+ resourceToBeInited: # 设备初始化列表 vgs: # LVM(共享盘)初始化 - devices: # 将块设备 /dev/vdb3 初始化为名为 open-local-pool-0 的 VolumeGroup。注意:当节点上包含同名 VG,则 Open-Local 不做操作 - /dev/vdb3 name: open-local-pool-0 status: nodeStorageInfo: # 具体设备情况,由 Agent 组件更新。包含 分区 和 一整个块设备。设备名称可由 open-local agent --regexp 参数决定(默认为 ^(s|v|xv)d[a-z]+$ ) deviceInfo: # 磁盘情况 - condition: DiskReady # 磁盘状态,有三种状态:DiskReady、DiskFull、DiskFault mediaType: hdd # 媒介类型,分为 hdd 和 sdd 两种 name: /dev/vda1 # 设备名称 readOnly: false # 是否只读 total: 53685353984 # 设备总量 - condition: DiskReady mediaType: hdd name: /dev/vda readOnly: false total: 53687091200 - condition: DiskReady mediaType: hdd name: /dev/vdb1 readOnly: false total: 107374164992 - condition: DiskReady mediaType: hdd name: /dev/vdb2 readOnly: false total: 106300440576 - condition: DiskReady mediaType: hdd name: /dev/vdb3 readOnly: false total: 860066152448 - condition: DiskReady mediaType: hdd name: /dev/vdb readOnly: false total: 1073741824000 - condition: DiskReady mediaType: hdd name: /dev/vdc readOnly: false total: 1073741824000 volumeGroups: # VolumeGroup 情况 - allocatable: 860063006720 # 可被 Open-Local 分配的VG可用量,会剔除非 Open-Local 的 LV 总量。Open-Local 的 LV 名称由 open-local agent --lvname 参数决定,前缀不匹配的 LV 为非 Open-Local 的 LV。 available: 800298369024 # VG 可用量 condition: DiskReady # VG 状态 logicalVolumes: # LV 信息 - condition: DiskReady # LV 状态 name: local-482c664d-764b-461e-be5e-0a60a3abd5ac # LV 名称 total: 1073741824 # LV 总量 vgname: open-local-pool-0 # LV 所在的 VG 名称 - condition: DiskReady name: local-4e0b8d6f-8ea2-431d-8b5d-aaec1b5d4242 total: 53687091200 vgname: open-local-pool-0 - condition: DiskReady name: local-cc69d090-15b9-4abd-af1f-04380e1654d9 total: 5003804672 vgname: open-local-pool-0 name: open-local-pool-0 # VG 名称 physicalVolumes: # VG 对应的 PVs(Physical Volumes) - /dev/vdb3 total: 860063006720 # VG 总量 filteredStorageInfo: # 设备筛选情况,筛选后的设备会参与存储调度&分配。该字段的值由 Status 中的 .nodeStorageInfo.deviceInfo 和 .nodeStorageInfo.volumeGroups 与 Spec 中的 .listConfig 共同决定。本例中 Spec 的 VG 列表中有 open-local-pool-[0-9]+,且该节点有名为 open-local-pool-0 的 VG,故可被纳管。/dev/vdc 同理。 volumeGroups: - open-local-pool-0 devices: - /dev/vdc
CSI基本流程
1. 用户创建带有PVC的StatefulSet。
2. PvController调用External Provisioner来创建PV,本地存储未创建真实的lv。
3. 调度带有PVC的Pod时,kube-scheduler调用extender注册的接口,根据存储情况确定创建lv的节点。
4. PvController完成PVC和PV的延迟绑定后,kube-scheduler完成调度Pod。
5. kubelet拉起Pod时,csi创建lv,把lv挂载到PV卷目录,相当于完成了attach+mount。kubelet再把PV卷目录挂载到容器目录。
创建lv基本流程
pv物理卷-vg卷组-lv逻辑卷
/dev/sdc2是1个磁盘分区。
1. 创建物理卷pv:pvcreate /dev/sdc2
2. 创建vg:vgcreate s2 /dev/sdc2
3. 创建lv:lvcreate --size 1G --name lv_test s2
4. 格式化:mkfs.ext4 /dev/s2/lv_test
5. 挂载:mkdir /apps/a; mount /dev/s2/lv_test /apps/a
6. 确认挂载完成:df -h | grep lv_test
节点重启恢复PV挂载点
非节点重启情况下,如果pause容器退出,那么kubelet重拉pause容器,会调用cni,不会调用csi,因为network namespace独属于pause容器,attach+mount pv在第1次拉起pod时已完成。
节点重启后,重新把lv挂载到PV卷目录。
方法1:通过Linux /etc/fstab自动恢复。
方法2:kubelet发起CSI恢复(OpenLocal采用)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
2024-01-14 client-go连接数
2023-01-14 获取kubelet管理的容器