Data Engineering/Data Infra & Process

[6편] FastAPI 벡터 검색 API를 Kubernetes에 배포

ygtoken 2025. 3. 7. 14:58
728x90

📌 개요

 

이 글에서는 FastAPI 벡터 검색 API를 Docker 컨테이너로 패키징하고, Kubernetes에 배포하는 방법을 설명합니다.

✅ FastAPI를 Docker로 컨테이너화

✅ Kubernetes에서 PostgreSQL과 연동하여 FastAPI 실행

✅ Helm & ArgoCD를 활용한 GitOps 기반 배포

 


🚀 1. FastAPI Docker 컨테이너화

 

FastAPI 애플리케이션을 Kubernetes에서 실행하려면 Docker 컨테이너로 패키징해야 합니다.

 

1️⃣ Dockerfile 생성

 

📌 프로젝트 디렉터리 (fastapi-vector-search/)에 Dockerfile 추가

# Base image
FROM python:3.9

# Set working directory
WORKDIR /app

# Install dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Copy application code
COPY . .

# Expose port
EXPOSE 8000

# Run FastAPI application
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

 

 


2️⃣ requirements.txt 생성

 

📌 FastAPI 및 PostgreSQL 클라이언트를 포함한 의존성 목록 추가

fastapi
uvicorn
psycopg2
sqlalchemy
numpy
openai

 

 


3️⃣ Docker 이미지 빌드 및 실행

 

📌 Docker 이미지 빌드

docker build -t fastapi-vector-search .

 

📌 로컬에서 컨테이너 실행 (PostgreSQL과 연결)

docker run -d --name fastapi-vector-search \
  -p 8000:8000 \
  --env DB_HOST=postgresql.database.svc.cluster.local \
  --env DB_PORT=5432 \
  --env DB_NAME=ragdb \
  --env DB_USER=adminuser \
  --env DB_PASSWORD=admin1234 \
  fastapi-vector-search

 

FastAPI가 정상 실행되었는지 확인

docker ps

 

API 테스트 (http://localhost:8000/docs)

 


🚀 2. Kubernetes 배포 구성 (Helm Chart 생성)

 

이제 FastAPI 애플리케이션을 Kubernetes에 배포하기 위해 Helm Chart를 생성합니다.

 

1️⃣ Helm Chart 디렉터리 생성

mkdir -p ~/workspace/gitops/argocd/fastapi-vector-search
cd ~/workspace/gitops/argocd/fastapi-vector-search
helm create fastapi-chart

 

 


2️⃣ values.yaml 설정

 

📌 FastAPI 컨테이너의 환경 변수 및 PostgreSQL 연동을 설정

📌 ~/workspace/gitops/argocd/fastapi-vector-search/values.yaml

image:
  repository: localhost:5000/fastapi-vector-search
  tag: latest
  pullPolicy: IfNotPresent

service:
  type: LoadBalancer
  port: 8000

env:
  DB_HOST: "postgresql.database.svc.cluster.local"
  DB_PORT: "5432"
  DB_NAME: "ragdb"
  DB_USER: "adminuser"
  DB_PASSWORD: "admin1234"

 

 


3️⃣ deployment.yaml 설정

 

📌 ~/workspace/gitops/argocd/fastapi-vector-search/templates/deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: fastapi-vector-search
  namespace: fastapi
spec:
  replicas: 1
  selector:
    matchLabels:
      app: fastapi-vector-search
  template:
    metadata:
      labels:
        app: fastapi-vector-search
    spec:
      containers:
        - name: fastapi
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          ports:
            - containerPort: 8000
          env:
            - name: DB_HOST
              value: "{{ .Values.env.DB_HOST }}"
            - name: DB_PORT
              value: "{{ .Values.env.DB_PORT }}"
            - name: DB_NAME
              value: "{{ .Values.env.DB_NAME }}"
            - name: DB_USER
              value: "{{ .Values.env.DB_USER }}"
            - name: DB_PASSWORD
              value: "{{ .Values.env.DB_PASSWORD }}"

 

 


🚀 3. ArgoCD를 통한 배포

 

이제 GitOps 방식으로 Kubernetes에 FastAPI를 배포합니다.

 

1️⃣ Git 저장소에 변경 사항 커밋

cd ~/workspace/gitops
git add argocd/fastapi-vector-search
git commit -m "Add FastAPI vector search deployment with ArgoCD"
git push origin main

 

 


2️⃣ ArgoCD Application 리소스 생성

 

📌 ~/workspace/gitops/argocd/fastapi-vector-search/application.yaml

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: fastapi-vector-search
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/your-org/gitops.git
    targetRevision: HEAD
    path: argocd/fastapi-vector-search
    helm:
      valueFiles:
      - values.yaml
  destination:
    server: https://kubernetes.default.svc
    namespace: fastapi
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true

 

 


3️⃣ ArgoCD를 사용하여 FastAPI 배포

kubectl apply -f ~/workspace/gitops/argocd/fastapi-vector-search/application.yaml -n argocd

 

✅ 배포 상태 확인

argocd app list

 

✅ FastAPI 서비스 확인

kubectl get svc -n fastapi

 

API 테스트 (http://<EXTERNAL-IP>:8000/docs)

 


📌 4. 최종 정리

 

FastAPI 애플리케이션을 Docker 컨테이너로 패키징

Helm Chart를 사용하여 Kubernetes에 배포

ArgoCD를 활용하여 GitOps 기반 배포 관리

PostgreSQL과 연동하여 벡터 검색 기능을 구현

FastAPI가 Kubernetes에서 정상적으로 실행되고 있는지 확인

728x90