K8s PV/PVC 存储配置:基于 NFS 的动态存储供应(StorageClass)与容量扩容
·
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 驱动(如
nfs或nfs-subdir-external-provisioner)。这里使用官方推荐的nfs-subdir-external-provisioner(需先部署 provisioner)。 - 部署 NFS provisioner(例如,使用 Helm 或 YAML)。以下是 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-sharekubectl apply -f nfs-provisioner.yaml - 创建 StorageClass,引用 provisioner:
应用 YAML:# 创建 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: Immediatekubectl apply -f storageclass-nfs.yaml
步骤 3: 创建 PVC 并动态供应 PV
- PVC 指定 StorageClass,触发自动创建 PV。
应用 YAML:# 创建 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}$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: Immediatekubectl apply -f storageclass-expand.yaml
步骤 2: 扩展 PVC 容量
- 直接编辑 PVC,增加
storage值(例如,从 $1 \text{GiB}$ 到 $2 \text{GiB}$)。
或使用 YAML 补丁:kubectl edit pvc nfs-pvc # 在编辑器中修改 spec.resources.requests.storage: 2Gi
应用:# 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 存储。如果有具体问题(如错误日志),提供更多细节以进一步诊断!
更多推荐



所有评论(0)