π 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 νμ) |
| Namespace | nfs |
| PV/PVC | 2Gi, ReadWriteMany λͺ¨λ |
| Deployment | Nginx νλ 1κ° (λ³Όλ₯¨ λ§μ΄νΈ) |
| Service | LoadBalancer |
π μ¬μ μ€λΉβ
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β
| 리μμ€ | μν |
|---|---|
Namespace | nfs λ€μμ€νμ΄μ€ μμ± |
Secret | GitLab Registry μΈμ¦ |
PersistentVolume | NFS μλ² μ°κ²° (2Gi) |
PersistentVolumeClaim | PV μμ² λ° λ°μΈλ© |
Deployment | Nginx 1κ° νλ, /usr/share/nginx/html λ§μ΄νΈ |
Service | LoadBalancerλ‘ ν¬νΈ 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λ₯Ό λ¬Όκ³ μμ΄μ μμ κ° μ λ¨.
- ν΄κ²°:
kubectl delete pvc nfs-pvc -n default(κΈ°μ‘΄ PVC μ κ±°)- μ μ¬λΌμ§ κ²½μ° κ°μ μμ :
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.serverIPλ₯Ό λ§μ€ν° λ Έλ IP(192.168.5.10)λ‘ μμ .
𧹠리μμ€ μμ β
kubectl delete -f nginx.yaml
[!NOTE]
persistentVolumeReclaimPolicy: Retainμ€μ μΌλ‘ μΈν΄ PVC μμ νμλ NFS μλ²μ λ°μ΄ν°λ 보쑴λ©λλ€.