본문 바로가기
IT & Tech 정보

Multi-Cloud Disaster Recovery as Code: Crossplane + Argo CD + Terraform 기반

by 지식과 지혜의 나무 2025. 5. 29.
반응형

DR 자동화  파이프라인



🎯 목표

AWS와 GCP 등 멀티 클라우드 환경에서 주요 인프라(네트워크, 데이터베이스, 스토리지, 애플리케이션)를 코드(Infra as Code)로 복제·동기화하고, 평상시에는 리전 간 실시간 복제만 수행하다가 장애 발생 시 한 번의 Git 커밋/PR 머지로 자동으로 페일오버까지 완료하는 완전 자동화된 재해복구(Disaster Recovery) 체계를 설계합니다.



⚙️ 핵심 구성 요소
1. Crossplane
• Kubernetes CRD 형태로 AWS·GCP 리소스를 선언적 관리
• ProviderConfig와 Composition을 통해 멀티 클라우드 리소스 동기화
2. Terraform (모듈)
• 네트워크, IAM, VPC, DB 등 공통 리소스 초회 생성
• Crossplane Composition에 필요한 모듈 코드 제공
3. Argo CD
• GitOps 엔진으로 Crossplane CR/Composition 동기화
• DR 환경용 parallel ApplicationSet으로 DR 리전 리소스 자동 생성
4. Prometheus + Alertmanager
• Primary 리전 헬스체크(Heartbeats) 모니터링
• 장애 감지 시 Webhook 알림 → GitHub Repository Dispatch 트리거
5. GitHub Actions
• 장애 Webhook 수신 시 DR 브랜치 자동 PR 생성
• PR 머지 시 Argo CD DR Application 동기화 시작



🏗️ 아키텍처 워크플로우

[초기 설정]
  ├─ Terraform 모듈로 네트워크·IAM 생성 (AWS, GCP)
  └─ Crossplane ProviderConfig 설정 (credentials)

[GitOps 배포]
  ├─ base/infra/primary/Composition.yaml  → Primary 리전 리소스 생성
  └─ dr/infra/disaster/Composition.yaml   → DR 리전 동기화 CR

[운영 중 DR 동기화]
  └─ Argo CD Self-Heal로 Primary↔DR 리소스 일관성 유지

[장애 감지]
  ├─ Prometheus 헬스체크(Primary Control Plane) 모니터링
  └─ Alertmanager Webhook → GitHub dispatch

[자동 페일오버]
  ├─ GitHub Actions: dr/infra → cherry-pick 최신 커밋 + PR 생성
  └─ PR 머지 → Argo CD: DR ApplicationSet 자동 동기화 → 페일오버 완료




🧪 실전 예시

1) Crossplane Composition (GCP CloudSQL 복제)

apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
  name: cloudsql-replica-gcp
spec:
  compositeTypeRef:
    apiVersion: example.org/v1
    kind: CompositeDatabase
  resources:
    - name: primary
      base:
        apiVersion: database.gcp.crossplane.io/v1beta1
        kind: CloudSQLInstance
        spec:
          forProvider:
            region: us-west1
            databaseVersion: POSTGRES_13
            settings:
              tier: db-custom-2-7680
      patches:
        - type: PatchSet
          patchSetName: primary-connection
    - name: replica
      base:
        apiVersion: database.gcp.crossplane.io/v1beta1
        kind: CloudSQLInstance
        spec:
          forProvider:
            region: us-east1   # DR 리전
            databaseVersion: POSTGRES_13
            settings:
              tier: db-custom-2-7680
          writeConnectionSecretToRef:
            namespace: crossplane-system
            name: db-replica-secret
      patches:
        - type: PatchSet
          patchSetName: replica-connection

2) Argo CD ApplicationSet (Primary & DR)

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: multi-region-infra
spec:
  generators:
    - list:
        elements:
          - region: primary
            path: base/infra/primary
          - region: dr
            path: dr/infra/disaster
  template:
    metadata:
      name: '{{region}}-infra'
    spec:
      project: infra
      source:
        repoURL: https://github.com/myorg/multicloud-infra
        path: '{{path}}'
        targetRevision: main
      destination:
        server: https://kubernetes.default.svc
        namespace: infra-{{region}}
      syncPolicy:
        automated:
          prune: true
          selfHeal: true

3) Prometheus 헬스체크 & Alertmanager

# PrometheusRule
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata: { name: dr-failover-check }
spec:
  groups:
  - name: dr
    rules:
    - alert: PrimaryControlPlaneDown
      expr: up{job="crossplane-controllers"} == 0
      for: 1m
      labels: { severity: critical }
      annotations:
        summary: "Primary Crossplane 컨트롤러 비정상"

# Alertmanager
receivers:
  - name: 'github-dispatch'
    webhook_configs:
      - url: 'https://api.github.com/repos/myorg/multicloud-infra/dispatches'
        http_config:
          bearer_token: ${{ secrets.GITHUB_TOKEN }}
route:
  receiver: 'github-dispatch'

4) GitHub Actions 자동 PR

name: Trigger DR Failover
on:
  webhook:
    types: [PrimaryControlPlaneDown]
jobs:
  create-pr:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - run: |
          git checkout dr
          git cherry-pick origin/main
          git push origin dr
      - name: Create Pull Request
        uses: peter-evans/create-pull-request@v5
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          title: "[DR] Failover to DR region"
          body: "Automatic DR failover triggered by PrimaryControlPlaneDown alert"
          base: dr
          head: dr




✅ 기대 효과
• 민첩한 DR 준비: 평상시 자동 복제, 장애 시 단 1 PR 머지로 페일오버
• GitOps 투명성: DR 조치 이력 모두 Git에 기록
• 멀티 클라우드 일관성: Crossplane Composition으로 클라우드 중립적 관리
• SRE 생산성 향상: 수동 DR 테스트·실행 없이 코드화된 DR 워크플로우

반응형