在 Kubernetes (k8S) 中,PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 的使用涉及以下步骤:
创建 PersistentVolume (PV)
- 定义 PV:首先,集群管理员需要创建一个或多个 PersistentVolume 资源。这通常在 YAML 文件中定义,并通过
kubectl apply
命令提交到集群。PV 定义包含如下的关键属性:
capacity
: 指定 PV 的存储容量。accessModes
: 描述 PV 允许的访问模式(ReadWriteOnce、ReadOnlyMany 或 ReadWriteMany)。storageClassName
: 如果有 StorageClass,则指定 PV 属于哪个类。nfs
或awsElasticBlockStore
等:具体存储类型相关的配置信息,例如对于 NFS 类型的 PV,需要提供 NFS 服务器的地址和挂载路径。
示例 PV YAML 配置:
apiVersion: v1 kind: PersistentVolume metadata: name: my-nfs-pv spec: capacity: storage: 10Gi accessModes: - ReadWriteMany nfs: path: /exports/data server: nfs-server.example.com storageClassName: managed-nfs-storage
创建 PersistentVolumeClaim (PVC)
- 定义 PVC:开发者或应用所有者不需要关心具体的存储实现细节,只需声明他们所需要的存储资源规格。这通过创建 PersistentVolumeClaim 来完成,同样以 YAML 文件形式定义并通过
kubectl apply
提交。PVC 定义通常包括:
spec.resources.requests.storage
: 请求的存储容量大小。accessModes
: 同样指明所需的访问模式。storageClassName
: 可选地指定希望使用的 StorageClass 名称。如果不指定,将匹配任何可用的 PV;如果集群中有默认的 StorageClass,则会自动关联。
示例 PVC YAML 配置:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-nfs-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi storageClassName: managed-nfs-storage
将 PVC 与 Pod 关联
- 在 Pod 中引用 PVC:
当 PVC 创建完成后,在需要持久化存储的 Pod 的容器卷配置部分引用此 PVC。当 Pod 运行时,Kubernetes 会自动将满足条件的 PV 绑定到 PVC,并将该 PV 挂载至 Pod 的相应目录下。
示例 Pod YAML 配置,其中 volumeMounts 字段将 PVC 挂载到容器内指定路径:
apiVersion: v1 kind: Pod metadata: name: my-app-pod spec: containers: - name: my-app-container image: my-app-image volumeMounts: - mountPath: /data name: my-pvc-volume volumes: - name: my-pvc-volume persistentVolumeClaim: claimName: my-nfs-pvc
综上所述,当 Pod 被调度并运行后,其内部的 /data
目录就会映射到由 PVC 绑定的 PV 上的实际存储空间上,从而实现了数据的持久化存储。即使 Pod 因为节点故障等原因被重新调度到其他节点,由于 PVC 与 PV 的绑定关系不变,Pod 在新的节点上仍能继续访问同一块存储区域中的数据。