Kubernetes/Kubernetes Best Practices

[Scenario Playbook Ep.36] 🚀 PersistentVolume 편 #3 | ReadWriteMany(RWX) 볼륨 및 공유 스토리지 적용

ygtoken 2025. 3. 16. 18:49
728x90

 

쿠버네티스에서 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.claimNameshared-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에서도 동일한 데이터 유지됨

 

728x90