Kubernetes CSI NFS 驱动详解:从部署到动态存储卷实战

在 Kubernetes 中,持久化存储是应用稳定运行的关键。当需要支持多节点共享读写的场景(如 Web 应用静态资源、日志收集、配置共享等)时,NFS(Network File System)是一个成熟且广泛使用的解决方案。

本文将详细介绍如何在 Kubernetes 集群中部署和使用 csi-driver-nfs,实现基于 NFS 的动态持久卷(Persistent Volume)管理,涵盖 NFS 服务器搭建、CSI 驱动安装、StorageClass 配置、PVC 测试等完整流程。

一、csi-driver-nfs 简介

csi-driver-nfs 是 Kubernetes 官方维护的一个 CSI(Container Storage Interface)驱动程序,允许 Kubernetes 集群通过标准接口访问外部的 NFS 服务器。

主要功能特性

功能 说明
动态卷供应 支持通过 StorageClass 动态创建 PV,基于 NFS 服务器路径自动创建子目录
快照支持 支持 VolumeSnapshot,可用于备份和恢复
卷克隆 支持从现有 PVC 克隆新卷
权限控制 支持 fsGroupPolicy,可在 Pod 中设置 fsGroup 实现权限管理
灵活参数配置 支持 mountOptionsserversharesubPathreadOnly 等参数
多种部署方式 支持 Helm Chart 和 kubectl 原生部署

二、部署 NFS 服务器

在开始之前,我们需要一个可用的 NFS 服务器。以下以 Ubuntu 系统为例,在 IP 为 192.168.80.45 的机器上部署 NFS 服务。

1. 安装 NFS 服务

sudo apt update
sudo apt install nfs-kernel-server nfs-common -y

2. 创建共享目录并配置导出

sudo mkdir -p /data
echo "/data *(rw,sync,no_root_squash,no_subtree_check)" | sudo tee -a /etc/exports

参数说明:

  • rw:允许读写
  • sync:同步写入磁盘
  • no_root_squash:保留 root 用户权限(生产环境建议谨慎使用)
  • no_subtree_check:提高性能,不检查子树

3. 重启 NFS 服务并设置开机自启

sudo exportfs -a
sudo systemctl restart nfs-kernel-server
sudo systemctl enable nfs-kernel-server

此时 NFS 服务器已准备就绪,共享路径为 /data,允许所有客户端访问。

三、安装 CSI NFS 驱动

我们将使用官方提供的部署脚本进行安装。

1. 下载 CSI 驱动代码

wget https://github.com/kubernetes-csi/csi-driver-nfs/archive/refs/tags/v4.6.0.tar.gz
tar zxvf v4.6.0.tar.gz
cd csi-driver-nfs-4.6.0/deploy/v4.6.0

2. 查看所需镜像

[root@controller-node-1 deploy]# cd v4.6.0/
[root@controller-node-1 v4.6.0]# ls
crd-csi-snapshot.yaml    csi-nfs-driverinfo.yaml  csi-snapshot-controller.yaml  rbac-snapshot-controller.yaml
csi-nfs-controller.yaml  csi-nfs-node.yaml        rbac-csi-nfs.yaml
[root@controller-node-1 v4.6.0]# grep -nr "registry.k8s.io" | awk '{print $3}'
registry.k8s.io/sig-storage/csi-provisioner:v3.6.2
registry.k8s.io/sig-storage/csi-snapshotter:v6.3.2
registry.k8s.io/sig-storage/livenessprobe:v2.11.0
registry.k8s.io/sig-storage/nfsplugin:v4.6.0
registry.k8s.io/sig-storage/livenessprobe:v2.11.0
registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.9.1
registry.k8s.io/sig-storage/nfsplugin:v4.6.0
registry.k8s.io/sig-storage/snapshot-controller:v6.3.2

注意:由于国内网络限制,建议将这些镜像推送到私有仓库(如阿里云 ACR)后再部署。

3. 修改部署文件中的镜像地址

如果你使用私有镜像仓库,需要修改 deploy/v4.6.0 目录下的 YAML 文件,将 image: 字段替换为你的私有镜像地址。

4. 安装 CSI 驱动

cd ../..
./deploy/install-driver.sh v4.6.0 local

local 模式表示使用本地部署脚本,适合大多数场景。

5. 验证安装状态

kubectl -n kube-system get pod -l app=csi-nfs-controller
kubectl -n kube-system get pod -l app=csi-nfs-node

预期输出:

NAME                            READY   STATUS    RESTARTS   AGE
csi-nfs-controller-0            3/3     Running   0          2m
csi-nfs-node-abcde              2/2     Running   0          2m

控制器和节点组件均正常运行,表示 CSI 驱动安装成功。

四、创建 StorageClass

StorageClass 是实现动态卷供应的核心资源。我们将创建一个名为 nfs-csi 的 StorageClass,并将其设为默认。

1. 编写 StorageClass 配置文件

# storageclass-nfs.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-csi
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"  # 设为默认 SC
provisioner: nfs.csi.k8s.io
parameters:
  server: 192.168.80.45          # NFS 服务器地址
  share: /data                   # NFS 共享路径
  # subDir: ""                   # 可选:指定子目录
  # onDelete: delete             # 删除 PVC 时是否删除后端目录(默认 delete)
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
  - nfsvers=4.1                  # 指定 NFS 版本

2. 创建并验证

kubectl apply -f storageclass-nfs.yaml
kubectl get sc | grep nfs

输出:

nfs-csi (default)   nfs.csi.k8s.io   Delete          Immediate           true      10s

nfs-csi 已创建并设为默认 StorageClass。

五、测试动态卷供应

我们创建一个 PVC,测试是否能成功绑定 PV 并挂载到 Pod。

1. 创建 PVC

# pvc-dynamic.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-nfs-dynamic
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests: 
      storage: 1Gi
  storageClassName: nfs-csi
kubectl apply -f pvc-dynamic.yml

2. 查看 PVC 状态

kubectl get pvc pvc-nfs-dynamic

输出:

NAME              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-nfs-dynamic   Bound    pvc-e4c88c38-4f43-4813-94ab-110d248bcd84   1Gi        RWX            nfs-csi        37s

PVC 已成功绑定,PV 已由 CSI 驱动自动创建。

3. 验证 NFS 服务器目录

登录 NFS 服务器,查看 /data 目录:

root@ubuntu-server:~# cd /data/nfs/
root@ubuntu-server:/data/nfs# ls
pvc-e4c88c38-4f43-4813-94ab-110d248bcd84

你会看到一个以 PVC 唯一 ID 命名的目录,这就是动态创建的卷。

六、高级参数说明

参数 说明 是否必需 默认值
server NFS 服务器 IP 或域名 必须 -
share NFS 共享根路径 必须 -
subDir share 下创建的子目录名 可选 自动生成 PVC ID
mountPermissions 挂载后执行 chmod 设置权限 可选
onDelete 删除 PVC 时的行为:deleteretain 可选 delete
mountOptions 挂载选项,如 nfsvers=4.1, hard, intr 可选

七、总结

csi-driver-nfs 是一个稳定、功能丰富的 CSI 插件,非常适合需要共享存储的 Kubernetes 场景。结合快照、克隆等功能,可进一步提升数据管理能力。

参考资料

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐