🎯 ECS Fargate → EKS 마이그레이션 계획서

📑 목차


1. 마이그레이션 개요: ECS → EKS 전환

핵심 개념

현재 ECS Fargate로 운영되는 마이크로서비스를 **Amazon EKS (Elastic Kubernetes Service)**로 마이그레이션하여 Kubernetes 생태계의 장점을 활용합니다.

💡 마이그레이션 범위

📋 범위 정의

항목현재 (ECS)목표 (EKS)
컨테이너 오케스트레이션AWS ECS FargateAmazon EKS
서비스 수4개 (api-gateway, user, product, order)4개 (동일)
서비스 디스커버리AWS Cloud MapKubernetes Service + CoreDNS
로드 밸런싱AWS ALBAWS Load Balancer Controller
인그레스ALB + CloudFrontALB Ingress Controller
CI/CDCodePipeline + CodeBuildCodePipeline + CodeBuild + kubectl/helm
모니터링CloudWatch LogsCloudWatch + Prometheus + Grafana

2. 현재 아키텍처 (ECS Fargate)

현재 구조

ECS Fargate를 사용하여 4개의 마이크로서비스가 배포되어 있습니다.

💡 현재 아키텍처 다이어그램

📋 트래픽 흐름 (현재)

사용자
  │
  ▼
CloudFront (CDN)
  │
  ├─ /api/*  ──────────────► IGW ──► ALB ──► ECS Service (API Gateway)
  │                                             │
  │                                             ▼
  │                                    Cloud Map (Service Discovery)
  │                                             │
  │                        ┌────────────────────┼────────────────────┐
  │                        ▼                    ▼                    ▼
  │                 User Service        Product Service        Order Service
  │                   (Fargate)           (Fargate)            (Fargate)
  │                        │                    │                    │
  │                        ▼                    ▼                    ▼
  │                   RDS PostgreSQL     ElastiCache Redis      (기타)
  │                  (Private Subnet)   (Private Subnet)
  │
  └─ /*  ──────────────────► S3 (프론트엔드)

💡 현재 구성 요소

📋 ECS 리소스 현황

리소스상태설명
ECS Clusterpposiraegi-cluster
ECS Task Definitions4개 서비스용 태스크 정의
ECS Services4개 서비스 배포 완료
Cloud Mappposiraegi.internal 네임스페이스
ECR Repositories4개 서비스용 레포지토리
CloudWatch Logs서비스별 로그 그룹

3. 목표 아키텍처 (EKS)

목표 구조

EKS 클러스터를 사용하여 Kubernetes 네이티브 방식으로 마이크로서비스를 배포합니다.

💡 목표 아키텍처 다이어그램

📋 트래픽 흐름 (목표)

사용자
  │
  ▼
CloudFront (CDN)
  │
  ├─ /api/*  ──────────────► IGW ──► ALB ──► Ingress Controller (NGINX/AWS LB)
  │                                             │
  │                                             ▼
  │                                    EKS Cluster (pposiraegi-eks)
  │                                             │
  │                    ┌────────────────────────┼────────────────────────┐
  │                    ▼                        ▼                        ▼
  │              api-gateway              user-service            product-service
  │              (Deployment)             (Deployment)           (Deployment)
  │                    │                        │                        │
  │                    ▼                        ▼                        ▼
  │              order-service              (기타 서비스)            (기타)
  │              (Deployment)
  │
  └─ /*  ──────────────────► S3 (프론트엔드)

외부 리소스 연동
  │
  ├─ RDS PostgreSQL ──────────────────────────────────────────────────────►
  ├─ ElastiCache Redis ───────────────────────────────────────────────────►
  ├─ SSM Parameter Store ─────────────────────────────────────────────────►
  └─ CloudWatch Logs ────────────────────────────────────────────────────►

💡 EKS 구성 요소

📋 Kubernetes 리소스 계획

리소스상태설명
EKS Cluster🟡 계획중pposiraegi-eks 클러스터 생성
Node Groups🟡 계획중Managed Node Group (Fargate Profile도 고려)
Namespaces🟡 계획중pposiraegi 네임스페이스
Deployments🟡 계획중4개 서비스용 Deployment
Services🟡 계획중ClusterIP, LoadBalancer Service
ConfigMaps🟡 계획중애플리케이션 설정
Secrets🟡 계획중SSM Parameter Store 통합 (External Secrets Operator)
Ingress🟡 계획중AWS Load Balancer Controller

4. 마이그레이션 이유

왜 EKS인가?

Kubernetes 생태계의 장점과 장기적인 확장성을 위해 EKS로 마이그레이션합니다.

💡 기술적 이유

📋 EKS의 장점

장점설명효과
Kubernetes 생태계방대한 오픈소스 도구 활용 가능Helm, ArgoCD, Prometheus 등
포터빌리티표준 Kubernetes API 사용클라우드 간 이동 용이
고급 기능HPA, Pod Disruption Budget 등자동 스케일링 고도화
커뮤니티활발한 커뮤니티 지원문제 해결 용이
GitOpsArgoCD, Flux 등 활용선언적 배포 가능
멀티 클라우드하이브리드 클라우드 구현 가능공급업체 종속성 감소

💡 비즈니스 이유

📋 비즈니스 가치

이유설명
개발 생산성 향상Kubernetes 도구 생태계 활용
운영 효율성GitOps로 자동화 강화
확장성대규모 서비스 확장 용이
인재 확보Kubernetes 스킬 보유
장기적 비용오픈소스 도구로 비용 절감 가능

5. 마이그레이션 전략

전략 개요

점진적 마이그레이션을 통해 리스크를 최소화합니다.

💡 마이그레이션 접근법

📋 전략 옵션

전략설명장점단점
Big Bang한 번에 전체 마이그레이션빠른 완료높은 리스크
Phased (점진적)서비스별 순차적 마이그레이션리스크 분산긴 기간
Side-by-SideECS와 EKS 병행 운영롤백 용이복잡한 운영

💡 선택 전략: Phased (점진적 마이그레이션)

📋 마이그레이션 단계

Phase 1: EKS 클러스터 설정
  ├─ EKS 클러스터 생성
  ├─ Node Group 설정
  ├─ AWS Load Balancer Controller 설치
  └─ External Secrets Operator 설치

Phase 2: 첫 번째 서비스 마이그레이션 (user-service)
  ├─ Kubernetes 매니페스트 작성
  ├─ Helm Chart 작성
  ├─ 테스트 배포
  └─ 트래픽 전환

Phase 3: 나머지 서비스 마이그레이션
  ├─ product-service
  ├─ order-service
  └─ api-gateway (마지막)

Phase 4: ECS 리소스 정리
  ├─ 모든 서비스 마이그레이션 확인
  ├─ ECS 리소스 삭제
  └─ Cloud Map 삭제

Phase 5: 운영 최적화
  ├─ HPA 설정
  ├─ Prometheus + Grafana 설치
  └─ ArgoCD 설치 (GitOps)

6. 단계별 실행 계획

실행 계획

총 5단계로 나누어 마이그레이션을 진행합니다.

💡 Phase 1: EKS 클러스터 설정 (3일)

📋 작업 목록

작업예상 시간난이도담당자
EKS 모듈 Terraform 작성1일🔴 높음인프라 팀
EKS 클러스터 생성0.5일🟡 중간인프라 팀
Node Group 설정0.5일🟡 중간인프라 팀
AWS Load Balancer Controller 설치0.5일🟡 중간인프라 팀
External Secrets Operator 설치0.5일🟡 중간인프라 팀

💻 Terraform 구조

# infrastructure/modules/eks/main.tf
module "eks" {
  source  = "terraform-aws-modules/eks/aws"
  version = "~> 19.0"
 
  cluster_name    = var.cluster_name
  cluster_version = "1.28"
 
  vpc_id          = var.vpc_id
  subnet_ids      = var.private_subnet_ids
 
  eks_managed_node_groups = {
    main = {
      instance_types = ["t3.medium"]
      min_size     = 1
      max_size     = 3
      desired_size = 2
    }
  }
 
  enable_irsa = true  # IAM Roles for Service Accounts
}

💡 Phase 2: 첫 번째 서비스 마이그레이션 (2일)

📋 작업 목록

작업예상 시간난이도담당자
user-service Kubernetes 매니페스트 작성0.5일🟡 중간백엔드 팀
Helm Chart 작성0.5일🟡 중간백엔드 팀
테스트 배포0.5일🟢 쉬움전체
트래픽 전환0.5일🟡 중간인프라 팀

💻 Kubernetes 매니페스트 예시

# user-service/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: user-service
  namespace: pposiraegi
spec:
  replicas: 2
  selector:
    matchLabels:
      app: user-service
  template:
    metadata:
      labels:
        app: user-service
    spec:
      containers:
      - name: user-service
        image: <ECR_URL>/user-service:latest
        ports:
        - containerPort: 8080
        env:
        - name: DB_HOST
          valueFrom:
            secretKeyRef:
              name: user-service-secrets
              key: db-host
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: user-service-secrets
              key: db-password
        resources:
          requests:
            memory: "512Mi"
            cpu: "250m"
          limits:
            memory: "1Gi"
            cpu: "500m"
# user-service/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: user-service
  namespace: pposiraegi
spec:
  selector:
    app: user-service
  ports:
  - port: 8080
    targetPort: 8080
  type: ClusterIP

💡 Phase 3: 나머지 서비스 마이그레이션 (3일)

📋 작업 목록

서비스예상 시간난이도담당자
product-service0.75일🟡 중간백엔드 팀
order-service0.75일🟡 중간백엔드 팀
api-gateway1일🔴 높음백엔드 팀
통합 테스트0.5일🟡 중간QA 팀

💻 Ingress 설정

# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: api-gateway-ingress
  namespace: pposiraegi
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
spec:
  rules:
  - host: api.pposiraegi.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: api-gateway
            port:
              number: 8080

💡 Phase 4: ECS 리소스 정리 (1일)

📋 작업 목록

작업예상 시간난이도담당자
모든 서비스 마이그레이션 확인0.25일🟢 쉬움전체
ECS 리소스 삭제0.25일🟡 중간인프라 팀
Cloud Map 삭제0.25일🟡 중간인프라 팀
최종 테스트0.25일🟡 중간QA 팀

💡 Phase 5: 운영 최적화 (3일)

📋 작업 목록

작업예상 시간난이도담당자
HPA (Horizontal Pod Autoscaler) 설정0.5일🟡 중간인프라 팀
Prometheus + Grafana 설치1일🔴 높음인프라 팀
ArgoCD 설치 (GitOps)1일🔴 높음인프라 팀
문서화0.5일🟢 쉬움전체

💻 HPA 설정 예시

# hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: user-service-hpa
  namespace: pposiraegi
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: user-service
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

7. 기술 스택

기술 스택

EKS 마이그레이션에 필요한 기술 스택입니다.

💡 코어 기술

📋 Kubernetes 구성

기술용도버전
Amazon EKSKubernetes 클러스터1.28+
eksctlEKS 클러스터 관리최신
kubectlKubernetes 클러스터 조작1.28+
Helm패키지 매니저3.x
Kustomize매니페스트 커스터마이징최신

💻 AWS 리소스

📋 AWS 구성 요소

리소스용도설정
EKS ClusterKubernetes 제어 플레인Managed
Node GroupWorker Nodest3.medium x 2~3
ALB외부 트래픽 로드 밸런싱Internet-facing
NLB내부 서비스 로드 밸런싱Internal
RDS PostgreSQL데이터베이스기존 활용
ElastiCache Redis캐시기존 활용
SSM Parameter Store시크릿 관리External Secrets
CloudWatch로그 및 메트릭Container Insights

💻 애드온 및 컨트롤러

📋 필수 애드온

애드온용도설치 방법
AWS Load Balancer ControllerALB/NLB 통합Helm
External Secrets OperatorSSM Parameter Store 통합Helm
Metrics ServerHPA 메트릭 수집kubectl
Cluster Autoscaler노드 자동 스케일링Helm
Prometheus Adapter커스텀 메트릭Helm

💻 모니터링 및 관리

📋 운영 도구

도구용도우선순위
Prometheus메트릭 수집높음
Grafana대시보드높음
ArgoCDGitOps 배포중간
Loki로그 집계중간
Jaeger분산 추적낮음

8. 리스크 관리

리스크 관리

마이그레이션 과정에서 발생할 수 있는 리스크와 완화 방안입니다.

💡 주요 리스크

📋 리스크 매트릭스

리스크확률영향완화 방안
서비스 중단중간높음점진적 마이그레이션, 롤백 계획
성능 저하중간중간부하 테스트, 모니터링 강화
비용 증가높음중간비용 최적화, Right Sizing
팀 학습 곡선높음중간교육, 문서화, 멘토링
보안 이슈낮음높음IRSA, Network Policies, Pod Security Standards

💻 롤백 계획

📋 롤백 절차

# 1. EKS 트래픽 차단
kubectl scale deployment api-gateway --replicas=0 -n pposiraegi
 
# 2. ECS 서비스 스케일업
aws ecs update-service --cluster pposiraegi-cluster \
  --service pposiraegi-api-gateway-service \
  --desired-count 1
 
# 3. ALB 타겟 그룹 변경
# AWS 콘솔에서 EKS 타겟 그룹에서 ECS 타겟 그룹으로 변경
 
# 4. DNS 확인
nslookup api.pposiraegi.com
 
# 5. 로그 확인
aws logs tail /ecs/pposiraegi-api-gateway --follow

📊 요약

🎯 마이그레이션 일정

단계기간주요 작업
Phase 13일EKS 클러스터 설정
Phase 22일user-service 마이그레이션
Phase 33일나머지 서비스 마이그레이션
Phase 41일ECS 리소스 정리
Phase 53일운영 최적화
총 기간12일약 2주

✅ 성공 기준

  1. 가용성: 99.9% 이상 유지
  2. 성능: 기존과 동등하거나 개선
  3. 롤백 시간: 30분 이내
  4. 팀 숙련도: 팀원 80% 이상이 Kubernetes 기본 운영 가능

🎯 다음 단계

  1. EKS 모듈 Terraform 작성 시작
  2. 팀 교육 (Kubernetes 기초)
  3. 테스트 환경 구축
  4. 사용자 승인 획득

📞 연락처 및 참고 자료

참고 리소스

💻 주요 명령어

# EKS 클러스터 생성
eksctl create cluster --name pposiraegi-eks --region ap-northeast-2
 
# kubectl 컨텍스트 설정
aws eks update-kubeconfig --name pposiraegi-eks --region ap-northeast-2
 
# Helm 리포지토리 추가
helm repo add eks https://aws.github.io/eks-charts
helm repo update
 
# AWS Load Balancer Controller 설치
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
  -n kube-system --set clusterName=pposiraegi-eks
 
# External Secrets Operator 설치
helm repo add external-secrets https://charts.external-secrets.io
helm install external-secrets external-secrets/external-secrets \
  -n external-secrets --create-namespace
 
# 배포
kubectl apply -f user-service/deployment.yaml
kubectl apply -f user-service/service.yaml
 
# 상태 확인
kubectl get pods -n pposiraegi
kubectl get services -n pposiraegi
kubectl logs -f deployment/user-service -n pposiraegi

주의사항

  1. 반드시 테스트 환경에서 먼저 검증하세요.
  2. 롤백 계획을 미리 준비하고 팀원과 공유하세요.
  3. 비용 모니터링을 실시간으로 수행하세요.
  4. 보안 그룹 및 IAM 권한을 최소 원칙으로 설정하세요.