☰
K8s OpenEBS LVM 动态存储 Pod 卡在 Pending 解决方法
2026/10/6 12:40:59 网站建设 项目流程

目录

一、实验背景

二、问题现象

三、问题根因分析(核心重点)

根本原因1:Master 节点无 OpenEBS LVM 代理组件

根本原因2:Master 节点默认没有 OpenEBS 要求的 lvmvg 卷组

根本原因3:Pod 默认无法调度到 Master 节点

总结死锁逻辑

四、完整解决方案

步骤1:给 OpenEBS LVM 节点组件添加 Master 污点容忍

步骤2:Master 节点用 loop 虚拟磁盘创建 lvmvg(无物理硬盘)

步骤3:编写支持 Master 调度的 Pod 配置

步骤4:标准 OpenEBS LVM PVC 配置

步骤5:重建资源

五、最终效果

六、总结


一、实验背景

在 Kubernetes 存储实验中,我们需要使用OpenEBS LVM CSI实现动态 PV/PVC 供给,完成容器持久化存储案例。

本次实验有两个硬性约束:

1. 业务 Pod 必须调度到 Master 节点;

2. 不允许新增物理磁盘,只能使用现有服务器资源完成 LVM 卷组创建。

正常流程:创建 OpenEBS LVM 存储类 → 创建 PVC → 创建 Pod,自动触发动态创建 PV,实现存储挂载。

但在实际部署时,出现了经典的Pod 永久 Pending、集群提示节点存储空间不足的报错问题。

二、问题现象

1. Pod 状态一直处于Pending,无法启动;

2. 调度事件报错:

0/3 nodes are available: 3 node(s) did not have enough free storage

3. 所有节点磁盘空间完全充足(df 查看仅占用 10%左右),排除机器磁盘满的问题;

4. PVC 一直处于 Pending,无法绑定 PV,无法完成挂载;

5. 只要不限制 Master 调度,Pod 可以正常跑到 Worker 节点并正常运行。

三、问题根因分析(核心重点)

很多人会被报错误导,以为是机器硬盘不够,真正原因和磁盘空间无关。

根本原因1:Master 节点无 OpenEBS LVM 代理组件

OpenEBS LVM CSI 依靠节点上的openebs-lvm-node组件管理本地 LVM 卷、动态创建 LV/PV。

K8s Master 节点默认带有控制平面污点:

DaemonSet 默认无法在 Master 部署 Pod,导致:

Master 节点没有 LVM 代理 → 无法创建 LVM 逻辑卷 → PVC 无法绑定 → Pod 无法调度

根本原因2:Master 节点默认没有 OpenEBS 要求的 lvmvg 卷组

OpenEBS LVM 存储类固定读取名为 lvmvg 的卷组,且不允许直接使用系统默认 ubuntu-vg。

实验要求不能加物理磁盘,因此需要通过 Linux loop 虚拟设备 模拟磁盘创建 lvmvg。

根本原因3:Pod 默认无法调度到 Master 节点

普通业务 Pod 默认无法容忍 Master 污点,无法调度到 Master,需要手动添加容忍+节点亲和策略。

总结死锁逻辑

Pod 想跑在 Master → Master 没有 LVM 代理无法创建 PV → PVC 卡住 → Pod 持续 Pending。

四、完整解决方案

步骤1:给 OpenEBS LVM 节点组件添加 Master 污点容忍

让 openebs-lvm-node 可以运行在 Master 节点(核心修复):

kubectl patch daemonset openebs-lvm-node -n kube-system --type=json -p '[ { "op":"add", "path":"/spec/template/spec/tolerations", "value":[ { "key":"node-role.kubernetes.io/control-plane", "operator":"Exists", "effect":"NoSchedule" } ] } ]'

执行后等待片刻,Master 节点会自动拉起 openebs-lvm-node Pod。

步骤2:Master 节点用 loop 虚拟磁盘创建 lvmvg(无物理硬盘)

纯文件模拟块设备,满足实验“不加磁盘”要求:

truncate -s 10G /tmp/lvm-loop.img losetup -f /tmp/lvm-loop.img losetup pvcreate /dev/loop0 vgcreate lvmvg /dev/loop0 vgs

执行 vgs 能看到 lvmvg 即为成功。

步骤3:编写支持 Master 调度的 Pod 配置

添加污点容忍 + 强制 Master 节点亲和

apiVersion: v1 kind: Pod metadata: name: dynamic-pod spec: tolerations: - key: node-role.kubernetes.io/control-plane operator: Exists effect: NoSchedule affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - k8s-master containers: - name: nginx image: nginx volumeMounts: - name: data mountPath: /data volumes: - name: data persistentVolumeClaim: claimName: dynamic-pvc

步骤4:标准 OpenEBS LVM PVC 配置

apiVersion: v1 kind: PersistentVolumeClaim metadata: name: dynamic-pvc spec: storageClassName: openebs-lvm accessModes: - ReadWriteOnce resources: requests: storage: 1Gi

步骤5:重建资源

kubectl delete pvc dynamic-pvc kubectl delete pod dynamic-pod kubectl apply -f pvc.yaml kubectl apply -f pod.yaml

五、最终效果

1. Master 节点成功运行 openebs-lvm-node 组件;

2. Master 存在合法 lvmvg 卷组;

3. PVC 自动绑定动态 PV,状态 Bound;

4. Pod 成功调度至 Master 节点并正常 Running;

六、总结

K8s 提示no enough free storage不一定是磁盘满了,在 OpenEBS LVM 场景下,代表节点不具备 LVM 存储供给能力。

想要 Pod 在 Master 节点使用 OpenEBS LVM 动态存储,必须满足三个条件:

1. LVM 节点代理能跑在 Master(加容忍);

2. Master 存在合法 lvmvg 卷组(可 loop 虚拟创建);

3. Pod 允许调度到 Master(容忍 + 节点亲和)。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询