
目录一、实验背景二、问题现象三、问题根因分析核心重点根本原因1Master 节点无 OpenEBS LVM 代理组件根本原因2Master 节点默认没有 OpenEBS 要求的 lvmvg 卷组根本原因3Pod 默认无法调度到 Master 节点总结死锁逻辑四、完整解决方案步骤1给 OpenEBS LVM 节点组件添加 Master 污点容忍步骤2Master 节点用 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 storage3. 所有节点磁盘空间完全充足df 查看仅占用 10%左右排除机器磁盘满的问题4. PVC 一直处于 Pending无法绑定 PV无法完成挂载5. 只要不限制 Master 调度Pod 可以正常跑到 Worker 节点并正常运行。三、问题根因分析核心重点很多人会被报错误导以为是机器硬盘不够真正原因和磁盘空间无关。根本原因1Master 节点无 OpenEBS LVM 代理组件OpenEBS LVM CSI 依靠节点上的openebs-lvm-node组件管理本地 LVM 卷、动态创建 LV/PV。K8s Master 节点默认带有控制平面污点DaemonSet 默认无法在 Master 部署 Pod导致Master 节点没有 LVM 代理 → 无法创建 LVM 逻辑卷 → PVC 无法绑定 → Pod 无法调度根本原因2Master 节点默认没有 OpenEBS 要求的 lvmvg 卷组OpenEBS LVM 存储类固定读取名为 lvmvg 的卷组且不允许直接使用系统默认 ubuntu-vg。实验要求不能加物理磁盘因此需要通过 Linux loop 虚拟设备 模拟磁盘创建 lvmvg。根本原因3Pod 默认无法调度到 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 --typejson -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。步骤2Master 节点用 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状态 Bound4. 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容忍 节点亲和。