Kubernetes CSI NFS 驱动详解:从部署到动态存储卷实战
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 服务器。
- 项目地址:https://github.com/kubernetes-csi/csi-driver-nfs
- CSI 插件名称:
nfs.csi.k8s.io - 协议支持:NFSv3 和 NFSv4
- 状态:GA(正式发布,生产可用)
- Kubernetes 版本要求:1.21+
主要功能特性
| 功能 | 说明 |
|---|---|
| 动态卷供应 | 支持通过 StorageClass 动态创建 PV,基于 NFS 服务器路径自动创建子目录 |
| 快照支持 | 支持 VolumeSnapshot,可用于备份和恢复 |
| 卷克隆 | 支持从现有 PVC 克隆新卷 |
| 权限控制 | 支持 fsGroupPolicy,可在 Pod 中设置 fsGroup 实现权限管理 |
| 灵活参数配置 | 支持 mountOptions、server、share、subPath、readOnly 等参数 |
| 多种部署方式 | 支持 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 时的行为:delete 或 retain |
可选 | delete |
mountOptions |
挂载选项,如 nfsvers=4.1, hard, intr 等 |
可选 | 无 |
七、总结
csi-driver-nfs 是一个稳定、功能丰富的 CSI 插件,非常适合需要共享存储的 Kubernetes 场景。结合快照、克隆等功能,可进一步提升数据管理能力。
参考资料
更多推荐
所有评论(0)