티스토리 뷰
기본설명
rclone + minio 조합으로 pod에 마운트
Minio
독립서버에 docker로 설치
아래의 스크립트 수정하여 필요시 변경가능
minio가 점점 유료화로 넘어가면서 ui관련 기능을 제거하고 있어서 마지막 docker hub 버전을 사용
rclone-csi
storageclass에 rclone옵션 설정 가능 (https://github.com/veloxpack/csi-driver-rclone/blob/main/docs/driver-parameters.md) 기본 설정은 다음과 같이 함
mountOptions:
- allow_other # 다른 사용자/프로세스도 이 마운트 포인트에 접근 가능하게 함 (필수: Pod 안에서 root 아닌 사용자도 읽기/쓰기 하려면)
- vfs-cache-mode=full # 캐시 모드 full: 읽기/쓰기 모두 로컬 디스크에 캐싱 (RAG 문서 로드 시 반복 읽기 성능 극대화, 가장 추천 모드)
# writes만 쓰면 쓰기만 캐싱, off면 캐싱 거의 안 함 → full이 RAG처럼 읽기 중심 워크로드에 최적
- vfs-cache-max-size=10G # VFS 캐시가 사용할 수 있는 최대 로컬 디스크 용량
# 노드 디스크가 작으면 5G~20G 정도로 조정, 너무 크면 노드 디스크 고갈 → Pod OOMKilled 위험
# RAG 앱 Pod에 ephemeral-storage 리밋도 같이 걸어주세요 (예: limits: ephemeral-storage: 15Gi)
- vfs-read-chunk-size=32M # 한 번에 읽어오는 청크 크기 (기본 128KiB → 32MB로 늘려 sequential 읽기 성능 향상)
# 대용량 PDF/문서 파일 읽을 때 유리, 하지만 작은 파일 많으면 16M 정도로 낮추는 게 나을 수 있음
- vfs-read-chunk-size-limit=off # 읽기 청크 크기 상한 없음 (기본 4GiB) → 매우 큰 파일도 한 번에 큰 청크로 읽음
# off로 하면 큰 파일 sequential 읽기 속도 극대화 (RAG에서 큰 문서 처리 시 유리)
- dir-cache-time=24h # 디렉토리 목록(ls, readdir) 캐시 유지 시간 (기본 1시간 → 24시간으로 늘림)
# MinIO 버킷에 파일/폴더가 자주 변하지 않으면 목록 조회 속도 대폭 향상 (RAG 문서 목록 로드 빈번할 때 중요)
# 너무 길면 변경사항 반영 늦어짐
- poll-interval=1m # 변경 감지 폴링 주기 (기본 1분)
# MinIO 쪽에서 파일 추가/삭제 시 얼마나 빨리 반영할지 결정 (1m은 균형 좋음, 더 짧으면 API 호출 과다)
- buffer-size=64M # 각 파일 핸들에 할당되는 내부 버퍼 크기 (기본 16MiB → 64MiB로 늘림)
# 늘릴수록 읽기/쓰기 throughput 향상, 특히 sequential 작업(대용량 파일 로드)에서 효과 큼
# 메모리 사용량 증가하니 Pod 메모리 리밋 고려 (64M × 동시 파일 수)
Minio
#!/bin/bash
set -e
MINIO_ROOT_USER="minioadmin"
MINIO_ROOT_PASSWORD="miniopassword" # 8자 이상
DATA_DIR="/data/minio"
LOG_DIR="/var/log/minio"
MINIO_SERVER_IP=$(hostname -I | awk '{print $1}')
MINIO_VERSION="RELEASE.2025-09-07T16-13-09Z-cpuv1"
echo "MINIO Docker Install (IP: $MINIO_SERVER_IP)"
# ===== 1. 도커 유무 확인 & getdocker 설치 =====
curl -fsSL <https://get.docker.com> -o get-docker.sh
sh get-docker.sh
rm get-docker.sh
#if ! command -v docker &> /dev/null; then
# echo "Docker 설치 (getdocker 사용)..."
# curl -fsSL <https://get.docker.com> -o get-docker.sh
# sh get-docker.sh
# rm get-docker.sh
#else
# echo "Docker 이미 설치됨"
#fi
systemctl enable docker --now
usermod -aG docker $USER || true
# ===== 2. 디렉토리 생성 =====
echo "디렉토리 생성..."
mkdir -p "$DATA_DIR" "$LOG_DIR"
chmod 777 "$DATA_DIR" "$LOG_DIR"
# ===== 3. Docker Compose 파일 생성 (healthcheck 제거) =====
cat > docker-compose.yml << EOF
services:
minio:
image: docker.io/minio/minio:${MINIO_VERSION}
container_name: minio-server
restart: unless-stopped
security_opt:
- no-new-privileges:true
ulimits:
nofile:
soft: 65536
hard: 65536
environment:
MINIO_ROOT_USER: ${MINIO_ROOT_USER}
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
ports:
- "9000:9000"
- "9001:9001"
volumes:
- ${DATA_DIR}:/data
- ${LOG_DIR}:/log
command: server /data --console-address ":9001"
networks:
- minio-net
networks:
minio-net:
driver: bridge
EOF
# ===== 4. Logrotate 설정 =====
cat > /etc/logrotate.d/minio << EOF
${LOG_DIR}/*.log {
daily
missingok
rotate 7
compress
delaycompress
copytruncate
notifempty
create 0644 root root
}
EOF
# ===== 5. MinIO 실행 =====
echo "Docker Compose 실행..."
docker compose up -d
sleep 10
# ===== 6. 상태 확인 & 클라이언트 설치 =====
echo "상태 확인..."
docker compose ps
docker logs minio-server --tail=20
# ===== 7. MinIO 클라이언트 설치=====
echo "MINIO 클라이언트 설치"
wget -qO /usr/local/bin/mc <https://dl.min.io/client/mc/release/linux-amd64/mc>
chmod +x /usr/local/bin/mc
# ===== 8. 클라이언트 연결 & 버킷 생성 =====
echo "MinIO 클라이언트 설정..."
mc alias set minio {MINIO_SERVER_IP}:9000 ${MINIO_ROOT_USER} ${MINIO_ROOT_PASSWORD}
mc mb minio/rclone
# ===== 9. 최종 확인 =====
echo ""
echo "MinIO 설치 완료!"
echo "웹 콘솔: {MINIO_SERVER_IP}:9001"
echo "API 엔드포인트: {MINIO_SERVER_IP}:9000"
echo "Access Key: ${MINIO_ROOT_USER}"
echo "Secret Key: ${MINIO_ROOT_PASSWORD}"
echo ""
echo "생성된 버킷:"
mc ls minio/
rclone-csi
#!/usr/bin/env bash
set -euo pipefail
# ========================
# 사용자 정의 변수 (여기만 수정하세요!)
# ========================
NAMESPACE="rclone"
RELEASE_NAME="csi-rclone"
# MinIO가 **독립 서버(외부)**에 설치되어 있음 → 실제 IP/도메인/포트로 변경 필수
MINIO_EXTERNAL_HOST="192.168.0.45"
MINIO_PORT="9000"
MINIO_USE_HTTPS=false # true로 하면 https 사용 (self-signed cert라면 insecure=true 필요)
MINIO_BUCKET="rclone" # 사용할 버킷 이름
MINIO_ACCESS_KEY="minioadmin"
MINIO_SECRET_KEY="miniopassword"
# 엔드포인트 자동 생성
if [ "$MINIO_USE_HTTPS" = true ]; then
MINIO_PROTOCOL="https"
else
MINIO_PROTOCOL="http"
fi
MINIO_ENDPOINT="${MINIO_PROTOCOL}://${MINIO_EXTERNAL_HOST}:${MINIO_PORT}"
# ========================
# 1. Helm OCI로 rclone CSI Driver 설치 (최신 버전 v0.4.7 기준)
# ========================
echo ""
echo "=== 1. rclone CSI Driver Helm 설치 시작 (v0.4.7) ==="
helm upgrade --install ${RELEASE_NAME} oci://ghcr.io/veloxpack/charts/csi-driver-rclone \\
--namespace ${NAMESPACE} \\
--create-namespace \\
--version 0.4.7 \\
--wait \\
--timeout 5m
# 설치 확인
kubectl get pods -n ${NAMESPACE} | grep ${RELEASE_NAME} || echo "Pod 확인 실패 - 네임스페이스 확인"
kubectl get csidrivers | grep rclone.csi.veloxpack.io || echo "CSI Driver 등록 확인 실패"
echo "CSI Driver 설치 완료. 드라이버 이름: rclone.csi.veloxpack.io"
# ========================
# 2. rclone config Secret 생성 (외부 MinIO용)
# ========================
#
echo ""
echo "=== 2. 외부 MinIO용 rclone-config Secret 생성==="
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: rclone-minio-config
namespace: default # app과 동일한 네임스페이스
type: Opaque
stringData:
remote: minio # ← remote 이름 (StorageClass의 remote와 일치)
remotePath: ${MINIO_BUCKET} # ← 버킷 이름 (또는 /rclone 등)
configData: | # ← 핵심: configData 키로 INI config 넣기
[minio]
type = s3
provider = MinIO
access_key_id = ${MINIO_ACCESS_KEY}
secret_access_key = ${MINIO_SECRET_KEY}
endpoint = ${MINIO_ENDPOINT}
# insecure = true # 필요 시 주석 해제 (self-signed HTTPS)
# force_path_style = true # MinIO path-style 강제 필요 시
no_check_bucket = true
EOF
kubectl -n default get secret rclone-minio-config -o yaml
# ========================
# 3. 외부 MinIO용 StorageClass 생성
# ========================
echo ""
echo "=== 3. 외부 MinIO용 StorageClass 생성 ==="
cat <<EOF | kubectl apply -f -
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: rclone-minio-external
provisioner: rclone.csi.veloxpack.io
parameters:
remote: minio
remotePath: /${MINIO_BUCKET}
csi.storage.k8s.io/node-publish-secret-name: rclone-minio-config
csi.storage.k8s.io/node-publish-secret-namespace: default
reclaimPolicy: Retain
volumeBindingMode: Immediate
allowVolumeExpansion: true
mountOptions:
- allow_other
- vfs-cache-mode=full
- vfs-cache-max-size=10G # 노드 디스크 용량 고려 (Pod 리소스 제한도 설정하세요)
- vfs-read-chunk-size=32M
- vfs-read-chunk-size-limit=off
- dir-cache-time=24h
- poll-interval=1m
- buffer-size=64M
- log-level=DEBUG # 트러블슈팅 시 DEBUG로 변경
EOF
kubectl get sc rclone-minio-external
# ========================
# 4. 테스트용 PVC + Busybox Pod 생성 (마운트 확인용)
# ========================
echo "=== 4. 테스트 PVC & Pod 생성 (외부 MinIO 마운트 확인) ==="
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-rclone-minio-external-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: rclone-minio-external
---
apiVersion: v1
kind: Pod
metadata:
name: test-rclone-mount-external
spec:
containers:
- name: busybox
image: busybox
command: ["/bin/sh", "-c", "sleep 36000"]
volumeMounts:
- mountPath: /data
name: rclone-vol
volumes:
- name: rclone-vol
persistentVolumeClaim:
claimName: test-rclone-minio-external-pvc
EOF
echo "Pod 생성 완료. 40초 후 상태 확인... (네트워크 연결 시간 고려)"
sleep 40
kubectl get pvc test-rclone-minio-external-pvc
kubectl get pod test-rclone-mount-external
kubectl describe pod test-rclone-mount-external | grep -A 20 Events || echo "이벤트 확인 실패"
echo ""
echo "=== 마운트 확인 방법 ==="
echo "kubectl exec -it test-rclone-mount-external -- ls -la /data"
echo "kubectl exec -it test-rclone-mount-external -- touch /data/test-external.txt"
echo "kubectl exec -it test-rclone-mount-external -- ls -la /data"
echo ""
echo "=== 설치 및 테스트 완료! ==="
echo "주의: K8s 노드에서 ${MINIO_EXTERNAL_HOST}:${MINIO_PORT} 로 ping/telnet 가능한지 미리 확인하세요."
echo "RAG 앱 Deployment에서 storageClassName: rclone-minio-external 과 PVC를 사용하세요."
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- poetry
- Qdrant
- n8n
- chunking
- embedding
- 임베딩
- 코로나19
- kiwipiepy
- VectorStore
- Ai
- Chroma
- faiss
- K8s
- 5.4.0.1072
- CVE 취약점 점검
- 버쳐박스
- Oracle
- MSA
- 쿠버네티스
- AWS
- RAG
- llama
- MCP
- 테라폼
- Weaviate
- open ai
- 오라클
- KoSimCSE
- RangChain
- llm
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |
글 보관함
