본문으둜 κ±΄λ„ˆλ›°κΈ°

πŸ“‚ NFS νŒŒλ“œ 곡유 λ³Όλ₯¨ μ‹€μŠ΅ (Day 5)

πŸ“‚ NFS νŒŒλ“œ 곡유 λ³Όλ₯¨ μ‹€μŠ΅ (Day 5)

μΏ λ²„λ„€ν‹°μŠ€ νŒŒλ“œλ“€μ΄ **NFS(Network File System)**λ₯Ό 톡해 데이터λ₯Ό κ³΅μœ ν•˜λŠ” 방법을 μ‹€μŠ΅ν•©λ‹ˆλ‹€.


λͺ©μ°¨β€‹

μ„Ήμ…˜μ„€λͺ…
πŸ—οΈ μ•„ν‚€ν…μ²˜μ „μ²΄ ꡬ성 및 λ¦¬μ†ŒμŠ€ ꡬ쑰
πŸš€ 사전 μ€€λΉ„NFS μ„œλ²„/ν΄λΌμ΄μ–ΈνŠΈ μ„€μ •
πŸ“¦ ꡬ성 파일Dockerfile, nfs.yaml μ„€λͺ…
πŸ› οΈ μ‹€ν–‰ 및 검증배포, ν…ŒμŠ€νŠΈ, 확인 방법
🧹 μ‚­μ œλ¦¬μ†ŒμŠ€ 정리

πŸ—οΈ μ•„ν‚€ν…μ²˜β€‹

κ΅¬μ„±μš”μ†Œμ„€λͺ…
NFS Serverλ§ˆμŠ€ν„° λ…Έλ“œ 192.168.5.100의 /DATA 곡유
NFS Client각 μ›Œμ»€ λ…Έλ“œ (nfs-common ν•„μš”)
Namespacenfs
PV/PVC2Gi, ReadWriteMany λͺ¨λ“œ
DeploymentNginx νŒŒλ“œ 1개 (λ³Όλ₯¨ 마운트)
ServiceLoadBalancer

πŸš€ 사전 쀀비​

1️⃣ NFS μ„œλ²„ μ„€μ • (λ§ˆμŠ€ν„° λ…Έλ“œ)​

# 1. NFS μ„œλ²„ νŒ¨ν‚€μ§€ μ„€μΉ˜
sudo apt update && sudo apt install nfs-kernel-server -y

# 2. 곡유 디렉토리 생성 및 κΆŒν•œ μ„€μ •
sudo mkdir -p /DATA
sudo chmod -R 777 /DATA
sudo chown nobody:nogroup /DATA

# 3. NFS 곡유 μ„€μ •
echo "/DATA *(rw,sync,no_subtree_check,no_root_squash)" | sudo tee -a /etc/exports

# 4. μ„€μ • 적용 및 μ„œλΉ„μŠ€ μž¬μ‹œμž‘
sudo exportfs -ra
sudo systemctl restart nfs-kernel-server

2️⃣ NFS ν΄λΌμ΄μ–ΈνŠΈ μ„€μΉ˜ (λͺ¨λ“  μ›Œμ»€ λ…Έλ“œ ν•„μˆ˜)​

μΏ λ²„λ„€ν‹°μŠ€ λ…Έλ“œκ°€ NFSλ₯Ό λ§ˆμš΄νŠΈν•˜κΈ° μœ„ν•΄ λͺ¨λ“  μ›Œμ»€ λ…Έλ“œμ— μ„€μΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

# 1. 각 λ…Έλ“œμ— 직접 μ„€μΉ˜ν•˜κ±°λ‚˜
sudo apt update && sudo apt install nfs-common -y

# 2. λ§ˆμŠ€ν„° λ…Έλ“œμ—μ„œ SSH둜 일괄 μ„€μΉ˜ μ‹œ
for node in k8s-n1 k8s-n2 k8s-n3; do
ssh $node "sudo apt update && sudo apt install nfs-common -y"
done

πŸ“¦ ꡬ성 νŒŒμΌβ€‹

πŸ“„ Dockerfile​

FROM nginx:1.29.4-alpine
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

정적 파일 없이 λΉŒλ“œ β†’ NFS λ³Όλ₯¨μ—μ„œ μ½˜ν…μΈ  제곡

πŸ“„ nginx.yaml​

λ¦¬μ†ŒμŠ€μ—­ν• 
Namespacenfs λ„€μž„μŠ€νŽ˜μ΄μŠ€ 생성
SecretGitLab Registry 인증
PersistentVolumeNFS μ„œλ²„ μ—°κ²° (2Gi)
PersistentVolumeClaimPV μš”μ²­ 및 바인딩
DeploymentNginx 1개 νŒŒλ“œ, /usr/share/nginx/html 마운트
ServiceLoadBalancer둜 포트 80 λ…ΈμΆœ

πŸ› οΈ μ‹€ν–‰ 및 검증​

Step 1. 배포​

set -a && source .env && set +a && envsubst < nginx.yaml | kubectl apply -f -

Step 2. λ¦¬μ†ŒμŠ€ 확인​

# λ„€μž„μŠ€νŽ˜μ΄μŠ€ 확인
kubectl get all -n nfs

# PV/PVC μƒνƒœ 확인
kubectl get pv,pvc

Step 3. NFS μ„œλ²„μ— μ½˜ν…μΈ  생성​

# λ§ˆμŠ€ν„° λ…Έλ“œμ—μ„œ μ‹€ν–‰
echo "<h1>Hello from NFS Shared Volume!</h1>" | sudo tee /DATA/index.html

Step 4. μ›Ή 접속 ν…ŒμŠ€νŠΈβ€‹

# μ„œλΉ„μŠ€ IP/URL 확인 ν›„ 접속
curl http://<Service_IP>

[!IMPORTANT] λͺ¨λ“  νŒŒλ“œκ°€ λ™μΌν•œ NFS λ³Όλ₯¨μ„ κ³΅μœ ν•˜λ―€λ‘œ, /DATA의 파일 λ³€κ²½ μ‹œ λͺ¨λ“  νŒŒλ“œμ— μ¦‰μ‹œ λ°˜μ˜λ©λ‹ˆλ‹€.


πŸ› οΈ νŠΈλŸ¬λΈ”μŠˆνŒ… (핡심 μš”μ•½)​

μ‹€μŠ΅ 쀑 λ°œμƒν•  수 μžˆλŠ” μ£Όμš” λ¬Έμ œμ™€ ν•΄κ²° λ°©λ²•μž…λ‹ˆλ‹€.

1. νŒŒλ“œκ°€ Pending μƒνƒœ (Status: unbound PVC)​

  • 원인: PVC에 namespace: nfsκ°€ μ—†μ–΄μ„œ default λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— 생성됨.
  • ν•΄κ²°: nginx.yamlμ—μ„œ PVC의 metadata.namespaceλ₯Ό nfs둜 λͺ…μ‹œ.

2. PVκ°€ Terminating μƒνƒœλ‘œ λ©ˆμΆ€β€‹

  • 원인: 이전 λ„€μž„μŠ€νŽ˜μ΄μŠ€μ˜ PVCκ°€ PVλ₯Ό λ¬Όκ³  μžˆμ–΄μ„œ μ‚­μ œκ°€ μ•ˆ 됨.
  • ν•΄κ²°:
    1. kubectl delete pvc nfs-pvc -n default (기쑴 PVC 제거)
    2. μ•ˆ μ‚¬λΌμ§ˆ 경우 κ°•μ œ μ‚­μ œ: kubectl patch pv nfs-pv -p '{"metadata":{"finalizers":null}}'

3. νŒŒλ“œ μ—λŸ¬ FailedMount (exit status 32)​

  • 원인: μ›Œμ»€ λ…Έλ“œμ— NFS ν΄λΌμ΄μ–ΈνŠΈμš© nfs-common νŒ¨ν‚€μ§€κ°€ μ—†μŒ.
  • ν•΄κ²°: λͺ¨λ“  μ›Œμ»€ λ…Έλ“œμ— sudo apt install nfs-common -y μ„€μΉ˜.

4. νŒŒλ“œ μ—λŸ¬ FailedMount (Connection refused)​

  • 원인: nginx.yaml의 PV 섀정에 NFS μ„œλ²„(λ§ˆμŠ€ν„°) IPκ°€ ν‹€λ¦Ό.
  • ν•΄κ²°: spec.nfs.server IPλ₯Ό λ§ˆμŠ€ν„° λ…Έλ“œ IP(192.168.5.10)둜 μˆ˜μ •.

🧹 λ¦¬μ†ŒμŠ€ μ‚­μ œβ€‹

kubectl delete -f nginx.yaml

[!NOTE] persistentVolumeReclaimPolicy: Retain μ„€μ •μœΌλ‘œ 인해 PVC μ‚­μ œ 후에도 NFS μ„œλ²„μ˜ λ°μ΄ν„°λŠ” λ³΄μ‘΄λ©λ‹ˆλ‹€.


κ΄€λ ¨ λ¬Έμ„œβ€‹

κ·Έλž˜ν”„ λ·°

…
κ·Έλž˜ν”„ 데이터 λ‘œλ”© 쀑…
ν˜„μž¬: πŸ“‚ NFS νŒŒλ“œ 곡유 λ³Όλ₯¨ μ‹€μŠ΅ (Day 5)
λ…Έλ“œ 클릭 β†’ 이동 Β· λ“œλž˜κ·Έ β†’ μœ„μΉ˜ μ‘°μ •