티스토리 뷰

카테고리 없음

Minio

미니대왕님 2026. 2. 12. 08:30

기본설명

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
«   2026/03   »
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
글 보관함