새로 추가한 노드에서만 NFS 볼륨을 쓰는 파드가 뜨지 못한다. 기존 노드는 같은 NFS 서버를 문제없이 쓰고 있다.
MountVolume.SetUp failed for volume "..." :
mount.nfs: rpc.statd is not running but is required for remote locking.
mount.nfs: Either use '-o nolock' to keep locks local, or start statd.
mount failed: exit status 32
kubelet 이 실행한 마운트 명령을 보면 버전이 드러난다.
mount -t nfs -o nfsvers=3,nodev,nosuid ...
NFSv3 는 파일 잠금을 별도 프로토콜(NLM/NSM)로 처리하고, 그 등록에 rpcbind(포트 111)와 rpc.statd 가 필요하다. NFSv4 는 잠금이 프로토콜에 통합돼 있어 이 데몬들이 필요 없다.
문제가 난 노드에서 rpcbind 가 아예 막혀 있는 경우가 많다.
rpcbind.service
Loaded: masked
Active: inactive (dead)
rpcbind 가 죽으면 rpc.statd 등록이 실패하고(Failed to register (statd, 1, udp)), 그 결과 NFSv3 마운트가 실패한다. 보안 하드닝을 적용한 이미지나 CIS 기준을 따른 노드 템플릿에서 rpcbind 를 mask 하는 일이 흔하다. GPU 노드처럼 다른 템플릿으로 만든 노드가 유독 실패한다면 이 경우다.
문제 노드에서 mask 를 풀고 기동한다.
systemctl unmask rpcbind
systemctl enable --now rpcbind
systemctl restart rpc-statd
systemctl status rpcbind rpc-statd
패키지 자체가 없으면 먼저 설치한다.
dnf install -y nfs-utils rpcbind # RHEL 계열
apt install -y nfs-common # 데비안 계열
확인은 마운트를 손으로 해 보는 것이 가장 빠르다.
rpcinfo -p localhost
showmount -e <NFS 서버>
mkdir -p /mnt/nfstest
mount -t nfs -o nfsvers=3 <NFS 서버>:/export/path /mnt/nfstest
df -h /mnt/nfstest && umount /mnt/nfstest
showmount 가 응답 없이 멈추면 그것도 rpcbind 경로다. showmount 자체가 포트 111 을 쓰기 때문이다. 이 단계에서 막히면 방화벽에서 111 이 열려 있는지 본다.
nc -zv <NFS 서버> 111
firewall-cmd --list-all
getenforce
정상 노드와 같은 명령을 돌려 차이를 비교하는 것이 진단의 핵심이다.
rpcbind 를 열고 싶지 않다면 NFSv4 로 마운트하도록 바꾼다. PV 나 StorageClass 의 mountOptions 를 본다.
kubectl get pv <PV> -o yaml | grep -A5 mountOptions
kubectl get sc <스토리지클래스> -o yaml
mountOptions:
- nfsvers=4.1
NFS 서버가 v4 를 지원하고 export 설정이 맞아야 한다. 급할 때는 nolock 으로 잠금을 로컬 처리해 넘길 수 있지만, 여러 노드가 같은 파일을 쓰는 상황에서는 데이터가 깨질 수 있으므로 임시 확인용으로만 쓴다.