volumeMode 控制什么
volumeMode 写在 PV 与 PVC 上,决定存储以什么形态交给容器:默认的 Filesystem 会先格式化再挂载成目录,容器里看到的是普通文件系统;设为 Block 则把裸块设备直接交进去,是否格式化、用什么文件系统由应用自己决定。数据库、自研存储组件需要独占设备、自己控制 fsync 与文件系统参数时用 Block,普通应用保持默认即可。
基本信息
| 适用平台 | Kubernetes 各版本,PV 与 PVC 的 spec 字段 |
|---|---|
| 取值 | Filesystem(默认)|Block |
| 容器侧引用 | Filesystem 用 volumeMounts.mountPath;Block 用 volumeDevices.devicePath |
| 一致性要求 | PVC 与 PV 的 volumeMode 必须相同,否则绑定失败 |
| 供应方式 | 静态 PV 手工声明,或由 StorageClass 动态供应,驱动需支持块模式 |
典型使用场景
- 数据库自管文件系统:希望在内核参数、对齐、快照策略上完全自主
- 既有存储组件迁移:原部署在裸盘上,容器化后仍需看到块设备
- 高性能顺序写场景:绕过文件系统缓存层,减少一层开销
- 带快照能力的云盘:块模式配合 CSI 快照做一致性备份
- 需要给容器暴露 /dev 设备做多路径或集群文件系统的场景
Block 声明
Block 声明
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: db-block
spec:
volumeMode: Block # 默认值为 Filesystem
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Gi
storageClassName: fast-ssd容器侧引用
容器侧引用
containers:
- name: db
image: registry.example.com/db:8.0
volumeDevices: # 块设备必须用 volumeDevices 而非 volumeMounts
- name: data
devicePath: /dev/xvda
volumes:
- name: data
persistentVolumeClaim:
claimName: db-block查看与核对
查看与核对
kubectl get pv -o custom-columns='PV:.metadata.name,MODE:.spec.volumeMode,STATUS:.status.phase'
kubectl get pvc db-block -o jsonpath='{.spec.volumeMode}'
kubectl describe pvc db-block | tail -20 # 绑定失败时这里给出不匹配原因两种模式对照
| 取值 | 容器看到什么 | 适用 |
|---|---|---|
| Filesystem | 已格式化的目录 | 绝大多数无状态与普通有状态应用 |
| Block | 裸块设备文件 | 数据库、自研存储、自管文件系统 |
| 不一致 | PVC 一直 Pending | 需统一 PVC 与 PV 的 volumeMode |
Block 卷不经过文件系统:容器里 ls 看不到文件,只有设备节点;如果应用期望目录结构却拿到块设备,表现为启动即报「is a directory / not a directory」类错误。
从 Filesystem 改成 Block 意味着卷上原有的目录结构不再适用,实际操作中按「新建卷 + 迁移数据」处理,不要指望原地改一个字段就完成转换。