
๐ก ์ค์ต ๊ฐ์
์ด ๊ธ์์๋ Mac์์ ์ฟ ๋ฒ๋คํฐ์ค(Minikube)๋ฅผ ํ์ฉํ์ฌ FastAPI ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ๋ค๋ค๋ณด๋ ค ํด์. ์ฟ ๋ฒ๋คํฐ์ค๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปจํ ์ด๋ํํ๊ณ ๊ด๋ฆฌํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์์. ํ์ง๋ง ์ฒ์ ์ฌ์ฉํ๊ธฐ์๋ ๋ณต์กํ ์ ์์ฃ . ์ด๋ฒ ์ค์ต์์๋ ๋ก์ปฌ ํ๊ฒฝ์์ Minikube๋ฅผ ์ฌ์ฉํ์ฌ ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ๊ฒฝํํ๊ณ , FastAPI ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๋ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ ํ์ตํฉ๋๋ค.
โ ์ค์ต ์์
- ํ๊ฒฝ ์ค์
- Kubernetes(Minikube, kubectl) ์ค์น
- Minikube ์คํ ๋ฐ ํด๋ฌ์คํฐ ํ์ธ
- FastAPI ์ ํ๋ฆฌ์ผ์ด์ ์์ฑ
- Docker๋ก ์ปจํ ์ด๋ ๋น๋ ๋ฐ ์คํ ํ ์คํธ
- Kubernetes์ ๋ฐฐํฌ (deployment.yaml, service.yaml ์์ฑ ๋ฐ ์ ์ฉ)
- ๋ก์ปฌ์์ API ํธ์ถ ํ ์คํธ
- Kubernetes ์ํ GUI๋ก ํ์ธํ๊ณ ๋ถ์ํ๊ธฐ
โ ํ๋ก์ ํธ ๊ตฌ์กฐ
~/k8s-fastapi/
โโโ main.py # FastAPI ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋
โโโ requirements.txt # ํ์ํ Python ํจํค์ง ๋ชฉ๋ก
โโโ Dockerfile # Docker ๋น๋ ์ค์
โโโ k8s/ # Kubernetes ๊ด๋ จ ์ค์ ํ์ผ ๋๋ ํฐ๋ฆฌ
โโโ deployment.yaml
โโโ service.yaml
1. MacBook์ Kubernetes(K8s) ์ค์น
๋ก์ปฌ MacBook์์ Kubernetes๋ฅผ ์คํํ๋ ค๋ฉด Minikube๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ๊ฐ๋จํฉ๋๋ค.
โ Homebrew๋ก Minikube ๋ฐ kubectl ์ค์น
brew install minikube kubectl
โ Minikube ํด๋ฌ์คํฐ ์คํ
minikube start --driver=docker
โ Minikube ์ ์ ์คํ ํ์ธ
kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane,master 10s v1.28.0

Kubernetes ํด๋ฌ์คํฐ๊ฐ ์ ์์ ์ผ๋ก ์คํ๋์์ต๋๋ค!
2. FastAPI ์ ํ๋ฆฌ์ผ์ด์ ์์ฑ
๐ main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello from Kubernetes on MacBook!"}
- ์ฟ ๋ฒ๋คํฐ์ค ์ค์ต์ ์ํ ์์ฃผ ๊ฐ๋จํ Restful API๋ฅผ ์์ฑ
๐ requirements.txt
fastapi
uvicorn
3. Docker๋ก FastAPI ์ปจํ ์ด๋ ๋น๋
๐ Dockerfile
FROM python:3.9
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
โ Docker ์ด๋ฏธ์ง ๋น๋
docker build -t fastapi-app .
โ Docker ์คํ ํ ์คํธ
docker run -p 8000:8000 fastapi-app
๋ธ๋ผ์ฐ์ ์์ http://localhost:8000/
์ ์ํ์ฌ ์๋ต์ ํ์ธํ์ธ์.
4. Kubernetes ๋ฐฐํฌ (deployment.yaml, service.yaml)
๐ k8s/deployment.yaml
apiVersion: apps/v1 # API ๋ฒ์ (Deployment๋ฅผ ์ ์ํ ๋ ์ฌ์ฉํ๋ Kubernetes API ๊ทธ๋ฃน)
kind: Deployment # ๋ฆฌ์์ค ์ข
๋ฅ (Deployment ๊ฐ์ฒด ์์ฑ)
metadata:
name: fastapi-app # Deployment์ ์ด๋ฆ (fastapi-app์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ์ ์๋จ)
spec:
replicas: 2 # Pod์ 2๊ฐ ์คํ (์ํ ํ์ฅ์ ์ํ ์ค์ )
selector:
matchLabels:
app: fastapi-app # ์ด ๋ ์ด๋ธ์ด ์๋ Pod์ ๊ด๋ฆฌ
template:
metadata:
labels:
app: fastapi-app # Pod์ ๋ถ์ผ ๋ ์ด๋ธ (Service์์ Pod์ ์ฐพ์ ๋ ์ฌ์ฉ)
spec:
containers:
- name: fastapi-app # ์ปจํ
์ด๋ ์ด๋ฆ
image: fastapi-app:latest # ์ฌ์ฉํ Docker ์ด๋ฏธ์ง (๋ก์ปฌ์์ ๋น๋ํ fastapi-app:latest ์ฌ์ฉ)
ports:
- containerPort: 8000 # ์ปจํ
์ด๋ ๋ด๋ถ์์ ๋
ธ์ถํ ํฌํธ (FastAPI ๊ธฐ๋ณธ ํฌํธ)
โ Deployment ์ญํ
- ์ปจํ ์ด๋ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ๋ฐฐํฌํ๋ ์ญํ
- ์ํ๋ ๊ฐ์(replicas)๋งํผ Pod์ ์คํํ๊ณ , ์๋์ผ๋ก ๊ด๋ฆฌ ๋ฐ ๋ณต๊ตฌ
- ์๋ก์ด ๋ฒ์ ์ด ๋ฐฐํฌ๋๋ฉด ๊ธฐ์กด Pod์ ์์ฐจ์ ์ผ๋ก ๊ต์ฒดํ๋ ๋กค๋ง ์ ๋ฐ์ดํธ ๊ธฐ๋ฅ ์ ๊ณต
โ Deployment ์ฃผ์ ๋์ ๋ฐฉ์
1. Pod ์๋ ์์ฑ
- replicas: 2 โ ๋์ผํ Pod์ 2๊ฐ ์คํํ์ฌ ๋ถํ ๋ถ์ฐ ๊ฐ๋ฅ
- Kubernetes๊ฐ ๊ด๋ฆฌํ๋ Pod์ด๋ฏ๋ก ์ด๋ค Pod์ด ์ฃฝ๋๋ผ๋ ์๋์ผ๋ก ์๋ก์ด Pod์ด ์์ฑ๋จ
2. Label ๊ธฐ๋ฐ Pod ๊ด๋ฆฌ
- selector.matchLabels.app: fastapi-app
- template.metadata.labels.app: fastapi-app
- ์ด ๋ ์ด๋ธ์ด ๊ฐ์ Pod๋ง ๊ด๋ฆฌํจ. (Service์์๋ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ฐ๊ฒฐ)
3. ์ปจํ ์ด๋ ์ค์
- image: fastapi-app:latest โ FastAPI ์ปจํ ์ด๋ ์คํ
- containerPort: 8000 โ ์ปจํ ์ด๋ ๋ด๋ถ์์ ์ฌ์ฉํ๋ ํฌํธ (์๋น์ค ์ฐ๊ฒฐ ์ ํ์)
๐ k8s/service.yaml
apiVersion: v1 # API ๋ฒ์ (Service๋ฅผ ์ ์ํ ๋ ์ฌ์ฉํ๋ Kubernetes API ๊ทธ๋ฃน)
kind: Service # ๋ฆฌ์์ค ์ข
๋ฅ (Service ๊ฐ์ฒด ์์ฑ)
metadata:
name: fastapi-service # Service์ ์ด๋ฆ
spec:
type: LoadBalancer # ์ธ๋ถ์์๋ ์ ๊ทผํ ์ ์๋๋ก Load Balancer ์์ฑ
selector:
app: fastapi-app # ๋ ์ด๋ธ์ด fastapi-app์ธ Pod๊ณผ ์ฐ๊ฒฐ
ports:
- protocol: TCP # ๋คํธ์ํฌ ํ๋กํ ์ฝ (TCP ์ฌ์ฉ)
port: 80 # ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๋ ํฌํธ (ํด๋ผ์ด์ธํธ๊ฐ API๋ฅผ ํธ์ถํ ๋ ์ฌ์ฉ)
targetPort: 8000 # ๋ด๋ถ ์ปจํ
์ด๋์์ ์ฌ์ฉํ๋ ํฌํธ (FastAPI๊ฐ ์คํ ์ค์ธ ํฌํธ)
โ Service ์ญํ
- ์ฟ ๋ฒ๋คํฐ์ค์ Pod๋ค์ ๋์ ์ผ๋ก ์์ฑ/์ญ์ ๋๊ธฐ ๋๋ฌธ์, ์ง์ ์ ๊ทผํ ์ ์๋ ๊ณ ์ ๋ IP๊ฐ ์์.
- Service๋ ์ด๋ฌํ Pod๋ค์ Label ๊ธฐ๋ฐ์ผ๋ก ๋ฌถ๊ณ , ๋คํธ์ํฌ๋ฅผ ํตํด ์ ๊ทผํ ์ ์๋๋ก ํด์ฃผ๋ ์ญํ ์ ์ํ
- type: LoadBalancer๋ฅผ ์ฌ์ฉํ๋ฉด ์ธ๋ถ์์๋ API๋ฅผ ํธ์ถํ ์ ์๋๋ก Load Balancer๋ฅผ ์๋ ์์ฑ.
โ Service ์ฃผ์ ๋์ ๋ฐฉ์
1. Pod๊ณผ์ ์ฐ๊ฒฐ
- selector.app: fastapi-app โ fastapi-app ๋ ์ด๋ธ์ด ๋ถ์ ๋ชจ๋ Pod์ ๋ฌถ์ด์ ์๋น์ค๋ก ์ ๊ณต.
- Deployment์์ ์์ฑํ Pod๊ณผ ์๋์ผ๋ก ์ฐ๊ฒฐ๋จ.
2. ์ธ๋ถ ์ ๊ทผ์ ์ํ LoadBalancer ์ฌ์ฉ
- type: LoadBalancer โ ํด๋ผ์ฐ๋ ํ๊ฒฝ์์ ์ธ๋ถ์์ ์ ๊ทผ ๊ฐ๋ฅํ IP๋ฅผ ์๋ ํ ๋น
- Minikube์์๋ LoadBalancer ๋์ NodePort ๋ฐฉ์์ผ๋ก ์๋น์ค์ ์ ๊ทผ ๊ฐ๋ฅ (minikube service fastapi-service ์คํ ์ URL ์ ๊ณต).
3. ํฌํธ ์ค์
- port: 80 โ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ๋ณด๋ด๋ ํฌํธ (์: http://EXTERNAL-IP:80/)
- targetPort: 8000 โ ์ค์ FastAPI ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๋ ์ปจํ ์ด๋ ๋ด๋ถ ํฌํธ
- ์ฆ, ์ธ๋ถ์์ 80๋ฒ ํฌํธ๋ก ์์ฒญ์ ๋ณด๋ด๋ฉด, ๋ด๋ถ์ ์ผ๋ก 8000๋ฒ ํฌํธ๋ก ์ ๋ฌ๋จ.
Deployment + Service ๋์ ๋ฐฉ์ ์์ฝ
1๏ธโฃ Deployment
- replicas: 2 โ Pod์ 2๊ฐ ์คํํ์ฌ ๋ถํ ๋ถ์ฐ.
- image: fastapi-app:latest โ FastAPI ์ปจํ ์ด๋ ์คํ.
- containerPort: 8000 โ ์ปจํ ์ด๋ ๋ด๋ถ์์ ์คํ๋๋ ํฌํธ.
- Pod์ด ์ฃฝ์ผ๋ฉด ์๋ ๋ณต๊ตฌ๋จ.
2๏ธโฃ Service
- type: LoadBalancer โ ์ธ๋ถ์์๋ API๋ฅผ ํธ์ถํ ์ ์๋๋ก ์ค์ .
- selector.app: fastapi-app โ Deployment์์ ์คํ๋ Pod๋ค๊ณผ ์๋ ์ฐ๊ฒฐ.
- port: 80 โ targetPort: 8000 โ ์ธ๋ถ ์์ฒญ(80๋ฒ ํฌํธ)์ FastAPI ์ปจํ ์ด๋ ๋ด๋ถ(8000๋ฒ ํฌํธ)๋ก ์ ๋ฌ.
5. Kubernetes ๋ฐฐํฌ ์คํ
โ ๋ฐฐํฌ ์คํ
kubectl apply -f k8s/deployment.yaml
kubectl apply -f k8s/service.yaml
โ ๋ฐฐํฌ๋ ๋ฆฌ์์ค ํ์ธ
kubectl get pods
kubectl get deployments
kubectl get services

โ API ํธ์ถ ํ ์คํธ
minikube service fastapi-service
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|-----------------|-------------|---------------------------|
| default | fastapi-service | 80 | http://192.168.49.2:32567 |
์ถ๋ ฅ๋ URL์ ์ฌ์ฉํ์ฌ API๋ฅผ ํธ์ถํ ์ ์์ด์.
curl http://192.168.49.2:32567/
{"message": "Hello from Kubernetes on MacBook!"}
6. Kubernetes ์ํ GUI๋ก ํ์ธํ๊ณ ๋ถ์ํ๊ธฐ
์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๋ GUI๋ก ์ฌ๋ฌ๊ฐ์ง ์ ๋ณด๋ฅผ ํ์ธํ ์ ์๋ต๋๋ค.
minikube dashboard

์ดํ ๋ธ๋ผ์ฐ์ ์์ ์์ ๊ฐ์ด Kubernetes ํด๋ฌ์คํฐ์ ์ํ๋ฅผ ์๊ฐ์ ์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค.
โ Minikube Dashboard์์ ํ์ธํ ์ ์๋ ์ ๋ณด
- Pod ์ํ: FastAPI ์ปจํ ์ด๋๊ฐ ์ ์์ ์ผ๋ก ์คํ ์ค์ธ์ง ํ์ธ ๊ฐ๋ฅ
- Replica ๊ฐ์: ์ํ๋ ๊ฐ์๋งํผ ๋ฐฐํฌ๋์๋์ง ํ์ธ
- ์๋น์ค ๋ ธ์ถ ์ํ: LoadBalancer๋ฅผ ํตํด API๊ฐ ์ธ๋ถ์ ์ ๋ ธ์ถ๋์๋์ง ์ฒดํฌ
- ๋ฆฌ์์ค ์ฌ์ฉ๋: CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ถ์ ๊ฐ๋ฅ