helm部署nfs provisioner

NFS 服务器部署

  • 安装 NFS 服务端软件包
yum install nfs-utils -y
systemctl start rpcbind
systemctl enable rpcbind
systemctl start nfs-server
systemctl enable nfs-server
  • 创建共享数据目录
#给nfs-provisioner配置空间
mkdir /data/nfs_pro -p
echo "/data/nfs_pro *(rw,no_root_squash)" >> /etc/exports 
# 注:这里如果配置可访问的网段,要写宿主机网段而非pod网段,因为pv本质是挂载到宿主机上再挂载到pod上。
exportfs -arv

客户端挂载测试

找一台额外的机器作为客户端验证测试

  • 创建测试挂载点
mkdir /mnt/nfs
  • 安装 NFS 软件包(一定要安装,否则无法识别 nfs 类型的存储)
yum install nfs-utils -y
  • 挂载 NFS 共享目录
mount -t nfs 192.168.40.180:/data/nfs_pro /mnt/nfs/
  • 增删改查测试
# 创建测试目录、创建测试文件、测试文件写入内容、查看写入目录和文件权限、删除目录和文件
cd /mnt/nfs/
mkdir nfs-test
touch nfs-test.txt
echo "nfs-test" > nfs-test.txt
ll
total 4
drwxr-xr-x 2 nfsnobody nfsnobody 6 Nov 29 16:56 nfs-test
-rw-r--r-- 1 nfsnobody nfsnobody 9 Nov 29 16:56 nfs-test.txt
rmdir nfs-test
rm nfs-test.txt

安装NFS Provisioner

  • 想要 Kubernetes 支持 NFS 存储,我们需要安装 nfs-subdir-external-provisioner ,它是一个存储资源自动调配器,它可将现有的 NFS 服务器通过持久卷声明来支持 Kubernetes 持久卷的动态分配。该组件是对 Kubernetes NFS-Client Provisioner 的扩展, nfs-client-provisioner 已经不提供更新,而且 Github 仓库 也已经处于归档状态,已经迁移到 nfs-subdir-external-provisioner 的仓库。

  • 官方提供的安装方式有三种:

  • With Helm

  • With Kustomize

  • Manually

  • 使用 Helm 的方式比较简单,也是现在官方推荐的、使用率最高的方式,本文仅实战演示 Helm 部署方式,其他方式请参考官方文档。

  • 集群节点安装 NFS Client

所有 Kubernetes 集群节点需要提前安装 nfs-utils,否则在部署过程中会报错.

yum install nfs-utils
  • 添加 Helm 源
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner
  • 创建 NameSpace(可选配置,主要是方便资源管理。)
kubectl create ns nfs-system

Option1:命令行快速安装NFS Provisioner

helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner --set storageClass.name=nfs-sc --set nfs.server=192.168.40.180 --set nfs.path=/data/k8s -n nfs-system

参数说明

  • --set storageClass.name=nfs-sc:指定 storageClass 的名字
  • --set nfs.server=192.168.40.180:指定 NFS 服务器的地址
  • --set nfs.path=/data/k8s:指定 NFS 导出的共享数据目录
  • --set storageClass.defaultClass=true:指定为默认的 sc,本示例没使用
  • -n nfs-system:指定命名空间

Option2:自定义values安装 NFS Provisioner

有更多定制化需求时可以选择自定义 values.yaml 的方式进行安装,实际使用中与命令行安装 NFS Subdir External Provisioner 的方式二选一即可。

# 下载解压Charts
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner
helm repo update nfs-subdir-external-provisioner
helm pull nfs-subdir-external-provisioner/nfs-subdir-external-provisioner --version 4.0.18
tar xvf nfs-subdir-external-provisioner-4.0.18.tgz
  • 根据实际情况修改 nfs-subdir-external-provisioner/values.yaml
replicaCount: 1

nfs:
  server: 192.168.40.180
  path: /data/nfs_pro/

storageClass:
  create: true
  defaultClass: falsep
  name: sc-nfs

resources:
  limits:
   cpu: 100m
   memory: 128Mi
  requests:
   cpu: 100m
   memory: 128Mi
  • 安装 NFS Subdir External Provisioner
helm upgrade -i nfs-subdir-external-provisioner -n nfs-system . -f values.yaml -f values.dev.yaml --create-namespace

验证pod挂载

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: test-nfs-pvc
spec:
  storageClassName: nfs-sc
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
---
kind: Pod
apiVersion: v1
metadata:
  name: test-nfs-pod
spec:
  containers:
  - name: test-nfs-pod
    image: busybox:stable
    command:
      - "/bin/sh"
    args:
      - "-c"
      - "touch /mnt/SUCCESS && sleep 3600"
    volumeMounts:
      - name: nfs-pvc
        mountPath: "/mnt"
  restartPolicy: "Never"
  volumes:
    - name: nfs-pvc
      persistentVolumeClaim:
        claimName: test-nfs-pvc
  • 进入pod查看挂载情况
kubectl exec test-nfs-pod -n nfs-system -- df -h

NFS存储注意事项

  • 在输出结果中我们可以看到挂载的 NFS 存储的可用空间是大于PVC中分配的 1G。
  • 实际测试写入2G 的数据量,已经超过了我们创建的 PVC 1G 的限制。因此,要特别注意,使用 NFS 存储时无法限制存储使用量。
  • PV 名称格式是 pv+随机字符串,所以,每次只要不删除 PVC,那么 Kubernetes 中 PV 与存储绑定将不会丢失,要是删除 PVC 也就意味着删除了绑定的文件夹,下次就算重新创建相同名称的 PVC,生成的文件夹名称也不会一致,因为 PV 名是随机生成的字符串,而文件夹命名又跟 PV 有关,所以删除 PVC 需谨慎。
  • Kubernetes 删除 PVC 后,在 NFS 存储层并没有立即删除 PVC 对应的数据目录及已有数据,而是将原来的数据目录改名为 archived-+原有数据目录名称的形式。