📌 개요
이 글에서는 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에서 정상적으로 실행되고 있는지 확인
'Data Engineering > Data Infra & Process' 카테고리의 다른 글
[8편] pgvector를 활용한 대규모 AI 검색 시스템 구축 & 운영 전략 (0) | 2025.03.07 |
---|---|
[7편] FastAPI 벡터 검색 성능 최적화 (pgvector 인덱스 및 Auto Scaling 적용) (0) | 2025.03.07 |
[5편] FastAPI와 PostgreSQL을 활용한 벡터 검색 API 구축 (0) | 2025.03.07 |
[4편] PostgreSQL을 Vector Database로 활용하기 (pgvector 설정 및 사용) (0) | 2025.03.07 |
[3편] PostgreSQL 사용자(Role) 추가 및 수동 관리 (SQL 쿼리 방식) (0) | 2025.03.07 |