是什么

PVC 的 accessModes 描述的是这块卷在集群里能被怎样挂载,不是 Linux 文件权限里的 rwx。

Kubernetes 常见三种:

模式 全称 含义(简化)
RWO ReadWriteOnce 同一时刻,最多一个节点以读写方式挂载
ROX ReadOnlyMany 多个节点可同时只读挂载
RWX ReadWriteMany 多个节点可同时读写挂载(需 NFS、CephFS、Longhorn RWX 等)

日常自建集群里,Longhorn、本地盘、云厂商块存储(EBS 等)给 Pod 用的,几乎都是 RWO。

RWO 不等于 Pod 不能换节点

很多人会把 RWO 理解成「Pod 永远绑死在一个节点上」。更准确的说法是:

  • 同一时刻只能有一个节点挂载读写;
  • Pod 迁到另一节点时,流程是:旧 Pod 退出 → 卷 detach → 新节点 attach → 新 Pod 启动。

因此 RWO 不阻止 Pod 漂移,但不允许两个 Pod 同时挂同一块盘。

和 Longhorn 副本数的关系

Longhorn 的 numberOfReplicas: 2 表示数据在多个节点各存一份(容错、迁移时 attach 更快),与 RWX 无关:

  • 2 副本:备份/调度层面;
  • RWO:运行时仍只有一个节点在挂载读写。

二者可以同时存在,例如 Nexus 在 k8s-50 / k8s-71 各有一份 replica,但 Pod 仍只有一个。

常见踩坑:RollingUpdate + RWO

Deployment 默认 RollingUpdate 会先起新 Pod、再删旧 Pod。对挂 RWO PVC 的单副本应用,会出现:

Multi-Attach error: Volume is already used by pod ...

新 Pod 在节点 B,旧 Pod 在节点 A,两块都想挂同一块盘,第二个会失败。

处理方式

对有状态、replicas: 1 且使用 RWO 的 Deployment,建议:

spec:
  strategy:
    type: Recreate

Recreate 会先删旧 Pod,再建新 Pod,避免短暂的双挂载冲突。代价是更新时会有短时间的停服。

RWX 能替代 RWO 吗

技术上可以选支持 RWX 的 StorageClass,但:

  • 应用本身若不支持多写者(如 Nexus、单实例数据库),仍应 replicas: 1;
  • 两个 Pod 同时写同一目录可能损坏数据;
  • RWX 往往更复杂、开销更高。

对单实例有状态服务,RWO + Recreate 通常是更简单的组合。

相关