1️⃣ 개요
대규모 서비스에서는 단일 Kubernetes 클러스터만으로 모든 애플리케이션을 운영하는 것이 어렵습니다.
• 여러 리전(Region) 및 데이터센터에 배포하여 고가용성을 확보해야 할 경우
• 각각의 팀이 독립적으로 운영하는 Kubernetes 클러스터에서 동일한 애플리케이션을 배포해야 할 경우
• 재해 복구(Disaster Recovery, DR) 환경을 구축해야 할 경우
이때 필요한 것이 Multi-Cluster Deployment(다중 클러스터 배포) 전략입니다.
이 전략을 활용하면 여러 Kubernetes 클러스터에서 애플리케이션을 효율적으로 배포하고 운영할 수 있습니다.
이번 글에서는 Multi-Cluster Deployment의 개념과, GitOps 및 Kubernetes Federation 등을 활용한 배포 방법을 설명하겠습니다. 🚀
2️⃣ Multi-Cluster Deployment란?
✅ 1. Multi-Cluster Deployment의 개념
• 단일 클러스터가 아닌, 여러 Kubernetes 클러스터에 동일한 애플리케이션을 배포하는 전략
• 서로 다른 클러스터에서 버전 관리, 트래픽 분배, 데이터 동기화가 가능해야 함
• GitOps 기반 자동화 및 서비스 메시를 활용하여 중앙 집중식 관리 가능
📌 단일 클러스터 vs Multi-Cluster Deployment 비교
특징 | 단일 클러스터 배포 | Multi-Cluster Deployment |
운영 복잡성 | ✅ 단순함 | 🚀 관리가 어려움 |
고가용성 (HA) | 🚫 클러스터 장애 시 다운타임 발생 | ✅ 다른 클러스터로 페일오버 가능 |
재해 복구 (DR) | 🚫 불가능 | ✅ 다중 리전에서 운영 가능 |
트래픽 분산 | 🚫 내부 로드밸런서 사용 | ✅ 글로벌 트래픽 분산 가능 |
✅ Multi-Cluster Deployment는 대규모 환경에서 고가용성과 재해 복구를 보장할 수 있는 전략입니다.
3️⃣ Multi-Cluster Deployment 구현 방법
Multi-Cluster Deployment를 구현하는 대표적인 방법은 GitOps 기반 배포 자동화 및 Kubernetes Federation 활용입니다.
✅ 1. GitOps 기반 Multi-Cluster Deployment (ArgoCD 활용)
GitOps는 Git을 단일 소스로 활용하여 여러 클러스터에서 애플리케이션을 자동으로 동기화하는 방식입니다.
대표적인 도구로 ArgoCD 를 활용하면 여러 클러스터에서 동일한 애플리케이션을 관리할 수 있습니다.
📌 ArgoCD 설치 (클러스터 A에 배포)
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
📌 ArgoCD를 활용한 Multi-Cluster Application 배포 예제
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-multi-cluster-app
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/my-org/kubernetes-apps.git
path: my-app
targetRevision: main
destination:
namespace: my-app
server: https://kubernetes.default.svc # 기본 클러스터
syncPolicy:
automated:
prune: true
selfHeal: true
📌 Multi-Cluster 지원을 위해 두 번째 클러스터(Cluster B) 추가
argocd cluster add cluster-b-context
✅ ArgoCD를 활용하면 Git 저장소에서 정의한 애플리케이션을 여러 클러스터에 자동 배포할 수 있습니다.
✅ 2. Kubernetes Federation을 활용한 Multi-Cluster Deployment
Kubernetes Federation을 활용하면 하나의 중앙 제어 플레인을 통해 여러 클러스터에서 애플리케이션을 동기화할 수 있습니다.
📌 Federation 설치 및 설정 (Cluster A에서 실행)
kubectl apply -f https://github.com/kubernetes-sigs/kubefed/releases/latest/download/kubefed.yaml
kubectl config use-context cluster-a
kubectl create namespace kube-federation-system
📌 Cluster B를 Federation에 추가
kubefedctl join cluster-b --host-cluster-context cluster-a --add-to-registry
📌 Federation을 활용한 Multi-Cluster Deployment 예제
apiVersion: types.kubefed.io/v1beta1
kind: FederatedDeployment
metadata:
name: my-app
namespace: my-app
spec:
template:
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx
placement:
clusters:
- name: cluster-a
- name: cluster-b
📌 Federation을 활용하여 배포 적용
kubectl apply -f federated-deployment.yaml
✅ Kubernetes Federation을 활용하면 중앙에서 여러 클러스터를 관리할 수 있습니다.
4️⃣ Multi-Cluster Deployment 운영 시 고려해야 할 점
✅ 1. 트래픽 분산 (Global Load Balancing) 설정
Multi-Cluster 환경에서는 각 클러스터 간 트래픽을 분산하는 전략이 필요합니다.
• ExternalDNS, Cloud Load Balancer, Istio Gateway 등을 활용하여 글로벌 트래픽을 분산
• 클러스터 장애 발생 시 다른 클러스터로 자동 라우팅 가능
📌 Istio Gateway를 활용한 Multi-Cluster 트래픽 분배
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: my-app
spec:
hosts:
- my-app.global
http:
- route:
- destination:
host: my-app.cluster-a.svc
weight: 50
- destination:
host: my-app.cluster-b.svc
weight: 50
📌 Istio Gateway 적용
kubectl apply -f istio-gateway.yaml
✅ 이 설정을 적용하면 트래픽이 클러스터 A와 B에 50:50으로 분산됩니다.
✅ 2. 데이터 동기화 및 스토리지 전략
Multi-Cluster 환경에서는 데이터 일관성을 유지하는 것이 중요합니다.
• 공유 스토리지 (Ceph, Rook, Portworx 등) 활용
• 데이터베이스 복제 (Galera, Vitess, CockroachDB 등) 적용
• 클러스터 간 메시지 큐(Kafka, NATS)를 사용하여 이벤트 동기화
📌 Vitess를 활용한 데이터베이스 복제 예제
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: vitess-cluster
spec:
replicas: 3
selector:
matchLabels:
app: vitess
template:
metadata:
labels:
app: vitess
spec:
containers:
- name: vtgate
image: vitess/lite
✅ 데이터 동기화가 필요한 경우, 데이터베이스 복제 및 메시지 큐를 함께 활용해야 합니다.
🔥 5️⃣ 결론
✔ Multi-Cluster Deployment는 대규모 애플리케이션 배포 및 고가용성 확보에 필수적인 전략
✔ GitOps(ArgoCD)를 활용하면 여러 클러스터에서 애플리케이션을 동기화 가능
✔ Kubernetes Federation을 활용하면 중앙에서 여러 클러스터를 통합 관리 가능
✔ Istio, ExternalDNS를 활용하여 글로벌 트래픽을 분산해야 함
✔ 데이터 일관성을 유지하기 위해 스토리지 복제 및 메시지 큐를 활용해야 함