在k8S中,PV和PVC如何使用?
在 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 在新的节点上仍能继续访问同一块存储区域中的数据。