1️⃣ 개요
StatefulSet을 운영할 때 하나의 Kubernetes 클러스터 내에서만 배포하는 것이 일반적이지만,
재해 복구(DR), 글로벌 서비스 확장, 트래픽 분산 등의 이유로 다중 클러스터 환경에서 StatefulSet을 배포해야 하는 경우가 있습니다.
이번 글에서는 StatefulSet을 다중 클러스터에 배포하는 전략과, 데이터 동기화 및 네트워크 고려 사항을 정리하겠습니다. 🚀
2️⃣ 다중 클러스터에서 StatefulSet을 배포해야 하는 이유
📌 다중 클러스터 환경에서 StatefulSet이 필요한 주요 이유
상황 | 설명 |
재해 복구(DR) | 한 클러스터가 장애가 발생해도 다른 클러스터에서 서비스 유지 |
글로벌 서비스 확장 | 여러 지역(Region)에서 트래픽을 분산하여 레이턴시 감소 |
고가용성(HA) 운영 | 특정 클러스터의 부하를 분산하고, 백업 클러스터를 운영 |
특정 리전/노드에서의 데이터 보호 | 국가별 데이터 보호 규정을 준수하면서 데이터 저장 위치 관리 |
✅ 다중 클러스터 환경에서 StatefulSet을 운영하면 장애 대응 능력을 향상시키고, 글로벌 확장을 쉽게 할 수 있습니다.
3️⃣ StatefulSet을 다중 클러스터에 배포하는 주요 방법
✅ 1. 독립적인 StatefulSet 배포 (Active-Active / Active-Passive)
각 클러스터에 독립적인 StatefulSet을 배포하고, 애플리케이션이 다중 클러스터 환경을 인식하도록 설정하는 방식입니다.
📌 구성 방식
전략 | 설명 | 장점 | 단점 |
Active-Active | 두 개 이상의 클러스터에서 동시에 서비스 운영 | 고가용성 및 부하 분산 가능 | 데이터 동기화 필요 |
Active-Passive | 한 클러스터에서 실행하고, 다른 클러스터는 대기 상태 | 데이터 정합성이 쉬움 | 장애 발생 시 페일오버 필요 |
✅ 독립적인 StatefulSet 배포 방식은 클러스터 간 네트워크 동기화 없이 개별적으로 운영 가능하지만, 데이터 정합성 유지가 필요합니다.
✅ 2. Cross-Cluster Persistent Volume 사용
StatefulSet이 클러스터 간에서 동일한 Persistent Volume을 공유하도록 설정하는 방식입니다.
일반적으로 CephFS, Portworx, Rook, Longhorn 등의 분산 스토리지 솔루션을 활용합니다.
📌 예제: CephFS 기반 RWX Persistent Volume 사용
apiVersion: v1
kind: PersistentVolume
metadata:
name: ceph-pv
spec:
capacity:
storage: 100Gi
accessModes:
- ReadWriteMany # 다중 클러스터에서 공유 가능
cephfs:
monitors:
- "192.168.1.10:6789"
path: "/k8s-ceph"
user: "admin"
secretRef:
name: ceph-secret
✅ CephFS 같은 분산 파일 시스템을 활용하면 StatefulSet의 PVC를 다중 클러스터에서 공유할 수 있습니다.
✅ 3. Federated StatefulSet 사용 (KubeFed 활용)
쿠버네티스 Federation(KubeFed)을 활용하여 하나의 StatefulSet을 여러 클러스터에 동기화하는 방식입니다.
• KubeFed는 여러 클러스터에 걸쳐 리소스를 동기화할 수 있으며, kubefedctl 명령어를 사용하여 관리합니다.
📌 Federated StatefulSet 배포 예제
apiVersion: types.kubefed.io/v1beta1
kind: FederatedStatefulSet
metadata:
name: mysql
namespace: default
spec:
template:
spec:
replicas: 3
serviceName: mysql
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"]
resources:
requests:
storage: 10Gi
✅ Federated StatefulSet을 활용하면 여러 클러스터에 동일한 StatefulSet을 자동으로 동기화할 수 있습니다.
4️⃣ 다중 클러스터 StatefulSet 운영 시 고려해야 할 사항
✅ 1. 데이터 동기화 전략
StatefulSet의 데이터는 클러스터 간 일관성을 유지해야 하므로, 동기화 방식을 결정해야 합니다.
📌 Stateful 애플리케이션의 데이터 동기화 방법
애플리케이션 유형 | 권장 데이터 동기화 방법 |
MySQL / PostgreSQL | 비동기 복제 (Asynchronous Replication) |
MongoDB | ReplicaSet 기반 클러스터링 |
Kafka | 다중 클러스터 Replication 설정 |
Elasticsearch | Cross-Cluster Replication (CCR) 사용 |
✅ 클러스터 간 데이터 정합성을 유지하는 것이 다중 클러스터 StatefulSet 운영의 핵심입니다.
✅ 2. 네트워크 라우팅 및 DNS 설정
다중 클러스터 환경에서는 클러스터 간 통신을 위한 DNS 및 라우팅 정책을 구성해야 합니다.
📌 Multi-Cluster Service 설정을 통한 DNS 라우팅 예제
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: mysql-global
spec:
hosts:
- mysql.example.com
location: MESH_EXTERNAL
resolution: DNS
addresses:
- 192.168.100.10 # 다른 클러스터의 MySQL IP
✅ 클러스터 간 DNS 설정을 통해 StatefulSet이 여러 클러스터에서 원활하게 통신할 수 있도록 구성할 수 있습니다.
✅ 3. 장애 복구 및 페일오버 설정
하나의 클러스터가 장애 발생 시, 자동으로 다른 클러스터로 트래픽을 우회하는 설정이 필요합니다.
📌 예제: Istio 기반 자동 페일오버 설정
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: mysql-failover
spec:
hosts:
- mysql.example.com
http:
- route:
- destination:
host: mysql-cluster-1
weight: 80
- destination:
host: mysql-cluster-2
weight: 20
✅ 트래픽을 자동으로 우회하면, 특정 클러스터가 다운되었을 때 빠르게 복구할 수 있습니다.
🔥 5️⃣ 결론
✔ StatefulSet을 다중 클러스터에 배포하면 재해 복구, 글로벌 서비스 확장 등의 이점을 얻을 수 있음
✔ Active-Active 또는 Active-Passive 방식으로 다중 클러스터 운영 전략을 결정해야 함
✔ CephFS, Portworx, Longhorn 같은 스토리지를 활용하면 다중 클러스터에서 PVC 공유 가능
✔ Federated StatefulSet(KubeFed)을 사용하면 여러 클러스터에 동일한 StatefulSet을 동기화 가능
✔ 다중 클러스터 데이터 동기화 전략(MySQL 복제, MongoDB ReplicaSet 등)을 고려해야 함
✔ Istio를 활용한 네트워크 라우팅 및 장애 복구 설정을 통해 고가용성을 보장할 수 있음