一、StorageClass实践¶
参考链接:https://github.com/kubernetes-csi/csi-driver-nfs

说明:这里k8s版本为1.32版本,选择的是v4.9.0版本信息
3.9.1 准备工作¶
1、在10.0.0.22主机上搭建NFS
[root@k8s-node02 ~]# yum install nfs-utils rpcbind -y
如果是Ubuntu 系列,则采用下面命令
[root@k8s-node02 ~]# apt install nfs-kernel-server -y
2、配置共享目录
[root@k8s-node02 ~]# mkdir /data/nfs -p
[root@k8s-node02 ~]# echo "/data/nfs/ 10.0.0.0/24(rw,sync,no_subtree_check,no_root_squash)" >> /etc/exports
3、加载NFS配置
[root@k8s-node02 ~]# exportfs -r
# 验证
[root@k8s-node02 ~]# exportfs -s
/data/nfs 10.0.0.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,no_root_squash,no_all_squash)
4、启动NFS
[root@k8s-node02 ~]# systemctl enable --now nfs-server rpcbind
如果是Ubuntu 系列,则采用下面命令
[root@k8s-node02 ~]# systemctl enable --now nfs-kernel-server
5、客户端安装客户端工具
# 客户端安装客户端工具
[root@k8s-node01 ~]# yum install nfs-utils -y
[root@k8s-master01 ~]# yum install nfs-utils -y
如果是Ubuntu 系列,则采用下面命令
[root@k8s-node01 ~]# apt install nfs-common -y
[root@k8s-master01 ~]# apt install nfs-common -y
3.9.2 安装CSI¶
1、下载安装文件
[root@k8s-master01 ~]# git clone https://gitee.com/dukuan/csi-driver-nfs.git
2、安装CSI
[root@k8s-master01 ~]# cd csi-driver-nfs/
[root@k8s-master01 csi-driver-nfs]# sed -i "s#registry.k8s.io#k8s.m.daocloud.io#g" deploy/v4.9.0/*.yaml
[root@k8s-master01 csi-driver-nfs]# ./deploy/install-driver.sh v4.9.0 local
use local deploy
Installing NFS CSI driver, version: v4.9.0 ...
serviceaccount/csi-nfs-controller-sa created
serviceaccount/csi-nfs-node-sa created
clusterrole.rbac.authorization.k8s.io/nfs-external-provisioner-role created
clusterrolebinding.rbac.authorization.k8s.io/nfs-csi-provisioner-binding created
csidriver.storage.k8s.io/nfs.csi.k8s.io created
deployment.apps/csi-nfs-controller created
daemonset.apps/csi-nfs-node created
NFS CSI driver installed successfully.
3、查看pod状态
[root@k8s-master01 csi-driver-nfs]# kgp -n kube-system | grep csi-nfs
csi-nfs-controller-5c9687ccf5-l9fhp 4/4 Running 2 (5m26s ago) 6m13s
csi-nfs-node-4gnj9 3/3 Running 0 6m13s
csi-nfs-node-ccww4 3/3 Running 1 (5m22s ago) 6m13s
csi-nfs-node-rnqpn 3/3 Running 0 6m13s
4、查看CSI
[root@k8s-master01 csi-driver-nfs]# kg csidriver
NAME ATTACHREQUIRED PODINFOONMOUNT STORAGECAPACITY TOKENREQUESTS REQUIRESREPUBLISH MODES AGE
nfs.csi.k8s.io false false false <unset> false Persistent 6m42s
3.9.3 创建SC指向CSI¶
1、在master01主机(10.0.0.20)上更改sc的配置
[root@k8s-master01 ~]# cd csi-driver-nfs/
# 添加nfs主机信息
server: 10.0.0.22
share: /data/nfs
# 修改后的文件内容如下
[root@k8s-master01 csi-driver-nfs]# vim deploy/v4.9.0/storageclass.yaml
[root@k8s-master01 csi-driver-nfs]# cat deploy/v4.9.0/storageclass.yaml
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-csi
provisioner: nfs.csi.k8s.io
parameters:
server: 10.0.0.22
share: /data/nfs
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
- nfsvers=4.1
2、创建sc并查看
[root@k8s-master01 csi-driver-nfs]# kaf deploy/v4.9.0/storageclass.yaml
[root@k8s-master01 csi-driver-nfs]# kg sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs-csi nfs.csi.k8s.io Delete Immediate false 19s
3.9.4 挂载测试¶
1、创建PVC
[root@k8s-master01 csi-driver-nfs]# cat /root/csi-driver-nfs/deploy/example/pvc-nfs-csi-dynamic.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nfs-dynamic
namespace: default
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
storageClassName: nfs-csi
[root@k8s-master01 csi-driver-nfs]# kaf /root/csi-driver-nfs/deploy/example/pvc-nfs-csi-dynamic.yaml
# 查看pvc
[root@k8s-master01 csi-driver-nfs]# kg pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
pvc-nfs-dynamic Bound pvc-72a148b6-20b1-496a-af3d-a78bd7189616 10Gi RWX nfs-csi <unset> 9s
# 查看pv
[root@k8s-master01 csi-driver-nfs]# kg pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE
pvc-72a148b6-20b1-496a-af3d-a78bd7189616 10Gi RWX Delete Bound default/pvc-nfs-dynamic nfs-csi <unset> 88s
此时会在 NFS 目录下创建一个共享目录
root@k8s-node02 ~]# ls /data/nfs/
pvc-72a148b6-20b1-496a-af3d-a78bd7189616
2、进行挂载测试
# 创建deploy的模板文件
[root@k8s-master01 ~]# k create deploy deployment-nfs --image=registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2 --dry-run=client -oyaml > deployment-nfs.yaml
# 重新定义deploy的模板文件
[root@k8s-master01 ~]# vim deployment-nfs.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: deployment-nfs
name: deployment-nfs
spec:
replicas: 1
selector:
matchLabels:
app: deployment-nfs
template:
metadata:
labels:
app: deployment-nfs
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
name: deployment-nfs
command:
- "/bin/sh"
- "-c"
- while true; do echo $(hostname) $(date) >> /mnt/nfs/outfile;sleep 5; done
volumeMounts:
- name: nfs
mountPath: "/mnt/nfs"
readOnly: false
volumes:
- name: nfs
persistentVolumeClaim:
claimName: pvc-nfs-dynamic
# 创建测试应用
[root@k8s-master01 ~]# kaf deployment-nfs.yaml
# 查看pod
[root@k8s-master01 ~]# kgp
NAME READY STATUS RESTARTS AGE
deployment-nfs-8cc65d8b5-mb9m5 1/1 Running 0 2s
3、在NFS服务端的/data/nfs目录下查看到写入的数据信息
[root@k8s-node02 ~]# tail -f /data/nfs/pvc-72a148b6-20b1-496a-af3d-a78bd7189616/outfile
deployment-nfs-8cc65d8b5-mb9m5 Fri Mar 21 01:42:26 UTC 2025
deployment-nfs-8cc65d8b5-mb9m5 Fri Mar 21 01:42:31 UTC 2025
deployment-nfs-8cc65d8b5-mb9m5 Fri Mar 21 01:42:36 UTC 2025
deployment-nfs-8cc65d8b5-mb9m5 Fri Mar 21 01:42:41 UTC 2025
deployment-nfs-8cc65d8b5-mb9m5 Fri Mar 21 01:42:46 UTC 2025
...
...
4、环境复原
# 删除应用
[root@k8s-master01 ~]# kubectl delete -f deployment-nfs.yaml
# 删除pvc
[root@k8s-master01 ~]# kubectl delete pvc pvc-nfs-dynamic
# 删除pvc的同时也会删除pv
[root@k8s-master01 ~]# kg pv
No resources found