如何在K8s中使用nfs-subdir-external-provisioner
- January 25, 2024
NFS服务
什么是NFS服务
NFS(Network File System)是一种网络文件系统协议,允许在网络上共享文件系统。在 Kubernetes 中,NFS 服务通常用于提供共享存储,以满足多个 Pod 对相同数据的读写需求。通过NFS服务,不同的节点之间可以轻松地共享文件,实现数据的共享和协同工作。
安装NFS服务
在部署 NFS 服务之前,需要在相应的服务器上安装 NFS 服务软件。具体的安装过程因操作系统而异,可以参考相应文档进行安装。以下是一些常见操作系统的安装示例:
CentOS:
sudo yum install nfs-utils
**其他操作系统:**请参考相应操作系统的官方文档进行 NFS 服务软件的安装。
创建共享目录
安装完 NFS 服务软件后,需要创建共享目录供其他节点访问。以下是一个简单的示例:
sudo mkdir -p /exported/path
在这个示例中,创建了一个名为 “shared_directory” 的目录,该目录将被共享给其他节点。确保设置了适当的权限以确保访问控制。
配置NFS共享
接下来,需要配置 NFS 服务以共享创建的目录。编辑 /etc/exports
文件,添加如下行:
/exported/path *(rw,sync,no_subtree_check)
这个配置允许所有节点对 “/shared_directory” 目录进行读写操作。根据实际需求,可以调整配置参数。
启动NFS服务
# 重启 rpcbind
systemctl restart rpcbind
# 重启 NFS Server 并设置开机就启动
systemctl enable nfs && systemctl restart nfs
什么是 NFS-Subdir-External-Provisioner
nfs-subdir-external-provisioner
🔗是 Kubernetes 的外部 provisioner,专门用于与 NFS 后端一起工作。它允许在 NFS 服务器上动态创建和管理 PVs,每个 PV 存储在 NFS 共享路径的不同子目录中,实现更灵活的存储管理。
部署 NFS-Subdir-External-Provisioner
使用 Helm 安装 nfs-subdir-external-provisioner
:
# add helm repo
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
# install nfs-subdir-external-provisioner through helm
helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
--set nfs.server=x.x.x.x \
--set nfs.path=/exported/path
由于默认镜像无法访问,也可以指定镜像地址:
# install nfs-subdir-external-provisioner through helm
helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
--version 4.0.18 \
--set nfs.server=x.x.x.x \
--set nfs.path=/exported/path \
--set image.repository=swr.cn-north-4.myhuaweicloud.com/lstack-common/nfs-subdir-external-provisioner \
--set image.tag=v4.0.2 \
--set storageClass.provisionerName=nfs-provisioner
配置参数说明:
--set nfs.server=x.x.x.x
: 指定 NFS 服务器的地址,用于连接 NFS 服务。--set nfs.path=/exported/path
: 指定 NFS 服务器上的导出路径,表示 NFS 服务器上用于存储卷的路径。--set image.repository=swr.cn-north-4.myhuaweicloud.com/lstack-common/nfs-subdir-external-provisioner
: 指定 NFS Subdir External Provisioner 镜像的仓库地址。--set image.tag=v4.0.2
: 指定 NFS Subdir External Provisioner 镜像的版本标签。--set storageClass.provisionerName=nfs-provisioner
: 指定存储类的供应者名称,用于动态供给存储。后续创建的存储类中的provisioner
字段需要与该参数保持一致。
使用NFS-Subdir-External-Provisioner
创建StorageClass
StorageClass 是 Kubernetes 中的资源抽象,用于定义动态创建 Persistent Volumes(PV)的规则。它简化了存储资源的管理,允许管理员定义不同类型的存储,并为应用程序提供动态的、可伸缩的存储。通过 StorageClass,管理员可以为不同的应用程序提供适当的存储资源,无需手动预先创建 PV。
定义一个存储类lomtom-nfs
,并且使用了 NFS 提供的存储插件 nfs-subdir-external-provisioner
进行动态供给。
kubectl apply -f -<<EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: lomtom-nfs
provisioner: nfs-provisioner
EOF
注意:此处使用的provisioner
需与安装nfs-subdir-external-provisioner
时使用的storageClass.provisionerName
参数一致
创建Pod
通过创建 Pod,并挂载创建的PVC,测试是否成功动态分配了 NFS 存储。
kubectl apply -f -<<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: lomtom-nfs-claim
spec:
storageClassName: lomtom-nfs
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: Pod
metadata:
name: lomtom-nginx
spec:
containers:
- name: lomtom-nginx
image: nginx
volumeMounts:
- name: nfs-volume
mountPath: /usr/share/nginx/html
volumes:
- name: nfs-volume
persistentVolumeClaim:
claimName: lomtom-nfs-claim
EOF
通过这样的设置,Pod 中的 /usr/share/nginx/html
目录将会被动态分配的 NFS 存储所挂载。
查看所生成的资源:
➜ ~ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-8867d28b-f777-4ee9-bf89-a443e64287ec 1Gi RWX Delete Bound default/lomtom-nfs-claim lomtom-nfs 3s
➜ ~ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
lomtom-nfs-claim Bound pvc-8867d28b-f777-4ee9-bf89-a443e64287ec 1Gi RWX lomtom-nfs 4s
➜ ~ kubectl get pod
NAME READY STATUS RESTARTS AGE
lomtom-nginx 1/1 Running 0 6s
其中,PV命名规则为${namespace}-${pvcName}-${pvName}