멀티클러스터 관리

여러 Kubernetes 클러스터를 통합 관리하는 방법


여러 Kubernetes 클러스터를 통합 관리하는 방법

목표: 다중 클러스터 환경에서 워크로드를 배포하고 관리할 수 있는 수준


🌐 멀티클러스터 개요

아키텍처

graph TB
    subgraph "Control Plane"
        HUB["🎯 Hub Cluster"] -->|"관리"| M1["🔷 Member 1"]
        HUB -->|"관리"| M2["🔷 Member 2"]
        HUB -->|"관리"| M3["🔷 Member 3"]
    end
    
    subgraph "네트워크"
        M1 -->|"서비스 메시"| M2
        M2 -->|"서비스 메시"| M3
    end

사용 사례:

  • 지역별 배포 (Region/Zone)
  • 재해 복구 (DR)
  • 환경 분리 (Dev/Staging/Prod)
  • 클라우드 이중화 (Multi-Cloud)

🔧 Karmada

개요

Kubernetes Native 멀티클러스터 관리.

graph TB
    subgraph "Karmada Control Plane"
        API["🔷 Karmada API Server"]
        ETCD["🗄️ etcd"]
        CM["🎮 Controller Manager"]
        SCHED["📅 Scheduler"]
    end
    
    subgraph "Member Clusters"
        C1["☸️ Cluster 1"]
        C2["☸️ Cluster 2"]
        C3["☸️ Cluster 3"]
    end
    
    API -->|"PropagationPolicy"| C1
    API -->|"PropagationPolicy"| C2
    API -->|"PropagationPolicy"| C3

설치

# Karmada CLI 설치
curl -s https://raw.githubusercontent.com/karmada-io/karmada/master/hack/install-cli.sh | bash

# Karmada 설치
karmadactl init \
  --kubeconfig /root/.kube/config \
  --karmada-data /etc/karmada

# kubeconfig 설정
export KUBECONFIG="/etc/karmada/karmada-apiserver.config"

클러스터 등록

# 멤버 클러스터 등록
karmadactl join member1 \
  --cluster-kubeconfig=/root/.kube/member1.config \
  --cluster-name=member1

# 등록 확인
kubectl get clusters

PropagationPolicy

apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:
  name: nginx-propagation
spec:
  resourceSelectors:
    - apiVersion: apps/v1
      kind: Deployment
      name: nginx
    - apiVersion: v1
      kind: Service
      name: nginx
  placement:
    clusterAffinity:
      clusterNames:
        - member1
        - member2
    replicaScheduling:
      replicaDivisionPreference: Weighted
      replicaSchedulingType: Divided
      weightPreference:
        staticWeightList:
          - targetCluster:
              clusterNames:
                - member1
            weight: 1
          - targetCluster:
              clusterNames:
                - member2
            weight: 1

OverridePolicy

apiVersion: policy.karmada.io/v1alpha1
kind: OverridePolicy
metadata:
  name: nginx-override
spec:
  resourceSelectors:
    - apiVersion: apps/v1
      kind: Deployment
      name: nginx
  overrideRules:
    - targetCluster:
        clusterNames:
          - member1
      overriders:
        plaintext:
          - path: "/spec/replicas"
            operator: replace
            value: 3
    - targetCluster:
        clusterNames:
          - member2
      overriders:
        plaintext:
          - path: "/spec/replicas"
            operator: replace
            value: 5

🌐 서비스 메시 (멀티클러스터)

Istio 멀티클러스터

# 1. Istio 설치 (각 클러스터)
istioctl install --set profile=demo \
  --set values.global.meshID=mesh1 \
  --set values.global.multiCluster.clusterName=cluster1 \
  --set values.global.network=network1

# 2. 서비스 등록
kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: service-in-cluster2
spec:
  hosts:
  - service.cluster2.local
  location: MESH_INTERNAL
  ports:
  - number: 8080
    name: http
    protocol: HTTP
  resolution: DNS
  endpoints:
  - address: service.cluster2.local
    network: network2
EOF

Linkerd 멀티클러스터

# 1. Linkerd 설치
linkerd install | kubectl apply -f -

# 2. 멀티클러스터 게이트웨이
linkerd multicluster install | kubectl apply -f -

# 3. 클러스터 연결
linkerd multicluster link --cluster-name cluster2 | kubectl apply -f -

# 4. 서비스 노출
kubectl label svc my-service mirror.linkerd.io/exported=true

📋 멀티클러스터 체크리스트

  • Karmada 설치
  • 멤버 클러스터 등록
  • PropagationPolicy 작성
  • OverridePolicy 작성
  • 서비스 메시 연결
  • DNS 설정
  • 인증서 관리
  • 모니터링 통합

🔗 관련 노트

  • 03-10-서비스메시-Istio — 서비스 메시
  • 03-09-GitOps-ArgoCD — 멀티클러스터 배포
  • 01-01-K8s-아키텍처-이해 — 클러스터 아키텍처

마지막 업데이트: 2026-06-01