클라우드 6단계: Kubernetes 기반 배포 자동화 - 100-hours-a-week/16-Hot6-wiki GitHub Wiki
상위 문서: 클라우드 위키
관련 문서: 클라우드 WHY? 문서
Kubernetes 기반 배포 자동화
개요
서비스가 성장하고 인프라가 복잡해짐에 따라, 기존 kubeadm 기반의 수동 오케스트레이션은 유지보수와 장애 대응 측면에서 한계를 드러냈습니다. 특히 etcd
장애 발생 시 전체 클러스터의 운영이 중단되고, 복구 과정에서 과도한 수작업이 요구되는 점은 실제 운영 안정성에 큰 리스크로 작용하였습니다.
이 문서는 현재 운영 중인 FastAPI 기반 AI 서비스의 인프라 아키텍처를 Kubernetes(EKS) 기반으로 전환하고자 한 배경과 목적을 정리한 자료입니다. 기존 kubeadm 구조에서 발생한 문제점을 기술적으로 분석하고, EKS 전환의 필요성을 비용·확장성·자동화·장애 대응 등 다양한 관점에서 설명합니다.
또한 전환 이후의 아키텍처 구조와 각 계층별 구성 요소를 명확히 설명하고, 실제 Kubernetes 리소스 예시와 자동화 전략(HPA, ArgoCD 등)을 포함하여 운영 가능성을 뒷받침합니다.
목차
1. Kubernetes 도입 필요성 결정
현재 서비스 구조 요약
저희의 서비스는 다음과 같은 구조를 기반으로 운영되고 있습니다:
- 프론트엔드: React 기반 정적 페이지 (S3 + CloudFront)
- AI 서버: FastAPI 기반 LLM Inference 서버 (GCP VM 기반, Node Affinity 적용)
- 데이터베이스: MySQL (EC2 또는 Cloud SQL 등에서 운영)
- 모니터링: Prometheus, Grafana, Loki, Alertmanager
- 로그/알람 전달: Discord Webhook
- CI/CD: GitHub Actions + ArgoCD
- 운영환경 분리: dev, prod 네임스페이스 분리
kubeadm 기반 오케스트레이션의 한계
항목 | 설명 |
---|---|
수동 구성 및 유지보수 부담 | 인증서 갱신, 업그레이드, 컨트롤 플레인 재설정 등 전부 수작업 |
장애 복구 어려움 | etcd 장애 시 snapshot 및 cert 관리까지 모두 수작업 필요 |
무중단 배포 전략 부재 | Blue-Green 등도 수동으로 라우팅 전환 |
스토리지 연동 어려움 | EBS/EFS 연동이 까다롭고 CSI 설정 직접 구성 필요 |
모니터링/알람 서비스도 클러스터 의존 | 클러스터 장애 발생 시 경보 수신 불가능 |
Multi-AZ 구성의 어려움 | 고가용성 구성 위해 모든 구성요소 복제 필요 |
스케일링 어려움 | 트래픽 폭증 대응을 위해 수동 증설 필요 (HPA/CA 직접 구성) |
실질적 장애 복구 사례
etcd
Pod crash → 클러스터 전체 작동 중단- 복구를 위해 수동으로 snapshot을 이용한 etcd 복원, 인증서 재배포 필요
etcdctl snapshot restore /var/lib/etcd/snapshot.db \
--data-dir /var/lib/etcd-from-backup
kubeadm init
재시도 및 CA 키 복원 등 운영자가 모든 구성 책임
왜 EKS로 전환하는가?
1. 운영 복잡도와 장애 대응의 한계
-
kubeadm 기반 클러스터는 모든 Control Plane 구성 요소를 수동으로 관리해야 합니다. 특히
etcd
장애 시, snapshot 복원, CA 인증서 배포, kubeadm 재설정 등 운영자 수작업 부담이 매우 큽니다. -
예를 들어, 단일 Control Plane 노드에서 etcd가 크래시하면 클러스터 전체가 정지되고, 다음과 같은 복구 절차가 필요합니다:
etcdctl snapshot restore /var/lib/etcd/snapshot.db \ --data-dir /var/lib/etcd-from-backup
-
복구에는 여러 단계의 명령어와 설정 파일이 필요하며, 서비스는 일시 중지될 수 있어도 운영자가 복구에 몰입해야 하기 때문에 자원이 잠식되고 복원 시간도 예측하기 어렵습니다.
-
반면, EKS에서는 Control Plane을 AWS가 관리하며, 장애 발생 시 자동으로 감지 및 복구됩니다.
→ Control Plane의 복원 책임이 사라짐으로써, 운영 부담과 위험이 크게 줄어듭니다.
2. 서비스 구성의 복잡도 증가
- 단순한 단일 서버 아키텍처를 넘어서, 이제는 AI 모델 서버, 프론트엔드 정적 파일, 이미지 업로드 저장소 등 다양한 구성 요소가 클러스터 안팎에서 혼합 운영되고 있습니다.
- Kubernetes의 네임스페이스 분리, Service Discovery, RBAC, ConfigMap/Secret 기반 구성은 이런 복잡성을 효과적으로 제어할 수 있는 구조입니다.
3. 고급 배포 전략 요구
- AI 서버는 실험적 기능이 자주 교체되고, 모델도 잦은 테스트가 필요합니다.
- EKS는 ArgoCD + Argo Rollouts를 이용하여 Canary, Blue-Green, Progressive Delivery 같은 배포 전략을 쉽게 구현할 수 있으며, 빠른 롤백도 가능합니다.
4. 자동화된 복구 및 확장성 확보
- AI 서버는 특정 시간대에 사용자 요청이 집중되는 패턴이 존재합니다.
- EKS에서는 다음 기능을 통해 트래픽 변화에 유연하게 대응할 수 있습니다:
- HPA (Horizontal Pod Autoscaler): CPU/메모리 기반 Pod 수 자동 조절
- Managed Node Group: EC2 노드 자동 생성/삭제
- Cluster Autoscaler: 전체 노드 규모 확장
- 모든 확장·복구 기능이 Kubernetes 내부에서 자동으로 수행되며, Control Plane 상태와 무관하게 안정성을 유지할 수 있습니다.
5. 스토리지 연동 및 관리 효율화
- 동적 볼륨 프로비저닝을 통해, PVC가 EBS/EFS와 자동 연결되며, 데이터 저장소나 이미지 업로드에도 효율적입니다.
- StatefulSet + PVC 구성도 완전하게 지원되어 데이터 내구성이 확보됩니다.
6. 클라우드 네이티브 통합
- EKS는 AWS 서비스와의 연동이 용이합니다:
- IAM 기반의 Pod 권한 제어
- ACM을 통한 HTTPS 설정 자동화
- CloudWatch Logs 및 Metrics 연동
- Route 53 도메인, ALB 자동 생성 등
- 이를 통해 네트워크, 보안, 로깅, DNS, 인증서, 확장성까지 모두 통합 운영할 수 있습니다.
2. Kubernetes 아키텍처 다이어그램
- EKS (AWS): 관리형 Control Plane, EC2 기반 Worker Node
- GCP: Compute Engine 기반 AI 서버 3대
- S3 + CloudFront: 프론트엔드 정적 자산 및 유저 이미지
- CI/CD: GitHub Actions → ArgoCD
- VPN: WireGuard
- 모니터링/로깅: Prometheus, Grafana, Loki
- 알람: Alertmanager → Discord
3. 설계 설명 및 타당성 보고서
인프라 계층별 요약
계층 | 구성 요소 |
---|---|
FE | React 정적 자산 (S3 + CloudFront) |
AI | FastAPI 서버 (GCP GCE) |
CD | GitHub Actions + ArgoCD |
인프라 | EKS, VPC, LoadBalancer, GCE, Route53 |
보안 | WireGuard VPN |
모니터링 | Prometheus + Grafana + Loki + Alertmanager |
장애 대응 흐름 변화
항목 | kubeadm (기존) | EKS (전환 후) |
---|---|---|
Control Plane 복구 | 직접 snapshot/인증서 복원 | AWS 자동 복구 |
Alertmanager | 클러스터 장애 시 함께 다운 | 별도 관리 인프라 또는 MSA 분리 |
로그 확인 | 노드 접속 후 수동 확인 | CloudWatch or Loki를 통한 지속 확인 |
배포 오류 대응 | rollback 불가 → 재배포 | ArgoCD 및 GitOps 기반 자동 rollback 가능 |
4. Kubernetes 리소스 명세서
AI 서버 Deployment 예시
apiVersion: apps/v1
kind: Deployment
metadata:
name: ai-server
spec:
replicas: 2
selector:
matchLabels:
app: ai
template:
metadata:
labels:
app: ai
spec:
containers:
- name: ai
image: ghcr.io/yourorg/ai-server:latest
ports:
- containerPort: 8000
env:
- name: MODEL_PATH
value: "/models/gemma"
HPA 예시
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: ai-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: ai-server
minReplicas: 2
maxReplicas: 8
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
5. 아키텍처 구성 요약
EKS (AWS)
- Control Plane: AWS 관리형
- Worker Node: EC2 기반, 3개 AZ 분산 구성
- Load Balancer: ALB (Ingress Controller)
- DNS: Route53 + ACM
- CI/CD: GitHub Actions → ArgoCD
- 모니터링: CloudWatch + Prometheus + Grafana
- 로깅: Loki
- 알람: Alertmanager → Discord Webhook
AI 서버 (GCP)
- Compute Engine: AI 모델 인퍼런스 서버 3대
- 서비스: FastAPI 기반
- 연동 방식: WireGuard VPN + 인증
기타 요소
- 정적 자산: S3 → CloudFront
frontend/prod/blue
,frontend/prod/green
,frontend/dev
구조
- 이미지 업로드:
/assets/temp/uuid...
→ CNN 검증 후/assets/images/uuid...
이동
- 보안: WireGuard VPN 기반 내부 통신
6. 애플리케이션 구조 (Namespace 별 구성)
서비스 복잡도가 증가함에 따라 네임스페이스 단위로 애플리케이션을 구성하였습니다. 이를 통해 운영환경 분리(dev/prod), 자원 관리, RBAC 제어, 모니터링 라벨링 등을 명확히 할 수 있습니다.
네임스페이스 구성
네임스페이스 | 역할 |
---|---|
dev |
개발 및 테스트용 환경. CI/CD 자동화 배포의 기본 대상 |
prod |
운영 환경. 안정성, 알림, 롤백 전략이 강화된 환경 |
monitoring |
Prometheus, Grafana, Loki, Alertmanager 배포 |
argo |
ArgoCD 및 Rollouts 운영 |
shared |
공용 인프라(VPN, 외부 서비스 연동 등) 구성 시 사용 가능 |
앱 배포 구조 예시
dev/
├── ai-server/
│ ├── deployment.yaml
│ ├── service.yaml
│ └── hpa.yaml
├── fe-proxy/
│ ├── deployment.yaml
│ └── service.yaml
prod/
├── ai-server/
│ ├── deployment.yaml
│ ├── rollout.yaml
│ └── hpa.yaml
├── fe-proxy/
│ ├── deployment.yaml
│ └── service.yaml
운영 환경에는
Deployment
대신Rollout
을 사용하고, Argo Rollouts CRD를 기반으로 Canary/Blue-Green을 수행합니다.
7. CI/CD 및 배포 흐름도
서비스는 GitHub Actions 기반 CI와 ArgoCD 기반 CD 구조를 따릅니다.
또한 운영환경(prod)은 Blue-Green 방식의 무중단 배포를 지원합니다.
전체 배포 흐름
Dev 환경 배포 흐름
graph TD
A[개발자가 Pull Request 생성] --> B[CI 실행: GitHub Actions]
B --> C[테스트, Lint, Build Docker Image]
C --> D[DockerHub에 이미지 Push]
D --> E[GitOps 배포 파일 갱신]
E --> F[ArgoCD 감지 → 배포 시작]
F --> G[dev 네임스페이스에 자동 배포]
운영 환경 배포 흐름
graph TD
H[main 브랜치 병합] --> I[Argo Rollouts Blue-Green 시작]
I --> J[신규 버전 배포 완료]
J --> K[Prometheus 기반 분석 + 테스트 요청]
K --> L{성공 여부}
L -- 성공 --> M[트래픽 100% → Green, 기존 Blue 제거]
L -- 실패 --> N[트래픽 유지 → 기존 Blue 지속 운영]
CI 예시 스크립트 (FastAPI)
name: AI CI
on:
push:
branches: [main, dev]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v4
with:
python-version: '3.10'
- run: pip install -r requirements.txt
- run: |
docker build -t ghcr.io/myorg/ai-server:${{ github.sha }} .
docker push ghcr.io/myorg/ai-server:${{ github.sha }}
CD 예시 디렉터리 (GitOps 구조)
k8s/
├── dev/
│ └── ai-server/
│ └── deployment.yaml
├── prod/
│ └── ai-server/
│ └── rollout.yaml
Argo Rollouts 예시
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: ai-server
spec:
replicas: 2
strategy:
canary:
steps:
- setWeight: 30
- pause: { duration: 60s }
- setWeight: 100
selector:
matchLabels:
app: ai-server
template:
metadata:
labels:
app: ai-server
spec:
containers:
- name: ai-server
image: ghcr.io/myorg/ai-server:1.2.0
실패 시 자동으로 이전 버전으로 복원되고, Discord Webhook으로 결과 알림이 전송됩니다.
8. 비용 산정
기준 가정
- 리전: ap-northeast-2 (서울)
- EC2 인스턴스 요금:
t3.medium
: 약 $0.0416/시간t3.large
: 약 $0.0832/시간t3.small
: 약 $0.0208/시간
- 월 사용 시간: 720시간
- EBS SSD 스토리지: 약 $0.114/GB/월 (gp3 기준)
- ALB: 약 $18~30/월
- ArgoCD, Prometheus, Grafana, Loki, Alertmanager는 경량 단일 Pod로 가정
- GCP Compute Engine은
e2-medium
기준 사용
개발 환경 (Dev)
구성 요소 | 인스턴스 타입 | 개수 | 예상 비용 (USD) | 설명 |
---|---|---|---|---|
EC2 (ArgoCD, VPN 등) | t3.small | 1 | ~$15 | WireGuard + ArgoCD 운영 |
EC2 (모니터링 전용) | t3.medium | 1 | ~$30 | Prometheus, Grafana, Loki 등 |
EBS 스토리지 | 30GB | 1 | ~$3.5 | 기본 모니터링 데이터 저장 |
DockerHub 사용량 | - | - | $0~10 | 요금제에 따라 다름 (Free~Pro) |
합계 | - | - | $50~60/월 |
운영 환경 (Prod)
구성 요소 | 인스턴스 타입 | 개수 | 예상 비용 (USD) | 설명 |
---|---|---|---|---|
EKS Control Plane | 관리형 | 1 | 무료 | AWS 기본 제공 |
Worker Node (3AZ) | t3.large | 3 | ~$180 | GCP와 통신 포함 인퍼런스 백엔드 |
모니터링/알람 서버 | t3.medium | 1 | ~$30 | Alertmanager, Loki 등 |
Redis/Kafka 클러스터 | t3.medium | 3 | ~$90 | EKS 내부의 상태 저장형 구성 |
GCP AI 서버 | e2-medium | 3 | ~$93 | Compute Engine, 외부 서비스로 구성 |
EBS 스토리지 | 100GB | 3 | ~$34 | 고가용성 위한 분산 디스크 구성 |
ALB (Ingress) | - | 1 | ~$25 | ALB + ACM 인증서 포함 |
S3 + CloudFront | - | - | $5~15 | 정적 파일 호스팅 + 캐시 |
Discord Webhook | - | - | 무료 | 알림 전송 |
합계 | - | - | $470~500/월 |
요약 비교
항목 | Dev 환경 | Prod 환경 |
---|---|---|
월 예상 비용 | $50~60 | $470~500 |
운영 대상 | 테스트/운영도구 | 전체 서비스 |
구성 복잡도 | 단일 노드/경량 | EKS + GCP + AZ 3중화 |
확장성/모니터링 | 제한적 | 완전 구성 |
배포 전략 | CI 기반 단순 배포 | Argo Rollouts 활용 |
참고사항
- GCP 측 비용은 정기 청구 기준으로 환율 변동 및 크레딧 적용 여부에 따라 달라질 수 있습니다.
- Spot 인스턴스를 적용하면 최대 50% 이상 절감 가능하나, AI 서버와 Kafka/Redis에는 비추천됩니다.
- 알람 시스템은 Discord Webhook으로 연동되어 별도 비용 없음.
- ArgoCD, Loki, Grafana 등은 모두 오픈소스이므로 라이선스 비용 없음.