๐Ÿ’ป Programming/Docker & Kubernetes

[Kubernetes] ๋กœ์ปฌ์—์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์‹ค์Šตํ•˜๊ธฐ - Minikube ํ™œ์šฉ

๋ญ…์ฆค 2025. 2. 12. 22:44
๋ฐ˜์‘ํ˜•

๐Ÿ’ก ์‹ค์Šต ๊ฐœ์š”

์ด ๊ธ€์—์„œ๋Š” Mac์—์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค(Minikube)๋ฅผ ํ™œ์šฉํ•˜์—ฌ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์„ ๋‹ค๋ค„๋ณด๋ ค ํ•ด์š”. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ปจํ…Œ์ด๋„ˆํ™”ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์˜ˆ์š”. ํ•˜์ง€๋งŒ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๊ธฐ์—๋Š”  ๋ณต์žกํ•  ์ˆ˜ ์žˆ์ฃ . ์ด๋ฒˆ ์‹ค์Šต์—์„œ๋Š” ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ Minikube๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ๊ฒฝํ—˜ํ•˜๊ณ , FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

 

โœ… ์‹ค์Šต ์ˆœ์„œ

  1. ํ™˜๊ฒฝ ์„ค์ •
    • Kubernetes(Minikube, kubectl) ์„ค์น˜
    • Minikube ์‹คํ–‰ ๋ฐ ํด๋Ÿฌ์Šคํ„ฐ ํ™•์ธ
  2. FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž‘์„ฑ
  3. Docker๋กœ ์ปจํ…Œ์ด๋„ˆ ๋นŒ๋“œ ๋ฐ ์‹คํ–‰ ํ…Œ์ŠคํŠธ
  4. Kubernetes์— ๋ฐฐํฌ (deployment.yaml, service.yaml ์ž‘์„ฑ ๋ฐ ์ ์šฉ)
  5. ๋กœ์ปฌ์—์„œ API ํ˜ธ์ถœ ํ…Œ์ŠคํŠธ
  6. 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์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด

  1. Pod ์ƒํƒœ: FastAPI ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธ ๊ฐ€๋Šฅ
  2. Replica ๊ฐœ์ˆ˜: ์›ํ•˜๋Š” ๊ฐœ์ˆ˜๋งŒํผ ๋ฐฐํฌ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ
  3. ์„œ๋น„์Šค ๋…ธ์ถœ ์ƒํƒœ: LoadBalancer๋ฅผ ํ†ตํ•ด API๊ฐ€ ์™ธ๋ถ€์— ์ž˜ ๋…ธ์ถœ๋˜์—ˆ๋Š”์ง€ ์ฒดํฌ
  4. ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰: CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๋ถ„์„ ๊ฐ€๋Šฅ

 

๋ฐ˜์‘ํ˜•