如何在K8s中使用nfs-subdir-external-provisioner

机器人
摘要
lomtom

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}

lomtom

标题:如何在K8s中使用nfs-subdir-external-provisioner

作者:lomtom

链接:https://lomtom.cn/document/btq0wqsa5ee96