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

πŸ”§ Day 2-3: FastAPI 3-Tier Application

πŸ”§ Day 2-3: FastAPI 3-Tier Application

FastAPI + MySQL을 μ‚¬μš©ν•œ 3-Tier μ•„ν‚€ν…μ²˜ + GitLab/GitHub CI/CD

πŸ“Š μ•„ν‚€ν…μ²˜ λ‹€μ΄μ–΄κ·Έλž¨ 보기 - Mermaid λ‹€μ΄μ–΄κ·Έλž¨μœΌλ‘œ 전체 ꡬ성 확인


λͺ©μ°¨β€‹

  1. πŸ”„ GitHub β†’ GitLab 미러링
  2. 🦊 GitLab CI/CD
  3. πŸš€ Kubernetes 배포
  4. πŸ—„οΈ 3-Tier μ•„ν‚€ν…μ²˜
  5. πŸ“ API μ—”λ“œν¬μΈνŠΈ
  6. πŸ”§ ν™˜κ²½λ³€μˆ˜ μ„€μ •
  7. πŸ”₯ νŠΈλŸ¬λΈ”μŠˆνŒ…

πŸ”„ GitHub β†’ GitLab μžλ™ 미러링 섀정​

GitHub Actionsλ₯Ό 톡해 μžλ™μœΌλ‘œ GitLab에 동기화

μ„€μ • 단계​

Stepμž‘μ—…μƒμ„Έ
1GitLab 빈 ν”„λ‘œμ νŠΈ 생성GitLab > New project > Create blank project
2Access Token λ°œκΈ‰Settings > Access Tokens (write_repository 체크)
3GitHub Secrets μ„€μ •Settings > Secrets and variables > Actions

πŸ” GitHub Secrets​

Secret 이름값
GITLAB_URLgitlab.com/username/pista-megazoncloud.git
GITLAB_TOKENStep 2μ—μ„œ λ°œκΈ‰ν•œ 토큰

μ›Œν¬ν”Œλ‘œμš° 파일: .github/workflows/mirror-to-gitlab.yml main, feat/**, kubernetes 브랜치 ν‘Έμ‹œ μ‹œ μžλ™ 미러링


🦊 GitLab CI/CD​

.gitlab-ci.yml이 ν¬ν•¨λ˜μ–΄ μžˆμ–΄ main λ˜λŠ” feat/On-premise-ICT λΈŒλžœμΉ˜μ— ν‘Έμ‹œν•˜λ©΄ μžλ™μœΌλ‘œ:

μˆœμ„œμž‘μ—…κ²°κ³Όλ¬Ό
1Docker 이미지 λΉŒλ“œ-
2GitLab Container Registry ν‘Έμ‹œ$CI_REGISTRY_IMAGE/fastapi:latest
3-$CI_REGISTRY_IMAGE/nginx:latest
4-$CI_REGISTRY_IMAGE/mysql:latest

πŸ” λ‘œμ»¬μ—μ„œ GitLab Registry λ‘œκ·ΈμΈβ€‹

docker login registry.gitlab.com
# Username: GitLab μ‚¬μš©μžλͺ…
# Password: Personal Access Token (λΉ„λ°€λ²ˆν˜Έ μ•„λ‹˜!)

Personal Access Token λ°œκΈ‰:

  1. GitLab β†’ 우츑 상단 ν”„λ‘œν•„ β†’ Edit profile
  2. Access Tokens 메뉴
  3. Scopes: read_registry, write_registry 체크
  4. Create personal access token β†’ 토큰 볡사

πŸš€ Kubernetes 배포​

1️⃣ GitLab Registry Secret 생성​

kubectl create secret docker-registry gitlab-registry-secret \
--docker-server=registry.gitlab.com \
--docker-username=pyh5523 \
--docker-password=<Personal Access Token>

[!WARNING] ImagePullBackOff μ—λŸ¬ λ°œμƒ μ‹œ:

  • Secret 확인: kubectl get secrets
  • Pod μž¬μƒμ„±: kubectl delete pod -l app=fastapi-pod
  • imagePullSecrets μ„€μ • 확인

2️⃣ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 배포​

# FastAPI 배포
kubectl apply -f fastapi-deploy.yaml
kubectl apply -f fastapi-service.yaml

# Nginx 배포
kubectl apply -f ../nginx/nginx-deploy.yaml
kubectl apply -f ../nginx/nginx-service.yaml

3️⃣ MySQL 배포​

# ConfigMap (μ΄ˆκΈ°ν™” 슀크립트)
kubectl apply -f mysql/mysql-configmap.yaml

# Secret/PV/PVC (⚠️ Secret 값은 직접 μˆ˜μ • ν›„ 적용!)
kubectl apply -f mysql/mysql-secret.yaml
kubectl apply -f mysql/mysql-pv.yaml
kubectl apply -f mysql/mysql-pvc.yaml
kubectl apply -f mysql/mysql-deploy.yaml
kubectl apply -f mysql/mysql-service.yaml

4️⃣ 배포 확인​

kubectl get pods
kubectl get svc
kubectl get pv,pvc

πŸ—„οΈ 3-Tier μ•„ν‚€ν…μ²˜β€‹

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Nginx │────▢│ FastAPI │────▢│ MySQL β”‚
β”‚ (Web) β”‚ β”‚ (WAS) β”‚ β”‚ (DB) β”‚
β”‚ Port 80 β”‚ β”‚ Port 8000 β”‚ β”‚ Port 3306 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
/member proxy /member pymysql

πŸ“ API μ—”λ“œν¬μΈνŠΈβ€‹

MethodPathμ„€λͺ…
GET/Hello World 응닡
GET/memberMySQL μ—°κ²° ν…ŒμŠ€νŠΈ

πŸ”§ ν™˜κ²½λ³€μˆ˜ 섀정​

λ³€μˆ˜λͺ…κΈ°λ³Έκ°’μ„€λͺ…
MYSQL_HOSTmysqlMySQL 호슀트
MYSQL_USERrootMySQL μ‚¬μš©μž
MYSQL_PASSWORDrootMySQL λΉ„λ°€λ²ˆν˜Έ
MYSQL_DBtestλ°μ΄ν„°λ² μ΄μŠ€λͺ…

Kubernetesμ—μ„œ ν™˜κ²½λ³€μˆ˜ μ„€μ •:

env:
- name: MYSQL_HOST
value: "mysql-service"
- name: MYSQL_USER
valueFrom:
secretKeyRef:
name: mysql-secret
key: username

βš™οΈ ν™˜κ²½ 섀정​

ν•­λͺ©κ°’
Port8000
CORSlocalhost:8000, example.com
Python3.12-slim

πŸ”₯ νŠΈλŸ¬λΈ”μŠˆνŒ…β€‹

MySQL ConfigMap init.sql이 μ‹€ν–‰λ˜μ§€ μ•ŠμŒβ€‹

증상:

{"message":"fail","error":"(1146, \"Table 'pista-db.tmember' doesn't exist\")"}

원인:

  • MySQL μ΄ˆκΈ°ν™” μŠ€ν¬λ¦½νŠΈλŠ” 데이터 디렉토리가 λΉ„μ–΄μžˆμ„ λ•Œλ§Œ 싀행됨
  • PVC에 이전 데이터가 λ‚¨μ•„μžˆμœΌλ©΄ init.sql이 λ¬΄μ‹œλ¨

ν•΄κ²°:

# 1. λͺ¨λ“  λ…Έλ“œμ—μ„œ 데이터 μ‚­μ œ
ssh k8s-n1 "sudo rm -rf /data/mysql/*"
ssh k8s-n2 "sudo rm -rf /data/mysql/*"
ssh k8s-n3 "sudo rm -rf /data/mysql/*"
kubectl delete -f mysql/

# 2. MySQL λ¦¬μ†ŒμŠ€ 재배포
kubectl apply -f mysql/

검증:

curl 192.168.5.101:8000/member
# {"message":"success","data":[...]}

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

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

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