[cloud] 6단계 : Kubernetes(AWS ECS or EKS)기반 배포 자동화 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki
1. 단계 개요
이 단계는 기존 Docker, kubeadm 기반 단일 클러스터 운영 모델에서 발생하는 한계를 해결하기 위해,
AWS ECS 혹은 EKS를 활용하여 완전한 Kubernetes 기반 멀티노드 오케스트레이션 환경을 구축하고,
서비스의 확장성, 안정성, 자동화 수준을 한 단계 업그레이드하는 것을 목표로 한다.
특히,
온기 서비스는 한 명의 사용자로부터 발생할 수 있는 대량 사진 업로드 트래픽과 장애 상황에 신속히 대응해야 하므로, 수작업 관리에 한계가 있는 kubeadm 기반 운영을 넘어, EKS의 자동화된 확장성과 고가용성을 적극 활용해야 한다.
2. 기술 선택 배경
2.1 kubeadm만으로는 부족한 이유
항목 | kubeadm 한계 | Kubernetes(EKS/ECS) 도입 효과 |
---|---|---|
운영 자동화 | 설치, 업그레이드, 인증서 갱신 모두 수작업 | 관리형 Control Plane, 자동 헬스체크, 운영 간소화 |
고가용성 | Master 장애 시 전체 서비스 영향 | EKS Control Plane은 다중 AZ 분산, 자동 복구 |
확장성 | 노드 추가/삭제 수작업, 복잡한 스케일링 | HPA, Cluster Autoscaler 통한 즉각적 확장 |
보안 통합 | IAM, VPC 통합 직접 설정 | AWS IAM Roles, VPC 네이티브 연동 지원 |
운영 인력 부담 | 수작업 유지보수, 문제 발생 시 빠른 대응 어려움 | 자동화 기반 운영, 소규모 팀에 최적화 |
2.2 온기 서비스 특성 기반 Kubernetes 필요성
1. 사용자 기반 트래픽 폭발 대응
-
온기는 이벤트, 친구 초대 등 상황에서
단일 사용자라도 다량의 사진을 동시에 업로드하는 경우가 빈번하다.
-
이로 인해 순간적인 서버 부하가 급격히 증가할 수 있다.
-
Kubernetes는 Pod와 Node를 자동 확장하여
트래픽 폭발 상황에도 빠르게 대응할 수 있다.
트래픽 집중성 높은 서비스 특성상, 빠른 자원 확장이 필수다.
2. 소규모 팀의 운영 효율성 확보
-
온기 팀은 소수 인력으로 서비스 개발과 운영을 모두 담당한다.
-
kubeadm 기반 클러스터는 수작업 장애 복구, 업그레이드 등
관리 복잡도가 높아, 인력 리소스를 소모한다.
-
Kubernetes(EKS)는
-
Self-healing,
-
Auto-scaling,
-
RollingUpdate,
-
선언적 관리
기능을 통해 운영 부담을 획기적으로 감소시킨다.
-
소규모 팀이 '운영 리스크 없이' 서비스를 확장하려면 자동화 기반 운영이 필수다.
3. 빠른 기능 업데이트와 무중단 배포
-
온기는 지속적으로 사진 분류, 앨범 추천, 검색 기능을 고도화할 예정이다.
-
이를 위해 기능 배포는 빠르고, 장애 리스크는 낮아야 한다.
-
Kubernetes는 Deployment 전략(RollingUpdate, Canary)을 지원하여,
새로운 기능을 안정적이고 끊김 없이 사용자에게 제공할 수 있다.
빠른 기능 추가와 서비스 안정성을 동시에 잡기 위해 Kubernetes 기반 운영이 필요하다.
3. Kubernetes 클러스터 아키텍처 설계
3.1 클러스터 구성
구성 요소 | 설명 |
---|---|
Control Plane | AWS EKS 관리형 Control Plane (Multi AZ 고가용성 구성) |
Worker Nodes | Managed Node Group |
네트워킹 | VPC 내 퍼블릭/프라이빗 Subnet 분리 구성 |
Load Balancer | ALB(External), NLB(Internal) 사용 |
CNI | AWS VPC CNI 또는 Calico 연동 (Pod당 VPC IP 부여) |
3.2 네임스페이스 구성 전략
네임스페이스 | 설명 |
---|---|
frontend | Next.js/Nginx 기반 프론트엔드 앱 |
backend | Spring Boot 기반 API 서버 |
ai | AI 모델 서버용 파드 관리 |
database | MySQL 클러스터 관리 |
monitoring | Prometheus, Grafana 등 모니터링 컴포넌트 |
argocd | GitOps 배포 자동화 관리용 네임스페이스 |
3.3 애플리케이션 배포 리소스
컴포넌트 | 리소스 | 특이사항 |
---|---|---|
React App | Deployment + Service(LoadBalancer) | HPA 적용 (CPU 기준) |
Spring Boot App | Deployment + Service(Internal) | HPA 적용 (CPU/Memory 기준) |
AI 서버 | Deployment + Service(Internal) | 고사양 리소스 할당, 리밋 설정 |
MySQL | StatefulSet + PVC | 영구 저장소 관리 (RDS 고려 가능) |
3.4 트래픽 흐름
- 외부 사용자가 ALB(HTTPS)로 접속
- ALB → Ingress Controller → React App
- React App → API 요청 → Spring Boot App
- Spring Boot App → AI 서버 호출 및 MySQL 연결
4. 주요 리소스 및 설정 요약
리소스 | 설정 |
---|---|
Deployment | replicas: 3, strategy: RollingUpdate |
HPA | Target CPU 70%, min: 3, max: 10 |
Ingress | ALB Ingress Controller, HTTPS 적용 |
ConfigMap/Secret | 환경변수, DB 접속 정보 관리 |
PVC | MySQL 볼륨 지속성 확보 |
Monitoring | Prometheus Operator, Grafana, Slack 알람 연동 |
5. YAML 리소스
React App Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: react-frontend
namespace: frontend
spec:
replicas: 3
selector:
matchLabels:
app: react-frontend
template:
metadata:
labels:
app: react-frontend
spec:
containers:
- name: react
image: myrepo/react-frontend:latest
ports:
- containerPort: 80
resources:
requests:
cpu: 100m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
6. 기대 효과
- 단일 사용자의 대량 트래픽에도 빠른 자원 확장으로 대응 가능
- 기능 업데이트 시 무중단 롤링 배포로 사용자 경험 유지
- 장애 발생 시 Kubernetes 자가 복구(Self-healing) 기능으로 빠른 회복
- 소규모 팀 운영 인력으로도 안정적이고 확장 가능한 서비스 관리
- 선언적 인프라 관리로 오류 가능성 최소화 및 운영 표준화
- 모니터링, 알림 시스템을 통한 빠른 장애 탐지 및 대응 가능
7. 현 단계 한계 및 향후 개선 방향
항목 | 상세 설명 |
---|---|
비용 최적화 | HPA/Cluster Autoscaler 적극 활용하여 불필요 리소스 절감 |
고급 배포 전략 | ArgoCD를 도입하여 Blue/Green 배포 도입 예정 |
네트워크 보안 | Calico NetworkPolicy 도입하여 네임스페이스별 격리 강화 예정 |
운영 자동화 | Helm Charts 관리, GitOps 기반 운영 체계 완성 예정 |
최종 정리 문장
온기 서비스는 소규모 팀이 한 명의 사용자로부터 발생할 수 있는 대량의 사진 업로드 트래픽과 장애 상황을 효율적으로 대응해야 하므로, 직접 운영 부담이 큰 kubeadm을 넘어서 EKS의 자동화와 고가용성 기능을 통해 서비스를 안정적으로 운영해야 한다.