Kubernetes PV/PVC 存储配置:基于 NFS 的动态存储供应(StorageClass)与容量扩容

在 Kubernetes(K8s)中,PV(Persistent Volume)和 PVC(Persistent Volume Claim)用于管理存储资源。基于 NFS(Network File System)的动态存储供应通过 StorageClass 实现自动创建 PV,而容量扩容允许在不中断服务的情况下扩展 PVC 的大小。本指南将逐步解释配置过程,确保结构清晰、易于理解。内容基于 Kubernetes v1.20+ 版本,并假设您已有一个运行中的 Kubernetes 集群和 NFS 服务器。

1. 基本概念回顾
  • PV(Persistent Volume):集群提供的存储资源,例如 NFS 共享卷。
  • PVC(Persistent Volume Claim):用户对存储的请求,绑定到 PV。
  • StorageClass:定义动态供应的模板,指定后端存储类型(如 NFS)和参数。
  • 动态存储供应:当创建 PVC 时,StorageClass 自动创建 PV,无需手动干预。
  • 容量扩容:通过修改 PVC 来增加存储容量(例如,从 $1 \text{GiB}$ 扩展到 $2 \text{GiB}$),需存储后端支持(NFS 支持动态扩展)。
2. 配置基于 NFS 的动态存储供应

动态供应需要先设置 NFS 服务器和 StorageClass。以下是详细步骤:

步骤 1: 设置 NFS 服务器

  • 在您的 NFS 服务器上,创建一个共享目录(如 /data/nfs-share),并导出为可访问的共享。例如:
    # 在 NFS 服务器上执行
    mkdir -p /data/nfs-share
    echo "/data/nfs-share *(rw,sync,no_root_squash)" >> /etc/exports
    exportfs -a
    systemctl restart nfs-server
    

  • 确保 Kubernetes 节点能访问 NFS 服务器(使用 showmount -e <nfs-server-ip> 测试)。

步骤 2: 创建 StorageClass

  • StorageClass 使用 NFS 驱动(如 nfsnfs-subdir-external-provisioner)。这里使用官方推荐的 nfs-subdir-external-provisioner(需先部署 provisioner)。
  • 部署 NFS provisioner(例如,使用 Helm 或 YAML)。以下是 YAML 示例:
    # 部署 NFS provisioner(保存为 nfs-provisioner.yaml)
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nfs-provisioner
      namespace: kube-system
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nfs-provisioner
      template:
        metadata:
          labels:
            app: nfs-provisioner
        spec:
          containers:
          - name: nfs-provisioner
            image: quay.io/kubernetes_incubator/nfs-subdir-external-provisioner:v4.0.2
            volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
            env:
            - name: PROVISIONER_NAME
              value: example.com/nfs  # 自定义 provisioner 名称
            - name: NFS_SERVER
              value: <your-nfs-server-ip>  # 替换为 NFS 服务器 IP
            - name: NFS_PATH
              value: /data/nfs-share  # NFS 共享路径
          volumes:
          - name: nfs-client-root
            nfs:
              server: <your-nfs-server-ip>
              path: /data/nfs-share
    

    应用 YAML:kubectl apply -f nfs-provisioner.yaml
  • 创建 StorageClass,引用 provisioner:
    # 创建 StorageClass(保存为 storageclass-nfs.yaml)
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: nfs-storage  # StorageClass 名称
    provisioner: example.com/nfs  # 与 provisioner 中的 PROVISIONER_NAME 一致
    parameters:
      archiveOnDelete: "false"  # 删除 PVC 时不保留数据
    reclaimPolicy: Delete  # 删除 PVC 时自动删除 PV
    volumeBindingMode: Immediate
    

    应用 YAML:kubectl apply -f storageclass-nfs.yaml

步骤 3: 创建 PVC 并动态供应 PV

  • PVC 指定 StorageClass,触发自动创建 PV。
    # 创建 PVC(保存为 pvc-dynamic.yaml)
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: nfs-pvc
    spec:
      storageClassName: nfs-storage  # 引用 StorageClass
      accessModes:
        - ReadWriteMany  # NFS 支持多节点读写
      resources:
        requests:
          storage: 1Gi  # 初始容量,$1 \text{GiB}$
    

    应用 YAML:kubectl apply -f pvc-dynamic.yaml
  • 验证:运行 kubectl get pvc,pv,应看到 PVC 状态为 Bound,且 PV 自动创建。
3. 容量扩容

Kubernetes v1.24+ 支持 PVC 在线扩容(需 StorageClass 设置 allowVolumeExpansion: true)。NFS 通常支持动态扩展,无需手动操作。

步骤 1: 修改 StorageClass 允许扩容

  • 更新 StorageClass,添加 allowVolumeExpansion 字段:
    # 更新 StorageClass(保存为 storageclass-expand.yaml)
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: nfs-storage
    provisioner: example.com/nfs
    allowVolumeExpansion: true  # 启用扩容
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
    

    应用更新:kubectl apply -f storageclass-expand.yaml

步骤 2: 扩展 PVC 容量

  • 直接编辑 PVC,增加 storage 值(例如,从 $1 \text{GiB}$ 到 $2 \text{GiB}$)。
    kubectl edit pvc nfs-pvc  # 在编辑器中修改 spec.resources.requests.storage: 2Gi
    

    或使用 YAML 补丁:
    # PVC 扩容补丁(保存为 pvc-patch.yaml)
    spec:
      resources:
        requests:
          storage: 2Gi  # 新容量
    

    应用:kubectl patch pvc nfs-pvc --patch-file pvc-patch.yaml
  • 验证:运行 kubectl get pvc nfs-pvc -o yaml,检查 capacity.storage 是否更新为 $2 \text{GiB}$。底层 PV 会自动调整(可能需要几秒)。

注意事项

  • NFS 服务器支持:确保 NFS 共享有足够空间;扩容后,在 NFS 服务器上检查目录大小(使用 df -h)。
  • Kubernetes 版本:v1.24+ 支持在线扩容;旧版本可能需要重启 Pod。
  • Pod 使用:扩容时,如果 Pod 正在使用 PVC,建议先停止 Pod(kubectl scale deployment <deployment-name> --replicas=0),扩容后再恢复,以避免文件系统错误。
  • 备份:在扩容前备份数据,防止意外。
  • 性能影响:大规模扩容可能影响 I/O 性能;监控使用 kubectl top pod
  • 常见错误:如果扩容失败,检查 StorageClass 的 allowVolumeExpansion 和 NFS 日志。
4. 总结
  • 基于 NFS 的动态存储供应通过 StorageClass 简化 PV 管理,PVC 创建时自动生成 PV。
  • 容量扩容只需修改 PVC 的 storage 字段,前提是 StorageClass 启用了 allowVolumeExpansion: true
  • 优势:自动化、减少运维负担;NFS 提供跨节点共享存储。
  • 推荐实践:使用 Helm 管理 provisioner,定期监控存储使用(例如,通过 Prometheus)。

通过以上步骤,您可以高效配置和扩展 NFS 存储。如果有具体问题(如错误日志),提供更多细节以进一步诊断!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐