找回密码
 立即注册
首页 业界区 安全 k8s csi-driver-nfs 动态扩容

k8s csi-driver-nfs 动态扩容

讲怔 2025-6-1 18:34:56
1.前置条件​​


  • ​​有一套完整的Kubernetes 集群,且版本 ≥ 1.18(推荐 1.20+)。
  • 已部署好NFS 服务​​:共享目录: /nfs_share/k8s/nfs-csi,NFS服务器:172.16.4.60。
2.部署 NFS CSI 驱动​(csi-driver-nfs)

2.1 克隆官方仓库并进入目录​
  1. git clone https://github.com/kubernetes-csi/csi-driver-nfs.git
  2. cd csi-driver-nfs/deploy
复制代码
  1. [root@master1 deploy]# ls
  2. crd-csi-snapshot.yaml    csi-nfs-node.yaml             install-driver.sh              snapshotclass.yaml   v3.0.0  v4.1.0   v4.2.0  v4.5.0  v4.8.0
  3. csi-nfs-controller.yaml  csi-snapshot-controller.yaml  rbac-csi-nfs.yaml              storageclass.yaml    v3.1.0  v4.10.0  v4.3.0  v4.6.0  v4.9.0
  4. csi-nfs-driverinfo.yaml  example                       rbac-snapshot-controller.yaml  uninstall-driver.sh  v4.0.0  v4.11.0  v4.4.0  v4.7.0
复制代码

  • 可以在deploy部署目录下看到csi-driver-nfs最新版本为v4.11.0,我们就使用这个版本,进入到这个目录,yaml文件如下:
  1. [root@master1 ~]# cd /root/statefulset/csi-driver-nfs/deploy/v4.11.0
  2. [root@master1 v4.11.0]# ls
  3. crd-csi-snapshot.yaml    csi-nfs-driverinfo.yaml  csi-snapshot-controller.yaml  rbac-snapshot-controller.yaml  storageclass.yaml
  4. csi-nfs-controller.yaml  csi-nfs-node.yaml        rbac-csi-nfs.yaml             snapshotclass.yaml
复制代码
2.2 下载镜像


  • 查看csi-driver-nfs v4.11.0版本中需要哪些镜像
  1. [root@master1 v4.11.0]# grep -w image *
  2. csi-nfs-controller.yaml:          image: registry.k8s.io/sig-storage/csi-provisioner:v5.2.0
  3. csi-nfs-controller.yaml:          image: registry.k8s.io/sig-storage/csi-resizer:v1.13.1
  4. csi-nfs-controller.yaml:          image: registry.k8s.io/sig-storage/csi-snapshotter:v8.2.0
  5. csi-nfs-controller.yaml:          image: registry.k8s.io/sig-storage/livenessprobe:v2.15.0
  6. csi-nfs-controller.yaml:          image: registry.k8s.io/sig-storage/nfsplugin:v4.11.0
  7. csi-nfs-node.yaml:          image: registry.k8s.io/sig-storage/livenessprobe:v2.15.0
  8. csi-nfs-node.yaml:          image: registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.13.0
  9. csi-nfs-node.yaml:          image: registry.k8s.io/sig-storage/nfsplugin:v4.11.0
  10. csi-snapshot-controller.yaml:          image: registry.k8s.io/sig-storage/snapshot-controller:v8.2.0
复制代码

  • 可以看到csi-nfs-controller.yaml、csi-nfs-node.yaml、csi-snapshot-controller.yaml 文件需要镜像
  • 由于我是内网部署,所以需要在有网的服务器拉取对应镜像后,再推到内网harbor仓库
  • 另外 registry.k8s.io 地址不太好访问,如果有需要的朋友,可以联系我获取
  1. docker pull registry.k8s.io/sig-storage/csi-resizer:v1.13.1
  2. docker pull registry.k8s.io/sig-storage/csi-snapshotter:v8.2.0
  3. docker pull registry.k8s.io/sig-storage/livenessprobe:v2.15.0
  4. docker pull registry.k8s.io/sig-storage/nfsplugin:v4.11.0
  5. docker pull registry.k8s.io/sig-storage/csi-provisioner:v5.2.0
  6. docker pull registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.13.0
  7. docker pull registry.k8s.io/sig-storage/snapshot-controller:v8.2.0
复制代码

  • 将下载的镜像保存为tar.gz,上传到内网服务器,并加载镜像
  1. ls *.tar.gz | xargs -i docker load -i {}
复制代码

  • 修改tag并推送到内网私有harbor,我的harbor仓库地址:172.16.4.177:8090,项目:k8s-csi-nfs
  1. docker tag registry.k8s.io/sig-storage/csi-resizer:v1.13.1 172.16.4.177:8090/k8s-csi-nfs/registry.k8s.io/sig-storage/csi-resizer:v1.13.1
  2. docker push 172.16.4.177:8090/k8s-csi-nfs/registry.k8s.io/sig-storage/csi-resizer:v1.13.1
  3. docker tag registry.k8s.io/sig-storage/csi-snapshotter:v8.2.0 172.16.4.177:8090/k8s-csi-nfs/registry.k8s.io/sig-storage/csi-snapshotter:v8.2.0
  4. docker push 172.16.4.177:8090/k8s-csi-nfs/registry.k8s.io/sig-storage/csi-snapshotter:v8.2.0
  5. docker tag registry.k8s.io/sig-storage/livenessprobe:v2.15.0 172.16.4.177:8090/k8s-csi-nfs/registry.k8s.io/sig-storage/livenessprobe:v2.15.0
  6. docker push 172.16.4.177:8090/k8s-csi-nfs/registry.k8s.io/sig-storage/livenessprobe:v2.15.0
  7. docker tag registry.k8s.io/sig-storage/nfsplugin:v4.11.0 172.16.4.177:8090/k8s-csi-nfs/registry.k8s.io/sig-storage/nfsplugin:v4.11.0
  8. docker push 172.16.4.177:8090/k8s-csi-nfs/registry.k8s.io/sig-storage/nfsplugin:v4.11.0
  9. docker tag registry.k8s.io/sig-storage/csi-provisioner:v5.2.0  172.16.4.177:8090/k8s-csi-nfs/registry.k8s.io/sig-storage/csi-provisioner:v5.2.0
  10. docker push 172.16.4.177:8090/k8s-csi-nfs/registry.k8s.io/sig-storage/csi-provisioner:v5.2.0
  11. docker tag registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.13.0 172.16.4.177:8090/k8s-csi-nfs/registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.13.0
  12. docker push 172.16.4.177:8090/k8s-csi-nfs/registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.13.0
  13. docker tag registry.k8s.io/sig-storage/snapshot-controller:v8.2.0  172.16.4.177:8090/k8s-csi-nfs/registry.k8s.io/sig-storage/snapshot-controller:v8.2.0
  14. docker push 172.16.4.177:8090/k8s-csi-nfs/registry.k8s.io/sig-storage/snapshot-controller:v8.2.0
复制代码
2.3 修改csi-nfs-controller.yaml、csi-nfs-node.yaml、csi-snapshot-controller.yaml 文件中的镜像地址为内网harbor地址
  1. [root@master1 v4.11.0]# grep -w image *
  2. csi-nfs-controller.yaml:          image: 172.16.4.177:8090/k8s-csi-nfs/registry.k8s.io/sig-storage/csi-provisioner:v5.2.0
  3. csi-nfs-controller.yaml:          image: 172.16.4.177:8090/k8s-csi-nfs/registry.k8s.io/sig-storage/csi-resizer:v1.13.1
  4. csi-nfs-controller.yaml:          image: 172.16.4.177:8090/k8s-csi-nfs/registry.k8s.io/sig-storage/csi-snapshotter:v8.2.0
  5. csi-nfs-controller.yaml:          image: 172.16.4.177:8090/k8s-csi-nfs/registry.k8s.io/sig-storage/livenessprobe:v2.15.0
  6. csi-nfs-controller.yaml:          image: 172.16.4.177:8090/k8s-csi-nfs/registry.k8s.io/sig-storage/nfsplugin:v4.11.0
  7. csi-nfs-node.yaml:          image: 172.16.4.177:8090/k8s-csi-nfs/registry.k8s.io/sig-storage/livenessprobe:v2.15.0
  8. csi-nfs-node.yaml:          image: 172.16.4.177:8090/k8s-csi-nfs/registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.13.0
  9. csi-nfs-node.yaml:          image: 172.16.4.177:8090/k8s-csi-nfs/registry.k8s.io/sig-storage/nfsplugin:v4.11.0
  10. csi-snapshot-controller.yaml:          image: 172.16.4.177:8090/k8s-csi-nfs/registry.k8s.io/sig-storage/snapshot-controller:v8.2.0
复制代码
2.4 部署,依次执行rbac、driverinfo、controller、node四个yaml文件
  1. kubectl apply -f rbac-csi-nfs.yaml
  2. kubectl apply -f csi-nfs-driverinfo.yaml
  3. kubectl apply -f csi-nfs-controller.yaml
  4. kubectl apply -f csi-nfs-node.yaml
复制代码
2.5 查看pod状态
  1. [root@master1 v4.11.0]# kubectl -n kube-system get pod -o wide -l app=csi-nfs-node
  2. NAME                 READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
  3. csi-nfs-node-4j8r6   3/3     Running   0          82m   172.16.4.89   node3     <none>           <none>
  4. csi-nfs-node-5w28w   3/3     Running   0          82m   172.16.4.86   node1     <none>           <none>
  5. csi-nfs-node-5z4vv   3/3     Running   0          82m   172.16.4.92   master2   <none>           <none>
  6. csi-nfs-node-gcbsn   3/3     Running   0          82m   172.16.4.85   master1   <none>           <none>
  7. csi-nfs-node-hpqvh   3/3     Running   0          82m   172.16.4.90   node4     <none>           <none>
  8. csi-nfs-node-zpsx6   3/3     Running   0          82m   172.16.4.87   node2     <none>           <none>
  9. [root@master1 v4.11.0]# kubectl -n kube-system get pod -o wide -l app=csi-nfs-controller
  10. NAME                                  READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
  11. csi-nfs-controller-84f8ff88c5-x8c8b   5/5     Running   0          83m   172.16.4.92   master2   <none>           <none>
复制代码
3.配置支持动态扩容的 StorageClass​


  • 编辑并修改StorageClass​-nfs.yaml文件,根据实际情况结合注释说明进行修改,直至符合自己的环境
  • storageclass-nfs.yaml: provisioner: nfs.csi.k8s.io 和 csi-nfs-driverinfo.yaml:  name: nfs.csi.k8s.io 保持一直
  • allowVolumeExpansion: true 允许动态扩容,必须为true
  1. apiVersion: storage.k8s.io/v1
  2. kind: StorageClass
  3. metadata:
  4.   name: nfs-csi
  5.   annotations:
  6.     # 此操作是1.25的以上的一个alpha的新功能,是将此storageclass设置为默认
  7.     storageclass.kubernetes.io/is-default-class: "true"
  8. # 此处指定了csidrivers的名称
  9. provisioner: nfs.csi.k8s.io
  10. parameters:
  11.   # NFS的Server
  12.   server: 172.16.4.60
  13.   # NFS的存储路径
  14.   share: /nfs_share/k8s/nfs-csi
  15. # 是否允许动态扩容 PVC,true允许、false拒绝
  16. allowVolumeExpansion: true
  17. # 定义回收策略,删除 PVC 后保留 PV 和数据(需手动清理)
  18. reclaimPolicy: Retain
  19. #挂载模式,默认为Immediate立即挂载
  20. volumeBindingMode: Immediate
  21. mountOptions:
  22.   # 这里不只可以配置nfs的版本
  23.   - nfsvers=4.1
复制代码
  1. kubectl apply -f storageclass-nfs.yaml
复制代码

  • 查看sc
  1. [root@master1 csi-driver-nfs]# kubectl get storageclasses.storage.k8s.io
  2. NAME                PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
  3. nfs-csi (default)   nfs.csi.k8s.io   Retain          Immediate           true                   69m
复制代码
4.测试自动创建 PVC和PV

4.1 编辑测试yaml文件
  1. apiVersion: apps/v1
  2. kind: StatefulSet
  3. metadata:
  4.   name: busybox-test
  5. spec:
  6.   serviceName: "busybox-service"
  7.   replicas: 3  
  8.   selector:
  9.     matchLabels:
  10.       app: busybox-test
  11.   template:
  12.     metadata:
  13.       labels:
  14.         app: busybox-test
  15.     spec:
  16.       containers:
  17.       - name: busybox
  18.         image: 172.16.4.177:8090/ltzx/busybox:latest  # 替换成你的私有仓库地址
  19.         command: ["/bin/sh", "-c", "sleep infinity"]  # 保持容器运行
  20.         volumeMounts:
  21.         - name: data
  22.           mountPath: /mnt/storage  # 测试挂载点
  23.   volumeClaimTemplates:
  24.   - metadata:
  25.       name: data
  26.     spec:
  27.       accessModes: [ "ReadWriteOnce" ]
  28.       storageClassName: nfs-csi  # 指向你的NFS StorageClass
  29.       resources:
  30.         requests:
  31.           storage: 1Gi
复制代码
  1. kubectl apply -f busybox-test.yaml
复制代码
4.2 查看pods状态
  1. [root@master1 csi-driver-nfs]# kubectl get pods
  2. NAME             READY   STATUS    RESTARTS        AGE
  3. busybox-test-0   1/1     Running   0               13s
  4. busybox-test-1   1/1     Running   0               9s
  5. busybox-test-2   1/1     Running   0               5s
复制代码
4.3 查看PVC和PV是否自动创建


  • 通过kubectl可以看到pvc和pv已经自动创建完成
  1. [root@master1 csi-driver-nfs]# kubectl get pvc
  2. NAME                  STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
  3. data-busybox-test-0   Bound    pvc-c4505878-0d72-4955-a5b9-1f678b25b8cf   2Gi        RWO            nfs-csi        44s
  4. data-busybox-test-1   Bound    pvc-c84c5a63-bf69-4e50-ad2b-63193889d236   2Gi        RWO            nfs-csi        40s
  5. data-busybox-test-2   Bound    pvc-ae781199-fb84-4468-9dc8-69791c00793f   2Gi        RWO            nfs-csi        36s
  6. [root@master1 csi-driver-nfs]# kubectl get pv |grep nfs-csi
  7. pvc-ae781199-fb84-4468-9dc8-69791c00793f   2Gi        RWO            Retain           Bound    default/data-busybox-test-2              nfs-csi                      45s
  8. pvc-c4505878-0d72-4955-a5b9-1f678b25b8cf   2Gi        RWO            Retain           Bound    default/data-busybox-test-0              nfs-csi                      53s
  9. pvc-c84c5a63-bf69-4e50-ad2b-63193889d236   2Gi        RWO            Retain           Bound    default/data-busybox-test-1              nfs-csi                      49s
复制代码

  •  在NFS共享存储上(172.16.4.60)查看是否有pv目录生成
  1. [root@localhost nfs-csi]# ls /nfs_share/k8s/nfs-csi/
  2. pvc-ae781199-fb84-4468-9dc8-69791c00793f  pvc-c4505878-0d72-4955-a5b9-1f678b25b8cf  pvc-c84c5a63-bf69-4e50-ad2b-63193889d236
复制代码
5.测试动态扩容PVC和PV


  • 确保 nfs-csi StorageClass 的 allowVolumeExpansion 设置为 true
  1. kubectl get storageclass nfs-csi -o jsonpath='{.allowVolumeExpansion}'
  2. # 输出应为 true
复制代码
5.1 通过【步骤4】可以看到当前启动的busybox-test pod的PVC和PV容量大小为2Gi,也就是占用NFS 2Gi的存储

5.2 触发 PVC 动态扩容​,将 2Gi 扩容到 3Gi


  • 直接编辑PVC请求,将 spec.resources.requests.storage 从 2Gi 改为 3Gi,保存退出
  1. kubectl edit pvc data-busybox-test-0
复制代码
  1. # 查看PVC事件
  2. [root@master1 csi-driver-nfs]# kubectl describe pvc data-busybox-test-0
  3. Name:          data-busybox-test-0
  4. Namespace:     default
  5. StorageClass:  nfs-csi
  6. Status:        Bound
  7. Volume:        pvc-c4505878-0d72-4955-a5b9-1f678b25b8cf
  8. Labels:        app=busybox-test
  9. Annotations:   pv.kubernetes.io/bind-completed: yes
  10.                pv.kubernetes.io/bound-by-controller: yes
  11.                volume.beta.kubernetes.io/storage-provisioner: nfs.csi.k8s.io
  12.                volume.kubernetes.io/storage-provisioner: nfs.csi.k8s.io
  13. Finalizers:    [kubernetes.io/pvc-protection]
  14. Capacity:      3Gi
  15. Access Modes:  RWO
  16. VolumeMode:    Filesystem
  17. Used By:       busybox-test-0
  18. Events:
  19.   Type     Reason                  Age   From                                                         Message
  20.   ----     ------                  ----  ----                                                         -------
  21.   Normal   Provisioning            22m   nfs.csi.k8s.io_master2_1a93a622-c800-48ca-bbb0-458f20466424  External provisioner is provisioning volume for claim "default/data-busybox-test-0"
  22.   Normal   ExternalProvisioning    22m   persistentvolume-controller                                  waiting for a volume to be created, either by external provisioner "nfs.csi.k8s.io" or manually created by system administrator
  23.   Normal   ProvisioningSucceeded   22m   nfs.csi.k8s.io_master2_1a93a622-c800-48ca-bbb0-458f20466424  Successfully provisioned volume pvc-c4505878-0d72-4955-a5b9-1f678b25b8cf
  24.   Warning  ExternalExpanding       3s    volume_expand                                                Ignoring the PVC: didn't find a plugin capable of expanding the volume; waiting for an external controller to process this PVC.
  25.   Normal   Resizing                3s    external-resizer nfs.csi.k8s.io                              External resizer is resizing volume pvc-c4505878-0d72-4955-a5b9-1f678b25b8cf
  26.   Normal   VolumeResizeSuccessful  3s    external-resizer nfs.csi.k8s.io                              Resize volume succeeded
复制代码

  • 使用kubectl patch 命令
  1. kubectl patch pvc data-busybox-test-0 -p '{"spec":{"resources":{"requests":{"storage":"3Gi"}}}}'
复制代码
  1. # 查看PVC事件
  2. [root@master1 csi-driver-nfs]# kubectl describe pvc data-busybox-test-1
  3. Name:          data-busybox-test-1
  4. Namespace:     default
  5. StorageClass:  nfs-csi
  6. Status:        Bound
  7. Volume:        pvc-c84c5a63-bf69-4e50-ad2b-63193889d236
  8. Labels:        app=busybox-test
  9. Annotations:   pv.kubernetes.io/bind-completed: yes
  10.                pv.kubernetes.io/bound-by-controller: yes
  11.                volume.beta.kubernetes.io/storage-provisioner: nfs.csi.k8s.io
  12.                volume.kubernetes.io/storage-provisioner: nfs.csi.k8s.io
  13. Finalizers:    [kubernetes.io/pvc-protection]
  14. Capacity:      3Gi
  15. Access Modes:  RWO
  16. VolumeMode:    Filesystem
  17. Used By:       busybox-test-1
  18. Events:
  19.   Type     Reason                  Age   From                                                         Message
  20.   ----     ------                  ----  ----                                                         -------
  21.   Normal   ExternalProvisioning    25m   persistentvolume-controller                                  waiting for a volume to be created, either by external provisioner "nfs.csi.k8s.io" or manually created by system administrator
  22.   Normal   Provisioning            25m   nfs.csi.k8s.io_master2_1a93a622-c800-48ca-bbb0-458f20466424  External provisioner is provisioning volume for claim "default/data-busybox-test-1"
  23.   Normal   ProvisioningSucceeded   25m   nfs.csi.k8s.io_master2_1a93a622-c800-48ca-bbb0-458f20466424  Successfully provisioned volume pvc-c84c5a63-bf69-4e50-ad2b-63193889d236
  24.   Warning  ExternalExpanding       4s    volume_expand                                                Ignoring the PVC: didn't find a plugin capable of expanding the volume; waiting for an external controller to process this PVC.
  25.   Normal   Resizing                4s    external-resizer nfs.csi.k8s.io                              External resizer is resizing volume pvc-c84c5a63-bf69-4e50-ad2b-63193889d236
  26.   Normal   VolumeResizeSuccessful  4s    external-resizer nfs.csi.k8s.io                              Resize volume succeeded
复制代码

  •  使用kubectl patch 同时给多个PVC扩容,建议不要一次扩容超过3个以上的PVC,可能会出现问题
  1. #!/bin/bash
  2. for i in {0..2}; do
  3.   kubectl patch pvc data-busybox-test-$i -p '{"spec":{"resources":{"requests":{"storage":"3Gi"}}}}'
  4. done
复制代码
5.3 查看扩容后的PVC和PV状态


  • 有两个PVC和对应PV已经变成了3Gi
  1. [root@master1 csi-driver-nfs]# kubectl get pvc
  2. NAME                  STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
  3. data-busybox-test-0   Bound    pvc-c4505878-0d72-4955-a5b9-1f678b25b8cf   3Gi        RWO            nfs-csi        27m
  4. data-busybox-test-1   Bound    pvc-c84c5a63-bf69-4e50-ad2b-63193889d236   3Gi        RWO            nfs-csi        27m
  5. data-busybox-test-2   Bound    pvc-ae781199-fb84-4468-9dc8-69791c00793f   2Gi        RWO            nfs-csi        26m
  6. my-mysql-ss-0         Bound    mysql-pv                                   10Gi       RWO                           6d23h
  7. my-s-mysql-s-ss-0     Bound    mysql-s-pv                                 10Gi       RWO                           6d23h
  8. [root@master1 csi-driver-nfs]# kubectl get pv |grep nfs-csi
  9. pvc-ae781199-fb84-4468-9dc8-69791c00793f   2Gi        RWO            Retain           Bound    default/data-busybox-test-2              nfs-csi                      27m
  10. pvc-c4505878-0d72-4955-a5b9-1f678b25b8cf   3Gi        RWO            Retain           Bound    default/data-busybox-test-0              nfs-csi                      27m
  11. pvc-c84c5a63-bf69-4e50-ad2b-63193889d236   3Gi        RWO            Retain           Bound    default/data-busybox-test-1              nfs-csi                      27m
复制代码
6.参考文档
  1. https://zhuanlan.zhihu.com/p/24321695061
复制代码
 
至此就完成了自动创建PVC、PV和动态扩容PVC、PV的操作!!!
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册