1️⃣ 개요
StatefulSet을 운영할 때 Persistent Volume(PV)의 접근 모드(Access Mode)를 어떻게 설정할 것인지는 매우 중요한 결정 요소입니다.
특히, ReadWriteOnce(RWO)와 ReadWriteMany(RWX)의 차이를 이해하고 적절한 스토리지 정책을 선택하는 것이 StatefulSet 운영의 핵심입니다.
이번 글에서는 RWO와 RWX의 차이점, 각각의 장단점, 그리고 StatefulSet에서 올바르게 적용하는 방법을 설명하겠습니다. 🚀
2️⃣ RWO vs RWX: 개념 및 차이점
쿠버네티스 Persistent Volume(PV)은 Access Mode(접근 모드) 를 통해 Pod가 볼륨을 어떻게 사용할 수 있는지 결정합니다.
StatefulSet을 운영할 때 주로 사용되는 접근 모드는 ReadWriteOnce(RWO) 와 ReadWriteMany(RWX) 입니다.
📌 RWO vs RWX 비교표
접근 모드 | 설명 | 지원 스토리지 유형 | StatefulSet에서의 사용 여부 |
ReadWriteOnce (RWO) | 하나의 Pod만 읽기/쓰기 가능 | AWS EBS, Azure Disk, GCE Persistent Disk | ✅ 일반적인 StatefulSet에서 기본적으로 사용 |
ReadWriteMany (RWX) | 여러 Pod에서 동시에 읽기/쓰기 가능 | NFS, CephFS, GlusterFS | ✅ 데이터 공유가 필요한 StatefulSet에서 사용 가능 |
ReadOnlyMany (ROX) | 여러 Pod에서 동시에 읽기만 가능 | NFS, CephFS | ❌ StatefulSet에서는 거의 사용되지 않음 |
✅ 일반적으로 StatefulSet에서는 RWO(단일 Pod 전용)를 기본적으로 사용하지만, RWX(다중 Pod 공유)도 특정 상황에서 활용할 수 있습니다.
3️⃣ ReadWriteOnce(RWO) 기반 StatefulSet 운영
✅ 1. RWO의 특징
• 한 번에 하나의 Pod에서만 볼륨을 읽고 쓸 수 있음
• 보통 클라우드 블록 스토리지(AWS EBS, Azure Disk 등)에서 사용됨
• StatefulSet에서 기본적으로 사용되는 접근 모드
📌 RWO 모드 StatefulSet 예제 (MySQL StatefulSet)
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-data
spec:
accessModes: ["ReadWriteOnce"] # RWO 모드 설정
resources:
requests:
storage: 10Gi
✅ RWO 모드는 StatefulSet에서 가장 일반적으로 사용되는 접근 모드입니다.
✅ 2. RWO 모드에서 고려해야 할 점
• 각 Pod는 독립적인 PVC를 가져야 하므로, 데이터 공유가 불가능함
• Pod가 새로운 노드로 이동할 경우, 기존 PVC를 사용할 수 없을 수도 있음
• AWS EBS, Azure Disk와 같은 블록 스토리지는 특정 노드에 종속됨
📌 Pod가 특정 노드에 바인딩되었는지 확인
kubectl get pvc -o wide
✅ 이 문제를 해결하려면 ReadWriteMany(RWX) 모드를 고려해야 합니다.
4️⃣ ReadWriteMany(RWX) 기반 StatefulSet 운영
✅ 1. RWX의 특징
• 여러 개의 Pod에서 동시에 같은 볼륨을 읽고 쓸 수 있음
• 분산 파일 시스템(NFS, CephFS, GlusterFS 등)을 사용할 때 가능
• StatefulSet에서 다중 노드에 걸쳐 데이터 공유가 필요한 경우 유용함
📌 RWX 모드 StatefulSet 예제 (NFS 기반 Redis Cluster)
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
spec:
serviceName: redis
replicas: 3
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:latest
volumeMounts:
- name: redis-data
mountPath: /data
volumeClaimTemplates:
- metadata:
name: redis-data
spec:
accessModes: ["ReadWriteMany"] # RWX 모드 설정
resources:
requests:
storage: 10Gi
storageClassName: nfs-client # RWX를 지원하는 StorageClass 사용
✅ RWX 모드는 NFS와 같은 공유 스토리지를 활용할 때 StatefulSet에서 매우 유용합니다.
✅ 2. RWX 모드에서 고려해야 할 점
• RWX를 지원하는 스토리지가 필요함 (NFS, CephFS 등)
• 파일 기반 스토리지는 블록 기반 스토리지보다 성능이 낮을 수 있음
• 애플리케이션이 데이터 동시 쓰기 문제를 감안하고 설계되어야 함
📌 RWX 지원 여부 확인 (StorageClass 조회)
kubectl get storageclass
📌 NFS 기반 PV 및 PVC 생성 예제
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
path: /mnt/nfs
server: 192.168.1.100
✅ RWX 모드는 공유 스토리지 환경에서만 사용할 수 있으며, 성능 및 데이터 동시성 문제를 고려해야 합니다.
5️⃣ StatefulSet에서 RWO와 RWX를 선택하는 기준
📌 StatefulSet에서 RWO와 RWX 선택 기준
사용 사례 | 권장 접근 모드 | 추천 스토리지 |
데이터베이스 (MySQL, PostgreSQL, MongoDB 등) | ✅ RWO | AWS EBS, Azure Disk, GCE Persistent Disk |
메시지 브로커 (Kafka, RabbitMQ) | ✅ RWO | AWS EBS, Ceph RBD |
캐시 시스템 (Redis, Memcached 등) | ✅ RWX | NFS, CephFS |
분산 파일 저장소 (Elasticsearch, MinIO) | ✅ RWX | CephFS, GlusterFS |
✅ 일반적으로 데이터 정합성이 중요한 경우 RWO를, 데이터 공유가 필요한 경우 RWX를 사용합니다.
🔥 6️⃣ 결론
✔ StatefulSet에서 RWO(ReadWriteOnce)는 기본적인 설정으로, 하나의 Pod만 해당 PVC를 사용할 수 있음
✔ RWX(ReadWriteMany)는 다중 Pod에서 동시에 볼륨을 공유해야 할 때 사용됨
✔ RWO는 AWS EBS, Azure Disk 같은 블록 스토리지에서 사용 가능하며, 성능이 뛰어남
✔ RWX는 NFS, CephFS 같은 공유 파일 시스템에서 사용 가능하며, 다중 노드 간 데이터 공유가 필요할 때 유용함
✔ 애플리케이션의 데이터 저장 방식에 따라 적절한 접근 모드를 선택해야 함
'Kubernetes > Kubernetes Advanced' 카테고리의 다른 글
📌 [StatefulSet 심화편 #15] StatefulSet의 다중 클러스터 배포 전략 (0) | 2025.03.14 |
---|---|
📌 [StatefulSet 심화편 #14] StatefulSet과 동적 스토리지 프로비저닝 활용법 (0) | 2025.03.14 |
📌 [StatefulSet 심화편 #12] StatefulSet의 Persistent Volume 재생성 및 복원 전략 (0) | 2025.03.14 |
📌 [StatefulSet 심화편 #11] StatefulSet에서 PVC 이동 및 재마운트 방법 (0) | 2025.03.14 |
📌 [StatefulSet 심화편 #10] StatefulSet의 Pod 강제 이동 (Node 간 재배치 방법) (0) | 2025.03.14 |