当 NFS 客户端尝试在共享文件夹上创建文件时,发生操作不允许,服务器和客户端都在容器中

当 NFS 客户端尝试在共享文件夹上创建文件时,发生操作不允许,服务器和客户端都在容器中

我用谷歌搜索了很多,发现了一些类似的案例。然而,它们都不适用于我的情况。不知道和Mac有没有关系。

我会尽力尽可能清楚地描述我的问题。

  • 我使用 KIND 运行具有 3 个节点的本地 Kubernetes 集群。我/data/k8s从本地 MacOS在主节点中安装一个卷/tmp/k8s
  • 我在主节点上创建一个NFS Server,导出/data/k8s
  • 我还在从节点上安装了NFS作为NFS Client,并将主节点挂载/data/k8s到我的从节点本地/data/k8s

问题是这样的:

  • 一切在主节点上运行良好,没有问题。
  • 在从节点上,我CANNOT创建一个常规文件,同时可以创建一个文件夹
  • 在从节点上,我CAN修改在主节点上创建的所有文件
  • 在主节点上创建的任何文件都可以在从节点上同步,不会出现问题。

这是一些信息:

  • 操作系统(主站和从站相同)
NAME="Ubuntu"
VERSION="19.10 (Eoan Ermine)"
ID=ubuntu
ID_LIKE=debian
  • 主节点上的挂载信息(该空间最初是从主机 MacOS 挂载的)
root@test2-control-plane:/data/k8s# mount | grep /data
grpcfuse on /data/k8s type fuse.grpcfuse (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other,max_read=1048576)
  • 主节点上的导出设置
/data/k8s/ *(fsid=0,rw,sync,no_root_squash)
  • 主节点上的etab信息
*(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,fsid=0,anonuid=65534,anongid=65534,sec=sys,rw,secure,no_root_squash,no_all_squash)
  • 主节点的权限信息
root@test2-control-plane:/data/k8s# ls -al
total 24
drwxrwxrwx 7 root root  224 Dec 25 01:50 .
drwxrwxrwx 3 root root 4096 Dec 24 12:33 ..
  • 从节点挂载信息
root@test2-worker:/data/k8s# mount | grep /data
172.18.0.4:/data/k8s on /data/k8s type nfs (rw,relatime,vers=3,rsize=262144,wsize=262144,namlen=255,hard,nolock,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=172.18.0.4,mountvers=3,mountport=45257,mountproto=udp,local_lock=all,addr=172.18.0.4)
  • 从节点的权限信息
root@test2-worker:/data/k8s# ls -al
total 24
drwxrwxrwx 8 root root  256 Dec 25 02:17 .
drwxrwxrwx 3 root root 4096 Dec 24 13:23 ..
  • 我尝试过的:
    • 我检查过 SELinux
    root@test2-control-plane:/data/k8s# sestatus
    SELinux status:                 disabled
    
    • 我尝试添加all_squash和添加anonuid特定anongid用户,并在主节点和从节点上使用相同的 user_id 和 group_id 定义用户。然后切换到我的从节点上定义的用户。
    • 已经尝试了很多,以至于我记不住了。

我知道这可能是一个具体案例。如果有人可以提供帮助,我们将不胜感激。

答案1

我在使用 Docker Desktop 本地运行 K8s 时遇到了完全相同的问题:

  • macOS 大苏尔 11.1
  • 码头工人 v20.10.5
  • k8s v1.19.7

我对这种行为感到困惑,决定将 hostPath 卷与emptyDir 交换,只是为了看看如果没有主机系统操作系统权限来处理是否会有任何差异。由于某种原因,它起作用了,所以我只是使用 emptyDir 和 NFS 服务器上的一些生命周期挂钩构建了一个解决方法,以便在容器启动/停止时从主机系统加载/保存文件。

这是代码:https://github.com/tonomychaelson/k8s-nfs-operation-not-permittied-workaround

NFS 服务器如何在 hostPath 卷上创建文件而不是在其客户端上,这非常奇怪。但是,由于这仅适用于本地开发人员,因此我不想在这方面花费大量时间。另外,云中的解决方案永远不会使用hostPath。

干杯,托尼

相关内容