쿠버네티스에서 PersistentVolume(PV)은 일반적으로 ReadWriteOnce(RWO) 모드를 사용하여 단일 노드에서만 읽기/쓰기 가능하지만, ReadWriteMany(RWX) 모드를 사용하면 여러 개의 Pod이 동시에 접근할 수 있습니다.
이번 글에서는 여러 Pod에서 동시에 접근할 수 있는 RWX 볼륨을 설정하고, 이를 활용하여 공유 스토리지를 적용하는 방법을 다룹니다.
📌 글에서 다루는 상황들
1️⃣ 여러 개의 Pod에서 동시에 접근 가능한 RWX 볼륨 생성
2️⃣ NFS 또는 CephFS를 활용한 공유 스토리지 적용
각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.
1️⃣ 여러 개의 Pod에서 동시에 접근 가능한 RWX 볼륨 생성
❓ 문제 상황
운영팀에서 애플리케이션이 여러 개의 Pod에서 동일한 데이터를 공유하도록 설정해야 하는 요구사항이 생겼습니다.
일반적인 PV는 ReadWriteOnce(RWO) 모드로 인해 하나의 노드에서만 읽기/쓰기 가능하지만, ReadWriteMany(RWX) 모드를 활용하면 여러 Pod이 동시에 동일한 볼륨을 사용할 수 있습니다.
• shared-pv라는 PersistentVolume을 생성해야 합니다.
• PV는 ReadWriteMany(RWX) 모드를 지원해야 합니다.
• shared-pvc를 생성하여 여러 개의 Pod이 동시에 사용할 수 있도록 설정해야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. PersistentVolume을 생성할 때 RWX 모드를 적용하여 여러 Pod에서 접근할 수 있도록 설정해야 합니다.
• accessModes: ReadWriteMany → 여러 개의 Pod에서 동시에 읽기/쓰기 가능
2. PersistentVolumeClaim을 생성하여 Pod이 해당 공유 볼륨을 활용할 수 있도록 설정해야 합니다.
✅ 정답 Manifest (RWX PersistentVolume 및 PVC 설정)
apiVersion: v1
kind: PersistentVolume
metadata:
name: shared-pv # PersistentVolume 이름
spec:
capacity:
storage: 10Gi # 10Gi 크기의 저장소 할당
accessModes:
- ReadWriteMany # 여러 개의 Pod에서 동시에 읽기/쓰기 가능
persistentVolumeReclaimPolicy: Retain # PVC 삭제 후에도 데이터 유지
nfs: # NFS 스토리지 사용
path: "/mnt/shared" # NFS 서버의 공유 디렉터리
server: 192.168.1.100 # NFS 서버의 IP 주소
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: shared-pvc # PersistentVolumeClaim 이름
spec:
accessModes:
- ReadWriteMany # PersistentVolume의 액세스 모드와 동일해야 함
resources:
requests:
storage: 10Gi # 요청하는 스토리지 크기
📌 적용 후 예상 결과 값
1. PersistentVolume 및 PersistentVolumeClaim 생성 확인
kubectl get pv
kubectl get pvc
💡 예상 출력 값
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS AGE
shared-pv 10Gi RWX Retain Bound default/shared-pvc 5s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
shared-pvc Bound shared-pv 10Gi RWX 5s
2️⃣ NFS 또는 CephFS를 활용한 공유 스토리지 적용
❓ 문제 상황
운영팀에서 여러 개의 Pod이 동일한 데이터를 공유하는 애플리케이션을 실행해야 하는 요구사항이 생겼습니다.
이를 위해 NFS 또는 CephFS 같은 공유 파일 시스템을 활용하여 여러 Pod이 동일한 스토리지를 사용할 수 있도록 설정해야 합니다.
• shared-app이라는 Deployment를 생성해야 합니다.
• Pod에서 shared-pvc를 사용하여 /data 경로에 볼륨을 마운트해야 합니다.
• 여러 개의 Pod이 /data에 접근하여 동일한 데이터를 공유해야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. Deployment를 생성할 때, shared-pvc를 volumeMounts로 마운트하여 공유 스토리지를 활용하도록 설정해야 합니다.
• volumes.persistentVolumeClaim.claimName을 shared-pvc로 지정
2. Pod이 여러 개 생성된 후, 동일한 /data 디렉터리를 공유하는지 확인해야 합니다.
✅ 정답 Manifest (NFS 또는 CephFS 기반 공유 스토리지 적용)
apiVersion: apps/v1
kind: Deployment
metadata:
name: shared-app # Deployment 이름
spec:
replicas: 3 # 동일한 Pod 3개 실행
selector:
matchLabels:
app: shared-app
template:
metadata:
labels:
app: shared-app
spec:
containers:
- name: busybox
image: busybox
command: ["sh", "-c", "echo 'Shared Data' > /data/test.txt && sleep 3600"]
volumeMounts:
- mountPath: "/data"
name: storage
volumes:
- name: storage
persistentVolumeClaim:
claimName: shared-pvc # NFS 또는 CephFS 기반 PVC 사용
📌 적용 후 예상 결과 값
1. Pod이 여러 개 실행되었는지 확인
kubectl get pods -l app=shared-app
💡 예상 출력 값
NAME READY STATUS RESTARTS AGE
shared-app-xyz1 1/1 Running 0 1m
shared-app-abc2 1/1 Running 0 30s
shared-app-def3 1/1 Running 0 20s
2. 모든 Pod에서 동일한 데이터가 저장되는지 확인
kubectl exec shared-app-xyz1 -- cat /data/test.txt
kubectl exec shared-app-abc2 -- cat /data/test.txt
kubectl exec shared-app-def3 -- cat /data/test.txt
💡 예상 출력 값
Shared Data # 모든 Pod에서 동일한 파일에 접근 가능
Shared Data
Shared Data
3. Pod 삭제 후 다시 생성된 Pod에서도 데이터 유지 확인
kubectl delete pod -l app=shared-app
kubectl get pods -l app=shared-app # 새로운 Pod이 생성됨
kubectl exec shared-app-new -- cat /data/test.txt
💡 예상 출력 값
Shared Data # 새로 생성된 Pod에서도 동일한 데이터 유지됨