本文主要介绍了在k8s中使用nfs作为存储,实现PV、PVC和storageclass
更新于 2021-03-21
安装NFS
直接使用yum命令安装nfs:
1 | yum install -y nfs-utils rpcbind |
创建nfs目录:
1 | mkdir -p /opt/nfs/data |
生产上应该给该目录挂载一个数据盘
启动nfs:
1 | systemctl start rpcbind |
在k8s的node和master节点上,都安装nfs-utils
:
1 | yum install -y nfs-utils |
nfs类型的volume
这种方式是直接在yaml中定义数据卷为nfs类型,示例如下:
1 | apiVersion: apps/v1 |
然后直接apply即可创建一个使用nfs类型volume的pod:
1 | kubectl apply -f pod-nfs-volume.yaml |

然后可以将这个pod作为service暴露出来:
1 | apiVersion: v1 |
1 | kubectl apply -f pod-nfs-svc.yaml |

验证访问的话,可以向nfs数据目录中放入一个html文件然后访问:

nfs类型的pv和pvc
创建PV
1 | apiVersion: v1 |
这里就创建了一个名为nfs-pv
的pv,大小500Mi,其中指定了nfs的数据目录和nfs地址。
accessModes
:pv访问模式,支持如下几个:ReadWriteOnce
:读写挂载在一个节点上;ReadOnlyMany
:只读挂载多个节点上;ReadWriteMany
:读写挂载在多个节点上;
persistentVolumeReclaimPolicy
:回收策略,支持以下几个:Retain
:不作任何操作,需要手动删除(默认)Recycle
:没有pvc使用时清空数据让其他pvc使用;Delete
:删除;

可以看到pv目前是可用状态。
创建PV
pod的直接消费对象为pvc而非pv,所以还需要创建pvc来绑定pv。
1 | apiVersion: v1 |
这里就创建了一个大小为500Mi,名字为
pvc01
的pvc请求。
pvc是自动绑定pv的,有如下两个原则:
- 根据pvc申请的容量,采用最小配原则匹配到合适的pv并绑定;
- 根据访问模式匹配,绑定pv和pvc访问模式一致的;

可以看到pvc和pv都是绑定状态了。
使用pvc
1 | apiVersion: apps/v1 |
使用pvc的时候,只需要在volumes
定义的时候制定pvc名称即可。

nfs类型的storageclass
nfs默认不支持storageclass,需要安装额外的插件
安装nfs-client插件
1 | helm install nfs-storageclass --set nfs.server=10.8.138.8 --set nfs.path=/opt/nfs/data --namespace default stable/nfs-client-provisioner |
可以看到nfs-client服务已经创建,storageclass也已经创建了。
使用yaml文件方式安装,需要部署下面的三个yaml文件来安装nfs-client:
1 | # nfs-cluster-role.yaml |
1 | # nfs-deployment.yaml |
1 | # nfs-service.yaml |
直接运行这三个文件即可:
1 | kubectl apply -f nfs-cluster-role.yaml |
创建storageclass
使用类似下面的yaml文件可以创建其他的storageclass:
1 | apiVersion: storage.k8s.io/v1 |
pvc使用storageclass
1 | apiVersion: v1 |
这里创建一个名为testclaim
的100Mi的pvc,使用nfs-client
这个storageclass。