본문으둜 κ±΄λ„ˆλ›°κΈ°

πŸ“¦ 3-Tier Architecture: Nginx + FastAPI + MySQL

πŸ“¦ 3-Tier Architecture: Nginx + FastAPI + MySQL

Kubernetes ν™˜κ²½μ—μ„œμ˜ Web(Nginx) - WAS(FastAPI) - DB(MySQL) 3-Tier ꡬ성 μ•„ν‚€ν…μ²˜μž„.

λͺ©μ°¨β€‹


οΏ½πŸ“Š μ•„ν‚€ν…μ²˜ λ‹€μ΄μ–΄κ·Έλž¨β€‹

🦊 GitLab CI/CD νŒŒμ΄ν”„λΌμΈβ€‹

이 ν”„λ‘œμ νŠΈλŠ” GitHub Push -> GitLab Mirroring -> GitLab CI Build 과정을 톡해 3-Tier용 이미지λ₯Ό μžλ™μœΌλ‘œ λΉŒλ“œν•˜κ³  배포함.

Job NameStageμ—­ν• Dockerfile μœ„μΉ˜λŒ€μƒ 이미지
build-3tier-mysqlbuildMySQL 8.0 μ»€μŠ€ν…€ 이미지 λΉŒλ“œ3-tier/mysql/Dockerfileregistry.gitlab.com/.../3tier-mysql
build-3tier-fastapibuildFastAPI μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 이미지 λΉŒλ“œ3-tier/fastapi/Dockerfileregistry.gitlab.com/.../fastapi
build-3tier-nginxbuildNginx μ»€μŠ€ν…€ 이미지 λΉŒλ“œ3-tier/nginx/Dockerfileregistry.gitlab.com/.../3tier-nginx

μ‹€ν–‰ 쑰건:

  • 브랜치: feat/on-premise-ict
  • 트리거: ν•΄λ‹Ή λΈŒλžœμΉ˜μ— Push λ°œμƒ μ‹œ μžλ™ μ‹€ν–‰

πŸ—οΈ ꡬ성 μš”μ†Œβ€‹

1. Nginx (Web Tier)​

  • Namespace: 3tier-nginx
  • Role: 정적 파일 μ„œλΉ™ 및 λ¦¬λ²„μŠ€ ν”„λ‘μ‹œ
  • Replicas: 3
  • Service Type: LoadBalancer (μ™ΈλΆ€ 접속 ν—ˆμš©)
  • Volume: /usr/share/nginx/html (정적 파일)

2. FastAPI (WAS Tier)​

  • Namespace: 3tier-fastapi
  • Role: API λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 처리
  • Replicas: 3
  • Service Type: ClusterIP (λ‚΄λΆ€ 톡신 μ „μš©)
  • Volume: /app (μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œ)

3. MySQL (DB Tier)​

  • Namespace: 3tier-mysql
  • Role: 데이터 관리 및 μ €μž₯
  • Replicas: 1
  • Service Type: ClusterIP (λ‚΄λΆ€ 톡신 μ „μš©)
  • Volume: /var/lib/mysql (DB 데이터 영ꡬ μ €μž₯)

πŸ“¦ 크둜슀 λ„€μž„μŠ€νŽ˜μ΄μŠ€ 톡신​

각 ν‹°μ–΄κ°€ λΆ„λ¦¬λœ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— λ°°ν¬λ˜λ―€λ‘œ, FQDN을 μ‚¬μš©ν•˜μ—¬ 톡신함.

톡신 λ°©ν–₯FQDN
Nginx β†’ FastAPIfastapi-service.3tier-fastapi.svc.cluster.local
FastAPI β†’ MySQLmysql-service.3tier-mysql.svc.cluster.local

οΏ½πŸ’Ύ Volume ꡬ성​

μ»΄ν¬λ„ŒνŠΈMount Pathμ„€λͺ…
Nginx/usr/share/nginx/html정적 μ›Ή μ½˜ν…μΈ  (HTML, CSS λ“±) μ €μž₯
FastAPI/appPython μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ†ŒμŠ€ μ½”λ“œ μ €μž₯
MySQL/var/lib/mysqlλ°μ΄ν„°λ² μ΄μŠ€ 파일 영ꡬ μ €μž₯

πŸš€ 배포 방법​

1️⃣ 사전 μ€€λΉ„ (.env μ„€μ •)​

μ΅œμƒμœ„ 디렉토리(3-tier)의 .env νŒŒμΌμ„ μ‚¬μš©ν•¨.

# .env 파일 생성 (없을 경우)
cp .env.example .env

# .env 파일 μˆ˜μ •
# MYSQL_ROOT_PASSWORD, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE
# DOCKER_CONFIG_JSON_BASE64 (이미지 Pull용 μ‹œν¬λ¦Ώ)
vi .env

2️⃣ MySQL 배포 (3tier-mysql)​

λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό λ¨Όμ € 배포함.

# 3-tier ν΄λ”μ—μ„œ μ‹€ν–‰
cd on-premise-ict/day3-1217/3-tier

# .env λ‘œλ“œ 및 배포
set -a && source .env && set +a && envsubst < mysql/mysql.yaml | kubectl apply -f -

# 확인
kubectl get all -n 3tier-mysql

3️⃣ FastAPI 배포 (3tier-fastapi)​

MySQL이 μ€€λΉ„λ˜λ©΄ FastAPIλ₯Ό 배포함.

# .env λ‘œλ“œ 및 배포
set -a && source .env && set +a && envsubst < fastapi/fastapi.yaml | kubectl apply -f -

# 확인
kubectl get all -n 3tier-fastapi

4️⃣ Nginx 배포 (3tier-nginx)​

FastAPIκ°€ μ€€λΉ„λ˜λ©΄ Nginxλ₯Ό 배포함.

# .env λ‘œλ“œ 및 배포
set -a && source .env && set +a && envsubst < nginx/nginx.yaml | kubectl apply -f -

# 확인
kubectl get all -n 3tier-nginx

5️⃣ 접속 확인​

LoadBalancer IPλ₯Ό ν™•μΈν•˜μ—¬ 접속함.

kubectl get svc -n 3tier-nginx
# EXTERNAL-IP 확인 ν›„ λΈŒλΌμš°μ € 접속 (http://<EXTERNAL-IP>)

🧹 λ¦¬μ†ŒμŠ€ 정리​

배포된 λ¦¬μ†ŒμŠ€λ₯Ό μ™„μ „νžˆ μ •λ¦¬ν•˜λ €λ©΄ μ•„λž˜ μˆœμ„œλŒ€λ‘œ 진행함.

1️⃣ Deployment & Service μ‚­μ œβ€‹

각 λ„€μž„μŠ€νŽ˜μ΄μŠ€μ˜ μ›Œν¬λ‘œλ“œλ₯Ό λ¨Όμ € μ‚­μ œν•¨.

# Nginx λ¦¬μ†ŒμŠ€ μ‚­μ œ
kubectl delete deploy,svc,configmap --all -n 3tier-nginx

# FastAPI λ¦¬μ†ŒμŠ€ μ‚­μ œ
kubectl delete deploy,svc,secret --all -n 3tier-fastapi

# MySQL λ¦¬μ†ŒμŠ€ μ‚­μ œ
kubectl delete deploy,svc,secret,configmap,pvc --all -n 3tier-mysql

2️⃣ Namespace μ‚­μ œβ€‹

λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό μ‚­μ œν•˜λ©΄ λ‚΄λΆ€ λ¦¬μ†ŒμŠ€λ„ ν•¨κ»˜ μ‚­μ œλ¨.

# 전체 λ„€μž„μŠ€νŽ˜μ΄μŠ€ ν•œλ²ˆμ— μ‚­μ œ
kubectl delete ns 3tier-nginx 3tier-fastapi 3tier-mysql

# μ‚­μ œ 확인
kubectl get ns | grep 3tier

3️⃣ PersistentVolume μ‚­μ œβ€‹

PVλŠ” ν΄λŸ¬μŠ€ν„° 레벨 λ¦¬μ†ŒμŠ€μ΄λ―€λ‘œ λ³„λ„λ‘œ μ‚­μ œν•΄μ•Ό 함.

# PV μ‚­μ œ
kubectl delete pv 3tier-mysql-pv

# μ‚­μ œ 확인
kubectl get pv | grep 3tier

4️⃣ 호슀트 데이터 정리 (선택)​

hostPath λ³Όλ₯¨ 데이터λ₯Ό μ™„μ „νžˆ μ‚­μ œν•˜λ €λ©΄:

# 각 λ…Έλ“œμ—μ„œ μ‹€ν–‰ (λ˜λŠ” ssh 접속 ν›„)
sudo rm -rf /data/3tier/mysql

⚑ ν•œλ²ˆμ— 정리 (λΉ λ₯Έ 정리)​

# λ„€μž„μŠ€νŽ˜μ΄μŠ€ μ‚­μ œ (λ‚΄λΆ€ λ¦¬μ†ŒμŠ€ μžλ™ μ‚­μ œ)
kubectl delete ns 3tier-nginx 3tier-fastapi 3tier-mysql

# PV μ‚­μ œ
kubectl delete pv 3tier-mysql-pv

κ΄€λ ¨ λ¬Έμ„œβ€‹

κ·Έλž˜ν”„ λ·°

…
κ·Έλž˜ν”„ 데이터 λ‘œλ”© 쀑…
ν˜„μž¬: πŸ“¦ 3-Tier Architecture: Nginx + FastAPI + MySQL
λ…Έλ“œ 클릭 β†’ 이동 Β· λ“œλž˜κ·Έ β†’ μœ„μΉ˜ μ‘°μ •