Kubernetes 存储卷实战:PV/PVC 与动态 Provisioning

1. 核心概念解析
  • PV(Persistent Volume)
    集群级别的存储资源抽象,由管理员预先配置。例如定义 NFS 卷:

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: nfs-pv
    spec:
      capacity:
        storage: 10Gi
      accessModes:
        - ReadWriteMany
      nfs:
        path: /data/nfs
        server: 192.168.1.100
    

  • PVC(Persistent Volume Claim)
    用户对存储资源的请求,Pod 通过 PVC 使用 PV:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: web-pvc
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 5Gi
    

  • 动态 Provisioning
    通过 StorageClass 自动创建 PV,无需手动配置。存储类示例:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: fast-ssd
    provisioner: kubernetes.io/aws-ebs
    parameters:
      type: gp3
    

2. 静态配置实战:PV/PVC 绑定

步骤 1:创建 PV

kubectl apply -f nfs-pv.yaml

步骤 2:创建 PVC

kubectl apply -f web-pvc.yaml

步骤 3:验证绑定

kubectl get pv,pvc  # 查看 STATUS 是否为 Bound

步骤 4:Pod 挂载 PVC

apiVersion: v1
kind: Pod
metadata:
  name: web-server
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: data
      mountPath: /usr/share/nginx/html
  volumes:
  - name: data
    persistentVolumeClaim:
      claimName: web-pvc

3. 动态 Provisioning 实战

步骤 1:创建 StorageClass

kubectl apply -f fast-ssd.yaml

步骤 2:PVC 引用 StorageClass

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: dynamic-pvc
spec:
  storageClassName: fast-ssd  # 关键字段
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi

步骤 3:自动创建 PV

kubectl apply -f dynamic-pvc.yaml  # 自动触发 PV 创建
kubectl get pv  # 查看动态生成的 PV

4. 关键对比与场景建议
特性静态 PV/PVC动态 Provisioning
创建方式管理员手动配置按需自动创建
适用场景固定存储需求(如 NFS)云平台动态存储(如 EBS)
运维成本高(需维护 PV)低(自动生命周期管理)
弹性伸缩不支持支持(调整 PVC 大小)

最佳实践

  • 开发测试环境优先使用动态 Provisioning 提升效率
  • 生产环境关键数据建议静态配置确保稳定性
  • 始终设置 storageClassName 明确存储类型
5. 故障排查技巧
  • PVC 卡在 Pending 状态

    kubectl describe pvc <pvc-name>  # 查看事件日志
    

    常见原因:

    1. 无匹配的 PV(静态)
    2. StorageClass 配置错误(动态)
    3. 存储后端配额不足
  • 数据持久性验证

    kubectl exec -it web-server -- touch /usr/share/nginx/html/test.txt
    kubectl delete pod web-server && kubectl apply -f web-pod.yaml  # 重建后文件应保留
    

通过结合 PV/PVC 的精细控制与动态 Provisioning 的自动化能力,可构建高可靠、易扩展的 Kubernetes 存储架构。

更多推荐