Docker

當 NFS 客戶端嘗試在共享文件夾上創建文件時,出現不允許的操作,伺服器和客戶端都在容器中

  • April 15, 2021

我google了很多,發現了一些類似的案例。但是,它們都不適用於我的情況。不確定它是否與Mac有關。

我會盡量清楚地描述我的問題。

  • 我使用 KIND 執行具有 3 個節點的本地 Kubernetes 集群。/data/k8s我在本地 MacOS的主節點中掛載了一個卷/tmp/k8s
  • 我在主節點上創建 NFS 伺服器,導出/data/k8s
  • 我還在從節點上安裝 NFS 作為 NFS 客戶端,並將主節點安裝/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和添加特定使用者,並在主節點和從節點上定義具有相同 user_id 和 group_id 的使用者anonuidanongid然後切換到我的從節點上定義的使用者。
  • 嘗試了很多,我都記不住了。

我知道這可能是一個特定的案例。如果有人可以提供幫助,將不勝感激。

我在使用 Docker Desktop 在本地執行 K8s 時遇到了完全相同的問題:

  • macOS 大蘇爾 11.1
  • 碼頭工人 v20.10.5
  • k8s v1.19.7

我對這種行為感到困惑,並決定將 hostPath 卷與 emptyDir 交換,只是為了看看在沒有主機系統作業系統權限的情況下是否會有任何差異來處理。出於某種原因,它起作用了,所以我只是在 NFS 伺服器上使用 emptyDir 和一些 lifeCycle 掛鉤建構了一個解決方法,以便在容器啟動/停止時從主機系統載入/保存文件。

這是程式碼:https ://github.com/tonymichaelson/k8s-nfs-operation-not-permittied-workaround

NFS 伺服器如何在 hostPath 卷上創建文件而不是在其客戶端上創建文件,這非常奇怪。但是,由於這僅適用於本地開發人員,因此我不想在此上花費大量時間。此外,雲中的解決方案永遠不會使用 hostPath。

乾杯,托尼

引用自:https://unix.stackexchange.com/questions/626064