如何在Kubernetes(k8s)集群中设置和使用Persistent Volumes (PV)和Persistent Volume Claims (PVC)?

问题浏览数Icon
21
问题创建时间Icon
2025-05-22 18:42:00
作者头像
starpath88
  1. 创建PersistentVolume(PV)

    • 定义PV资源文件(如nfs-pv.yaml),指定存储类型、容量和访问模式:
      apiVersion: v1
      kind: PersistentVolume
      metadata:
      name: my-pv
      spec:
      capacity:
       storage: 10Gi
      accessModes:
       - ReadWriteOnce
      persistentVolumeReclaimPolicy: Retain
      nfs:
       path: /nfs_share
       server: 192.168.1.100
    • 执行 kubectl apply -f nfs-pv.yaml
  2. 创建PersistentVolumeClaim(PVC)

    • 定义PVC资源文件(如app-pvc.yaml),声明所需存储:
      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
      name: my-pvc
      spec:
      accessModes:
       - ReadWriteOnce
      resources:
       requests:
         storage: 5Gi
    • 执行 kubectl apply -f app-pvc.yaml
  3. 在Pod中挂载PVC

    • 在Pod定义中通过volumesvolumeMounts关联PVC:
      apiVersion: v1
      kind: Pod
      metadata:
      name: my-pod
      spec:
      containers:
       - name: app
         image: nginx
         volumeMounts:
           - mountPath: /data
             name: storage
      volumes:
       - name: storage
         persistentVolumeClaim:
           claimName: my-pvc
  4. 验证

    • 检查PV/PVC绑定状态:kubectl get pv,pvc
    • 进入Pod写入测试文件:kubectl exec my-pod -- touch /data/testfile

更多回答

作者头像
fengyun09

为什么不尝试使用Dynamic Volume Provisioning结合StorageClass来自动化PV的创建,减少手动配置的复杂性呢?

作者头像
beamlight7

在k8s里用PV和PVC分三步:1.先搞个PV,定义好存储大小、访问权限(比如只读或读写)和存储类型(比如本地硬盘或云存储);2.创建PVC去匹配这个PV,相当于申请使用这个存储空间;3.在Pod里把PVC挂载到容器目录。比如用yaml文件定义好PV和PVC后,kubectl apply创建,最后在Pod配置里引用PVC名字就完事了。PV像库存的硬盘,PVC就是申请单,配对成功就能用啦!

作者头像
novacloud88

在Kubernetes集群中设置和使用PV/PVC需遵循以下步骤:

  1. 创建PersistentVolume(PV):通过YAML定义存储资源,指定容量(如10Gi)、访问模式(ReadWriteOnce/ReadOnlyMany/ReadWriteMany)、存储类型(如NFS路径或云存储标识)及回收策略(Retain/Delete)。
  2. 创建PersistentVolumeClaim(PVC):用户声明所需存储的大小和访问模式,Kubernetes自动匹配可用PV。若使用动态供给,StorageClass将按需创建PV(如AWS EBS)。
  3. 挂载PVC到Pod:在Pod配置的volumes中引用PVC名称,并在容器内通过volumeMounts指定挂载路径。
  4. 生命周期管理:删除PVC时,根据PV回收策略决定是否保留数据(Retain需手动清理,Delete自动销毁底层存储)。

关键注意事项:

  • 访问模式与存储后端兼容性(如NFS支持ReadWriteMany,云盘通常仅限ReadWriteOnce)
  • StorageClass配置:明确动态供给的provisioner(如kubernetes.io/aws-ebs)及参数(如卷类型gp3)
  • 数据持久性:定期备份PV数据(如通过Velero),避免误删Retain策略的PV导致数据丢失
  • 监控与扩缩容:通过kubectl get pv/pvc监控使用率,云环境可结合CSI驱动实现卷扩容