在kubernetes中,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服务器的地址和挂载路径。
示例:
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,则会自动关联。
示例:
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的相关目录下。
示例:
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在新的节点上仍能继续访问同一块存储区域中的数据。