单节点Kubernetes集群中安装一个StorageClass(SC)能为部署有状态应用(如数据库)提供动态分配持久化存储的能力。推荐使用基于NFS的StorageClass,因为它配置相对简单,资源消耗小,非常适合测试和学习环境。
核心概念图解

PVC → 触发 NFS Provisioner → 自动创建 PV → 挂载到 Pod
(就像你写"我要5G U盘" → 机器人自动装好U盘 → 你插到电脑上)
目录
[步骤2:部署NFS Provisioner](#步骤2:部署NFS Provisioner)
NFS StorageClass
这个方案的核心是使用NFS服务器作为后端存储,并在集群中部署一个名为nfs-subdir-external-provisioner的控制器,它能根据PVC的请求,自动在NFS服务器上创建子目录并生成对应的PV。
具体安装步骤
步骤1:准备NFS服务器
首先,您需要有一个NFS服务器。如果还没有,可以在您的CentOS服务器上快速搭建一个。
安装NFS服务端
sudo yum install -y nfs-utils
创建共享目录并设置权限
sudo mkdir -p /data/nfs
sudo chmod -R 755 /data/nfs
假设您的Kubernetes节点(也就是本机)IP为192.168.10.10,请根据实际情况修改
echo "/data/nfs 192.168.10.10(rw,sync,no_root_squash,no_all_squash)" | sudo tee -a /etc/exports
启动NFS服务
sudo systemctl enable --now nfs-server rpcbind
sudo exportfs -arv
步骤2:部署NFS Provisioner
这个Provisioner是自动创建PV的"大脑"。
下载部署文件
git clone https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner
cd nfs-subdir-external-provisioner/deploy
配置RBAC(权限)
修改rbac.yaml文件,将其中的命名空间从default改为kube-system,然后应用。
sed -i 's/namespace: default/namespace: kube-system/' rbac.yaml
kubectl apply -f rbac.yaml
配置并部署Provisioner
这是最关键的一步,需要修改deployment.yaml文件,将NFS服务器地址和路径替换成自己的。
修改部署文件
sed -i 's/namespace: default/namespace: kube-system/' deployment.yaml
接着,使用文本编辑器(如vim)修改deployment.yaml中的环境变量部分,重点关注NFS_SERVER和NFS_PATH:
env:
- name: PROVISIONER_NAME
value: k8s-sigs.io/nfs-subdir-external-provisioner
- name: NFS_SERVER
value: 192.168.10.10 # 您的NFS服务器IP,如果是本机请用内网IP
- name: NFS_PATH
value: /data/nfs # 您创建的NFS共享目录
...
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
volumes:
- name: nfs-client-root
nfs:
server: 192.168.10.10 # 同上
path: /data/nfs # 同上

kubectl apply -f deployment.yaml
步骤3:创建StorageClass
现在创建StorageClass资源本身,它是用户直接引用的对象。
查看并修改class.yaml
cat class.yaml
文件内容大致如下,确保provisioner名称与上一步deployment.yaml中定义的PROVISIONER_NAME一致:

创建StorageClass
kubectl apply -f class.yaml
步骤4:验证安装与基本使用
检查SC是否创建成功
kubectl get storageclass
应该能看到名为nfs-client的StorageClass,并且它应该是default(如果不是,可以设置:kubectl patch storageclass nfs-client -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}')。
测试动态存储分配
创建一个PVC来测试StorageClass是否正常工作。
cat > test-pvc.yaml << EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-nfs-pvc
spec:
storageClassName: nfs-client # 指定使用我们刚创建的SC
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
EOF
kubectl apply -f test-pvc.yaml
检查PVC和PV状态
kubectl get pvc test-nfs-pvc
kubectl get pv

如果PVC状态为Bound,并且系统自动创建了一个PV与之绑定,说明您的NFS StorageClass已经部署成功!
使用建议与注意事项
-
默认StorageClass :建议将
nfs-client设为默认SC,这样创建PVC时如果不指定storageClassName,会自动使用它。 -
数据持久性 :配置中的
archiveOnDelete: "false"意味着删除PVC后,PV和NFS服务器上的数据也会被清除 。如果您希望保留数据,可以设置为"true",或者手动管理PV。 -
生产环境考量:此方案适合开发和测试。对于生产环境,需要考虑NFS服务器的高可用性、网络性能以及数据备份策略。
遇到镜像问题

检查 NFS Provisioner Pod 状态
查看 nfs-provisioner 相关的 Pod
kubectl get pods -n kube-system | grep nfs
查看更详细的 Pod 信息
kubectl describe pods -n kube-system -l app=nfs-client-provisioner

kubectl edit deployment -n kube-system nfs-client-provisioner
更新镜像地址:
uhub.service.ucloud.cn/zzx_use/nfs-subdir-external-provisioner:v4.0.2
就是下面的镜像加速器: