NFS动态存储卷

前置要求

  • 系统要求:CentOS

预备知识

如果你不知道NFS是做什么的,那么请参考下面链接(包括但不限于)进行学习:

创建 NFS 服务器

NFS 允许系统将其目录和文件共享给网络上的其他系统。通过 NFS,用户和应用程序可以访问远程系统上的文件,就象它们是本地文件一样。

安装nfs-utils

  • 在集群每一个节点安装nfs-utils
  1. sudo yum install -y nfs-utils

配置nfs-server

  • 创建共享目录
  1. mkdir -p /u01/prod
  • 编辑/etc/exports文件添加需要共享目录,每个目录的设置独占一行,编写格式如下:
  1. NFS共享目录路径 客户机IP段(参数1,参数2,...,参数n)
  • 例如:
  1. /u01 192.168.1.1/16(rw,sync,insecure,no_subtree_check,no_root_squash)

参数说明ro只读访问rw读写访问sync所有数据在请求时写入共享asyncnfs在写入数据前可以响应请求securenfs通过1024以下的安全TCP/IP端口发送insecurenfs通过1024以上的端口发送wdelay如果多个用户要写入nfs目录,则归组写入(默认)no_wdelay如果多个用户要写入nfs目录,则立即写入,当使用async时,无需此设置hide在nfs共享目录中不共享其子目录no_hide共享nfs目录的子目录subtree_check如果共享/usr/bin之类的子目录时,强制nfs检查父目录的权限(默认)no_subtree_check不检查父目录权限all_squash共享文件的UID和GID映射匿名用户anonymous,适合公用目录no_all_squash保留共享文件的UID和GID(默认)root_squashroot用户的所有请求映射成如anonymous用户一样的权限(默认)no_root_squashroot用户具有根目录的完全管理访问权限anonuid=xxx指定nfs服务器/etc/passwd文件中匿名用户的UIDanongid=xxx指定nfs服务器/etc/passwd文件中匿名用户的GID

  • 注1:尽量指定IP段最小化授权可以访问NFS 挂载的资源的客户端
  • 注2:经测试参数insecure必须要加,否则客户端挂载出错mount.nfs: access denied by server while mounting

启动NFS服务

  • 配置完成后,您可以在终端提示符后运行以下命令来启动 NFS 服务器:
  1. sudo systemctl enable nfs-server
  2. sudo systemctl start nfs-server

检查NFS服务提供是否正常

  • 到客户机上执行showmount命令进行检查
  1. $ showmount -e <NFS服务器IP地址>
  2. Exports list on <NFS服务器IP地址>:
  3. /u01

安装 nfs-client-provisioner

添加choerodon chart仓库

  1. helm repo add c7n https://openchart.choerodon.com.cn/choerodon/c7n/
  2. helm repo update
  • 在集群每一个节点安装nfs-utils
  1. sudo yum install -y nfs-utils
  • 在任意一个master节点执行下面helm命令,安装nfs-client-provisioner
  1. helm install c7n/nfs-client-provisioner \
    --set rbac.create=true \
    --set persistence.enabled=true \
    --set storageClass.name=nfs-provisioner \
  2. --set persistence.nfsServer=127.0.0.1 \
  1. --set persistence.nfsPath=/u01/prod \
  1. --version 0.1.1 \
  2. --name nfs-client-provisioner \
  3. --namespace kube-system

提供NFS服务的主机IP地址或域名

NFS服务共享的目录

验证安装

  • 新建write-pod.yaml文件,粘贴以下内容:
  1. kind: Pod
  2. apiVersion: v1
  3. metadata:
  4. name: write-pod
  5. spec:
  6. containers:
  7. - name: write-pod
  8. image: busybox
  9. command:
  10. - "/bin/sh"
  11. args:
  12. - "-c"
  13. - "touch /mnt/SUCCESS && exit 0 || exit 1"
  14. volumeMounts:
  15. - name: nfs-pvc
  16. mountPath: "/mnt"
  17. restartPolicy: "Never"
  18. volumes:
  19. - name: nfs-pvc
  20. persistentVolumeClaim:
  21. claimName: myclaim
  22. ---
  23. kind: PersistentVolumeClaim
  24. apiVersion: v1
  25. metadata:
  26. name: myclaim
  27. spec:
  28. accessModes:
  29. - ReadWriteOnce
  30. storageClassName: nfs-provisioner
  31. resources:
  32. requests:
  33. storage: 1Mi
  • 部署测试用例
  1. kubectl apply -f write-pod.yaml
  • 验证是否正常
  1. $ kubectl get po
  2. NAME READY STATUS RESTARTS AGE
  3. write-pod 0/1 Completed 0 8s

pod状态为Completed则为正常,若长时间为ContainerCreating状态则为不正常,请确认安装操作步骤是否正确。

  • 清除测试用例
  1. kubectl delete -f write-pod.yaml