Nfs

NFS 伺服器更新和重啟後 Kubernetes 無法掛載 NFS 卷

  • July 21, 2021

zypper patchopenSUSE Leap 15.2 上的 NFS 伺服器安裝到最新版本並重新啟動後,kubernetes 集群(Openshift 4.5)中的節點無法再掛載 NFS 卷。

NFS 伺服器版本:nfs-kernel-server-2.1.1-lp152.9.12.1.x86_64

/etc/exports 包含:

/nfs 192.168.11.*(rw,sync,no_wdelay,root_squash,insecure,no_subtree_check,fsid=0)

受影響的 pod 處於 ContainerCreating 狀態

kubectl describe pod/<pod_name>給出以下錯誤:

Warning  FailedMount  31m   kubelet            MountVolume.SetUp failed for volume "volume" : mount failed: exit status 32
Mounting command: systemd-run
Mounting arguments: --description=Kubernetes transient mount for /var/lib/kubelet/pods/c86dee2e-f533-43c9-9a1d-c4f00a1b8eef/volumes/kubernetes.io~nfs/smart-services-http-video-stream --scope -- mount -t nfs nfs.example.invalid:/nfs/volume /var/lib/kubelet/pods/c86dee2e-f533-43c9-9a1d-c4f00a1b8eef/volumes/kubernetes.io~nfs/pv-name
Output: Running scope as unit: run-r83d4e7dba1b645aca1e4693a48f45191.scope
mount.nfs: Operation not permitted

伺服器僅執行 NFSv4,因此 rpcbind 已關閉且 showmount 命令不起作用。

直接掛載在 Kubernetes 節點上會導致以下錯誤:

sudo mount.nfs4 nfs.example.invalid:/core tmp/ -v; echo $?
mount.nfs4: timeout set for Wed Jul 21 12:16:49 2021
mount.nfs4: trying text-based options 'vers=4.2,addr=192.168.11.2,clientaddr=192.168.11.3'
mount.nfs4: mount(2): Operation not permitted
mount.nfs4: Operation not permitted
32

NFS 伺服器上的 firewalld 規則:

 services: ssh dhcpv6-client nfs mountd rpc-bind samba http tftp
 ports: 2049/tcp 2049/udp

AppArmor 正在工作,關閉它並沒有改變結果。

在更新 NFS 伺服器之前,一切正常,沒有進行其他配置更改。我怎樣才能進一步調試它並使共享再次可掛載?

在嘗試調試此問題rpcdebug但無濟於事後,我求助於將來自其中一個節點的流量轉儲到 nfs 伺服器上。這個轉儲給出了一個有趣的線索:

NFS reply xid 4168498669 reply ERR 20: Auth Bogus Credentials (seal broken)

所以這個問題肯定與網路或設備無關。

然後我嘗試更改exports

/nfs *(rw,sync,no_wdelay,root_squash,insecure,no_subtree_check,fsid=0)

一切正常,確認這個問題出在某種exports錯誤配置上。

將規則重寫為

/nfs 192.168.11.0/24(rw,sync,no_wdelay,root_squash,insecure,no_subtree_check,fsid=0)

恢復連接。

根據https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/5/html/deployment_guide/s1-nfs-server-config-exports

萬用字元——在哪裡 * 或 ? 字元用於考慮與特定字母字元串匹配的一組完全限定域名。萬用字元不應與 IP 地址一起使用;但是,如果反向 DNS 查找失敗,它們可能會意外工作。

因此,將 * 與 IP 地址一起使用是一個明顯的錯誤配置,它以某種方式工作了幾個月,最終導致了所描述的錯誤。

引用自:https://serverfault.com/questions/1070210