在 Kubernetes 1.22.0 上部署 NFS 存储类需要以下步骤。我将提供两种方法:手动部署和使用 Helm 部署。
前提条件
-
已安装 Kubernetes 集群(版本 1.22.0)
-
已配置好 NFS 服务器(共享目录已导出)
-
所有节点已安装
nfs-common
或nfs-utils
包bash
复制
下载
# Ubuntu/Debian sudo apt-get install -y nfs-common # CentOS/RHEL sudo yum install -y nfs-utils
方法一:手动部署 NFS StorageClass
1. 创建 Service Account 和 RBAC
yaml
复制
下载
# nfs-provisioner-rbac.yaml apiVersion: v1 kind: ServiceAccount metadata: name: nfs-provisioner namespace: kube-system --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: nfs-provisioner-runner rules: - apiGroups: [""] resources: ["persistentvolumes"] verbs: ["get", "list", "watch", "create", "delete"] - apiGroups: [""] resources: ["persistentvolumeclaims"] verbs: ["get", "list", "watch", "update"] - apiGroups: ["storage.k8s.io"] resources: ["storageclasses"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["events"] verbs: ["create", "update", "patch"] --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: run-nfs-provisioner subjects: - kind: ServiceAccount name: nfs-provisioner namespace: kube-system roleRef: kind: ClusterRole name: nfs-provisioner-runner apiGroup: rbac.authorization.k8s.io
应用配置:
bash
复制
下载
kubectl apply -f nfs-provisioner-rbac.yaml
2. 部署 NFS Provisioner
yaml
复制
下载
# nfs-provisioner-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nfs-client-provisioner namespace: kube-system spec: replicas: 1 selector: matchLabels: app: nfs-client-provisioner strategy: type: Recreate template: metadata: labels: app: nfs-client-provisioner spec: serviceAccountName: nfs-provisioner containers: - name: nfs-client-provisioner image: gcr.io/k8s-staging-sig-storage/nfs-subdir-external-provisioner:v4.0.2 volumeMounts: - name: nfs-client-root mountPath: /persistentvolumes env: - name: PROVISIONER_NAME value: k8s-sigs.io/nfs-subdir-external-provisioner - name: NFS_SERVER value: <NFS-SERVER-IP> # 替换为你的NFS服务器IP - name: NFS_PATH value: <NFS-SHARE-PATH> # 替换为NFS共享路径 volumes: - name: nfs-client-root nfs: server: <NFS-SERVER-IP> # 替换为你的NFS服务器IP path: <NFS-SHARE-PATH> # 替换为NFS共享路径
应用配置:
bash
复制
下载
kubectl apply -f nfs-provisioner-deployment.yaml
3. 创建 StorageClass
yaml
复制
下载
# nfs-storageclass.yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: nfs-client annotations: storageclass.kubernetes.io/is-default-class: "true" # 设为默认存储类 provisioner: k8s-sigs.io/nfs-subdir-external-provisioner parameters: archiveOnDelete: "false" # 删除PV时不保留数据
应用配置:
bash
复制
下载
kubectl apply -f nfs-storageclass.yaml
方法二:使用 Helm 部署(推荐)
1. 添加 Helm 仓库
bash
复制
下载
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/ helm repo update
2. 安装 NFS Provisioner
bash
复制
下载
helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \ --namespace kube-system \ --set nfs.server=<NFS-SERVER-IP> \ --set nfs.path=<NFS-SHARE-PATH> \ --set storageClass.name=nfs-client \ --set storageClass.defaultClass=true \ --set image.repository=registry.k8s.io/sig-storage/nfs-subdir-external-provisioner \ --set image.tag=v4.0.2
参数说明:
-
nfs.server
: NFS 服务器 IP 地址 -
nfs.path
: NFS 共享路径 -
storageClass.name
: 存储类名称 -
storageClass.defaultClass
: 设为默认存储类 -
image.repository
: 使用官方镜像仓库 -
image.tag
: 指定兼容 Kubernetes 1.22 的版本
验证部署
-
检查 Pod 状态:
bash
复制
下载
kubectl get pods -n kube-system | grep nfs # 应该看到类似:nfs-subdir-external-provisioner-xxx 1/1 Running 0 2m
-
检查 StorageClass:
bash
复制
下载
kubectl get storageclass # 输出示例: # NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE # nfs-client k8s-sigs.io/nfs-subdir-external-provisioner Delete Immediate true 5m
-
测试 PVC:
yaml
复制
下载
# test-pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: test-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: nfs-client
应用并验证:
bash
复制
下载
kubectl apply -f test-pvc.yaml kubectl get pvc test-pvc # 应该看到状态为 Bound
故障排查
-
Pod 无法启动:
-
检查 NFS 服务器是否可访问
-
确认节点已安装 NFS 客户端工具
-
检查防火墙设置(NFS 需要开放 2049 端口)
-
-
PVC 处于 Pending 状态:
-
查看 Provisioner Pod 日志:
bash
复制
下载
kubectl logs -n kube-system -l app=nfs-subdir-external-provisioner
-
确认 StorageClass 配置正确:
bash
复制
下载
kubectl describe storageclass nfs-client
-
-
挂载权限问题:
-
在 NFS 服务器上确保共享目录有适当权限:
bash
复制
下载
chmod 777 /your/nfs/share
-
在 NFS 服务器
/etc/exports
中添加:复制
下载
/your/nfs/share *(rw,sync,no_root_squash,no_subtree_check)
然后重启 NFS 服务:
bash
复制
下载
systemctl restart nfs-server
-
清理资源
bash
复制
下载
# Helm 方式 helm uninstall nfs-subdir-external-provisioner -n kube-system # 手动方式 kubectl delete -f nfs-storageclass.yaml kubectl delete -f nfs-provisioner-deployment.yaml kubectl delete -f nfs-provisioner-rbac.yaml
通过以上步骤,您可以在 Kubernetes 1.22.0 上成功部署 NFS 存储类,为应用提供持久化存储能力。