Kubernetes/Kubernetes Advanced

📌 [Deployment 심화편 #8] Deployment와 Multi-Cluster Deployment: 다중 클러스터 배포 전략

ygtoken 2025. 3. 13. 10:41
728x90

 

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를 활용하여 글로벌 트래픽을 분산해야 함

데이터 일관성을 유지하기 위해 스토리지 복제 및 메시지 큐를 활용해야 함

728x90