LLM & Generative AI/RAG in Practice

Kubernetes 환경에서 ChromaDB 구축 및 Python 데이터 저장 테스트

ygtoken 2025. 2. 27. 15:43
728x90

Docker Desktop (Mac M1)에서 Kubernetes를 활용하여 ChromaDB를 배포하고, Python을 사용하여 데이터를 저장 및 검색하는 방법을 정리해보았습니다.

특히, hostPath를 올바르게 설정하여 데이터를 영구 저장하는 방법 LoadBalancer를 통해 외부에서 접근하는 방법을 포함합니다.


 1. Docker Desktop 환경에서 ChromaDB 설치 개요

Docker Desktop의 내장 Kubernetes 기능을 사용하면 로컬 개발 환경에서 손쉽게 ChromaDB를 실행할 수 있습니다. 그러나 데이터를 영구 저장하려면 Kubernetes hostPath 설정이 필요하며, 외부 접근을 위해 LoadBalancer를 설정해야 합니다.

📌 목표

  1. Kubernetes에 ChromaDB 배포 (Helm 없이 YAML 적용)
  2. hostPath를 사용하여 로컬 디렉터리에 데이터 저장
  3. LoadBalancer를 이용하여 외부에서 접근 가능하도록 설정
  4. Python을 사용하여 데이터 저장 및 검색 테스트

 2. ChromaDB Kubernetes 배포 (YAML 설정)

아래는 Kubernetes 환경에서 ChromaDB를 배포하는 YAML 파일입니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: chromadb
  namespace: rag
spec:
  replicas: 1
  selector:
    matchLabels:
      app: chromadb
  template:
    metadata:
      labels:
        app: chromadb
    spec:
      containers:
      - name: chromadb
        image: chromadb/chroma:0.6.2 # ✅ 최신 버전 사용
        ports:
        - containerPort: 8000 # 내부 포트 (FastAPI 기본값)
        env:
        - name: ALLOW_RESET
          value: "true" # ✅ 인덱스 초기화 허용
        - name: CHROMA_SERVER_HOST
          value: "0.0.0.0" # ✅ 외부 접근 가능하도록 설정
        - name: CHROMA_SERVER_HTTP_PORT
          value: "8000" # ✅ 내부 서버 포트 설정
        - name: IS_PERSISTENT
          value: "true" # ✅ 데이터 영구 저장 활성화
        - name: PERSIST_DIRECTORY
          value: "/data" # ✅ 영구 데이터 저장 경로 설정
        - name: ANONYMIZED_TELEMETRY
          value: "false" # ✅ 익명 통계 전송 비활성화
        volumeMounts:
        - name: chromadb-data
          mountPath: /data
      volumes:
      - name: chromadb-data
        hostPath:
          path: /tmp/chromadb-data
          type: DirectoryOrCreate
---
apiVersion: v1
kind: Service
metadata:
  name: chromadb
  namespace: rag
spec:
  type: LoadBalancer
  selector:
    app: chromadb
  ports:
  - protocol: TCP
    port: 8090
    targetPort: 8000

📌 설치 및 실행

kubectl apply -f chromadb.yaml

📌 배포 상태 확인

kubectl get pods -n rag
kubectl get svc -n rag

 3. Python을 이용한 ChromaDB 데이터 저장 및 조회

📌 필수 패키지 설치

pip install chromadb

🔹 1. ChromaDB 데이터 저장

import chromadb

# ✅ 수정된 코드 (HttpClient 사용)
chroma_client = chromadb.HttpClient(host="localhost", port=8090)  # 포트 확인 필요

# 컬렉션 생성
collection = chroma_client.get_or_create_collection(name="rag_test")

# 샘플 데이터 삽입
collection.add(
    ids=["1", "2"],
    documents=["이것은 테스트 문서입니다.", "RAG 시스템 구축 중입니다."],
    metadatas=[{"source": "test1"}, {"source": "test2"}]
)

# 검색 테스트
results = collection.query(
    query_texts=["RAG 구축"],
    n_results=2
)

print(results)

 결과: 데이터가 정상적으로 ChromaDB에 저장됨.


🔹 2. ChromaDB Collection 조회

import chromadb

chroma_client = chromadb.HttpClient(host="localhost", port=8090)

# 저장된 컬렉션 목록 조회
collections = chroma_client.list_collections()
print("저장된 컬렉션 목록:", collections)

📌 결과 예시:

저장된 컬렉션 목록: ["rag_test"]

🔹 3. ChromaDB 데이터 조회

import chromadb

chroma_client = chromadb.HttpClient(host="localhost", port=8090)

# "rag_test" 컬렉션 가져오기
collection = chroma_client.get_collection("rag_test")

# 저장된 데이터 조회
all_docs = collection.get(include=["documents", "metadatas"])
print("저장된 데이터:", all_docs)

📌 결과 예시:

{
  "ids": ["1", "2"],
  "documents": ["이것은 테스트 문서입니다.", "RAG 시스템 구축 중입니다."],
  "metadatas": [{"source": "test1"}, {"source": "test2"}]
}

 4. ChromaDB Swagger UI 활용

📌 Swagger UI 접속

http://localhost:8090/docs

여기서 GET /api/v1/collections?tenant=default_tenant&database=default_database 엔드포인트를 호출하여 현재 저장된 컬렉션 목록을 확인할 수 있습니다.


728x90