[CL] 6단계: Kubernetes(AWS ECS or EKS)기반 배포 자동화 - 100-hours-a-week/6-nemo-wiki GitHub Wiki

📦 6단계: Kubernetes(EKS) 기반 배포 자동화 설계

✅ 도입 배경 및 필요성 (Why)

쿠버네티스는 현대 애플리케이션 배포에서 사실상 표준 오케스트레이션 플랫폼으로 자리잡았습니다. 기존 kubeadm 기반의 수동 클러스터 운영은 초기 학습에는 유리하지만, 다음과 같은 한계를 지니고 있었습니다:

  • 제어 플레인의 고가용성 보장 미흡
  • 버전 관리, 인증, 보안 등을 사용자가 직접 구성해야 함
  • 노드 오토스케일링과 같은 자동화 기능 부재
  • 서비스 확장 시 운영 복잡도 급증

이에 따라 본 프로젝트는 AWS EKS를 도입하여 관리형 쿠버네티스 환경으로 전환하고, 보다 안정적이고 자동화된 배포 체계를 구축하고자 합니다.


⚙️ 시스템 구조 아키텍처 (Architecture Overview)

text
복사편집
[사용자 브라우저]
        ↓ HTTPS (Route 53 + ACM)
[ALB (AWS ALB Ingress Controller)]
        ↓ 경로 기반 라우팅
[Ingress Controller Pod (Public Subnet)]
        ↓
────────────────────────────────────
| Namespace: frontend              |
|  → frontend-service (ClusterIP)  |
|  → Next.js Pods (Deployment)     |
| Namespace: backend               |
|  → backend-service (ClusterIP)   |
|  → Spring Boot Pods (Deployment) |
| Namespace: ai                    |
|  → FastAPI Pods + ChromaDB       |
────────────────────────────────────
        ↓
[MySQL, Redis (StatefulSet + PVC)]

  • Ingress Controller: ALB 기반 (퍼블릭) + NGINX 기반 (프라이빗) 선택적 병행 구성
  • Namespace 분리 전략: 서비스 단위 (frontend, backend, ai 등)
  • 스토리지 구성: StatefulSet + EBS 기반 PVC 구성
  • 배포 방식: GitHub Actions + Helm + ArgoCD 기반 GitOps 자동화

🧩 주요 기술 명세

항목 설정 내용
클러스터 유형 AWS EKS (Managed Control Plane)
노드 그룹 Managed Node Group (EC2 기반)
네트워크 VPC + 퍼블릭/프라이빗 서브넷
Ingress ALB Ingress Controller (공용), NGINX Ingress (내부용)
배포 방식 GitOps (ArgoCD), CI: GitHub Actions
컨테이너 레지스트리 Amazon ECR
모니터링 (선택) Prometheus, Grafana

📁 예시 리소스 정의

yaml
복사편집
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-deployment
  namespace: backend
spec:
  replicas: 2
  selector:
    matchLabels:
      app: spring
  template:
    metadata:
      labels:
        app: spring
    spec:
      containers:
        - name: spring
          image: 084375578827.dkr.ecr.ap-northeast-2.amazonaws.com/my-app-backend:latest
          ports:
            - containerPort: 8080

yaml
복사편집
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: backend-ingress
  namespace: backend
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/group.name: backend-ingress-group
spec:
  ingressClassName: alb
  rules:
    - http:
        paths:
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: backend-service
                port:
                  number: 8080


🔍 운영 기대 효과

기능 개선 내용
가용성 제어 플레인의 고가용성, AWS SLA 적용
배포 자동화 GitOps 기반 ArgoCD 적용
인증 보안 IAM 역할 기반 접근 (IRSA)
오토스케일링 Horizontal Pod Autoscaler + Managed Node Group
트래픽 처리 ALB + 경로 기반 라우팅

📝 추가 고려사항

  • Karpenter 도입 여부 (노드 자동 생성)
  • ExternalDNS + Route53 자동 연동
  • NetworkPolicy 구성 통한 내부 보안 강화
  • Multi-AZ 구성을 통한 HA 확장