1. 介绍

Kubernetes 已成为容器编排和云上应用管理的核心工具。在管理这些应用时,持久化数据存储是一个关键环节。

Kubernetes 使用 PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 来处理持久化存储问题。 本文将介绍 PV 与 PVC 的基础概念,并详细说明如何将 PVC 绑定到特定的 PV 上。

2. 基础概念

2.1. PersistentVolume (PV)

PV 是集群管理员提供的存储资源,代表的是物理存储资源,例如 NFS、iSCSI 或本地磁盘。

PV 是一种独立于 Pod 生命周期的资源,可以被多个 Pod 同时访问,从而实现存储与 Pod 的解耦。

PV 的定义中包含以下关键字段:

  • capacity:存储容量,如 10Gi
  • accessModes:访问模式,如 ReadWriteOnce
  • storageClassName:用于动态创建 PV 的存储类
  • persistentVolumeReclaimPolicy:PVC 被删除后 PV 的回收策略

下面是一个 PV 的 YAML 示例:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-example
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: fast
  hostPath:
    path: /data

这个 PV 配置了 10GB 容量,仅允许单节点以读写方式挂载。回收策略为 Retain,表示 PVC 删除后 PV 不会被自动删除。storageClassNamefast,通常用于 SSD 类型的存储。

2.2. PersistentVolumeClaim (PVC)

PVC 是应用程序向集群申请存储资源的声明。它描述了应用所需的存储规格,如容量、访问模式和存储类。

PVC 包含的关键字段如下:

  • resources.requests.storage:请求的存储容量
  • accessModes:期望的访问模式
  • storageClassName:指定匹配的存储类

以下是一个 PVC 的示例:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-example
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  storageClassName: fast

PVC 会自动匹配满足其要求的 PV。一旦匹配成功,该 PV 会被锁定,直到 PVC 被释放。

3. 如何绑定 PVC 到指定 PV

正确地将 PVC 绑定到特定 PV 对于 Kubernetes 的稳定运行至关重要,有助于实现数据持久化、资源隔离和灵活扩展。

3.1. 创建 PV 清单

要绑定 PVC 到特定 PV,需要在 PV 中显式指定 claimRef 字段,用于绑定到某个命名空间下的特定 PVC。

示例 PV 配置如下:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: example-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: manual
  nfs:
    path: /path/to/nfs
    server: nfs-server.example.com
  claimRef:
    namespace: default
    name: example-pvc

关键字段说明:

  • name: PV 名称为 example-pv
  • capacity: 存储大小为 10Gi
  • accessModes: 读写模式为 ReadWriteOnce
  • storageClassName: 存储类为 manual
  • nfs: NFS 服务器地址和路径
  • claimRef: 指定绑定到 default 命名空间下的 example-pvc

3.2. 创建 PVC 清单

接下来创建 PVC,其名称、命名空间、访问模式、容量和存储类必须与 PV 的配置一致

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: example-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: manual

确保以下字段匹配:

  • name: example-pvc
  • accessModes: ReadWriteOnce
  • resources.requests.storage: 10Gi
  • storageClassName: manual

3.3. 应用并验证绑定

使用 kubectl apply 应用两个 YAML 文件:

kubectl apply -f pv-manifest.yaml
kubectl apply -f pvc-manifest.yaml

查看 PVC 状态:

kubectl get pvc

输出应显示 PVC 状态为 Bound

NAME          STATUS    VOLUME        CAPACITY   ACCESS MODES   STORAGECLASS   AGE
example-pvc   Bound     example-pv    10Gi       RWO            manual         5m

✅ 成功绑定后,PVC 会引用该 PV,PV 也会被标记为“已绑定”。

4. 常见问题与解决方案

4.1. storageClassName 不匹配 ❌

  • 问题:PV 和 PVC 的 storageClassName 不一致,导致无法绑定
  • 解决:确保两者配置完全一致,或都为空(不指定)

4.2. 容量不匹配 ❌

  • 问题:PVC 请求的容量大于 PV 的容量
  • 解决:确保 PVC 的 storage 请求 ≤ PV 的容量

4.3. accessModes 不匹配 ❌

  • 问题:PVC 请求的访问模式与 PV 不兼容
  • 解决:确保两者 accessModes 一致

4.4. NFS 配置错误 ❌

  • 问题:NFS 路径或服务器地址错误
  • 解决:检查 serverpath 是否正确,确保网络可达

4.5. 命名空间不一致 ❌

  • 问题:PV 的 claimRef.namespace 与 PVC 所在命名空间不一致
  • 解决:确保命名空间一致

5. 总结

PV 和 PVC 是 Kubernetes 中管理持久化存储的核心机制。通过显式指定 claimRef,可以实现 PVC 与特定 PV 的绑定,从而实现更精确的资源控制。

掌握 PV 与 PVC 的匹配规则、常见问题及排查方法,是构建稳定可靠云原生应用的基础。合理使用这些资源,可以提升应用的数据持久化能力、资源利用率和可维护性。


原始标题:How to Bind a PVC to a Specific PV