π¦ 3-Tier Architecture: Nginx + FastAPI + MySQL
π¦ 3-Tier Architecture: Nginx + FastAPI + MySQL
Kubernetes νκ²½μμμ Web(Nginx) - WAS(FastAPI) - DB(MySQL) 3-Tier κ΅¬μ± μν€ν μ²μ.
λͺ©μ°¨β
- π μν€ν μ² λ€μ΄μ΄κ·Έλ¨
- π¦ GitLab CI/CD νμ΄νλΌμΈ
- ποΈ κ΅¬μ± μμ
- π¦ ν¬λ‘μ€ λ€μμ€νμ΄μ€ ν΅μ
- πΎ Volume ꡬμ±
- π λ°°ν¬ λ°©λ²
- 𧹠리μμ€ μ 리
οΏ½π μν€ν μ² λ€μ΄μ΄κ·Έλ¨β
π¦ GitLab CI/CD νμ΄νλΌμΈβ
μ΄ νλ‘μ νΈλ GitHub Push -> GitLab Mirroring -> GitLab CI Build κ³Όμ μ ν΅ν΄ 3-Tierμ© μ΄λ―Έμ§λ₯Ό μλμΌλ‘ λΉλνκ³ λ°°ν¬ν¨.
| Job Name | Stage | μν | Dockerfile μμΉ | λμ μ΄λ―Έμ§ |
|---|---|---|---|---|
build-3tier-mysql | build | MySQL 8.0 컀μ€ν μ΄λ―Έμ§ λΉλ | 3-tier/mysql/Dockerfile | registry.gitlab.com/.../3tier-mysql |
build-3tier-fastapi | build | FastAPI μ ν리μΌμ΄μ μ΄λ―Έμ§ λΉλ | 3-tier/fastapi/Dockerfile | registry.gitlab.com/.../fastapi |
build-3tier-nginx | build | Nginx 컀μ€ν μ΄λ―Έμ§ λΉλ | 3-tier/nginx/Dockerfile | registry.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 β FastAPI | fastapi-service.3tier-fastapi.svc.cluster.local |
| FastAPI β MySQL | mysql-service.3tier-mysql.svc.cluster.local |
οΏ½πΎ Volume ꡬμ±β
| μ»΄ν¬λνΈ | Mount Path | μ€λͺ |
|---|---|---|
| Nginx | /usr/share/nginx/html | μ μ μΉ μ½ν μΈ (HTML, CSS λ±) μ μ₯ |
| FastAPI | /app | Python μ ν리μΌμ΄μ μμ€ μ½λ μ μ₯ |
| 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