一、StorageClass实践

参考链接:https://github.com/kubernetes-csi/csi-driver-nfs

image-20250321092200103

说明:这里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