NFS 服务器更新并重启后,Kubernetes 无法挂载 NFS 卷

NFS 服务器更新并重启后,Kubernetes 无法挂载 NFS 卷

将 openSUSE Leap 15.2 上的 NFS 服务器升级到最新版本并重新启动后zypper patch,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 服务器之前,一切运行正常,没有进行其他配置更改。我该如何进一步调试并再次使共享可挂载?

答案1

在尝试调试此问题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 地址一起使用是一种明显的错误配置,这种配置不知何故一直有效持续了数月,最终导致了上述错误。

相关内容