MinIO 오브젝트 스토리지 (1) - 서버 구축

김슭삵·2025년 5월 26일
post-thumbnail

들어가며

현대 애플리케이션에서 파일 저장과 관리는 필수적인 요소입니다. 이미지, 동영상, 문서 등 다양한 형태의 데이터를 효율적으로 저장하고 관리하기 위해서는 안정적인 오브젝트 스토리지가 필요합니다. 이번 글에서는 AWS S3와 호환되는 오픈소스 오브젝트 스토리지인 MinIO의 개념부터 Kubernetes 환경에서의 구축까지 알아보겠습니다.

MinIO란?

MinIO는 고성능 분산 오브젝트 스토리지 서버로, Amazon S3 API와 완벽하게 호환되는 오픈소스 솔루션입니다. Go 언어로 개발되었으며, 클라우드 네이티브 환경에서 Petabyte 규모의 데이터를 처리할 수 있는 확장성을 제공합니다.

MinIO의 핵심 특징

S3 API 호환성
Amazon S3와 100% 호환되는 API를 제공하여 기존 S3 클라이언트 라이브러리를 그대로 사용할 수 있습니다. 애플리케이션 코드 변경 없이 S3에서 MinIO로 마이그레이션이 가능합니다.

고성능
다중 코어 시스템에서 병렬 처리를 최적화하여 높은 처리량을 제공합니다. NVMe SSD와 같은 고성능 스토리지에서 최적의 성능을 발휘합니다.

분산 아키텍처
Erasure Coding 기술을 사용하여 데이터 무결성과 가용성을 보장하면서도 스토리지 효율성을 극대화합니다.

경량 설계
단일 바이너리로 제공되어 설치와 배포가 매우 간단하며, 컨테이너 환경에 최적화되어 있습니다.

웹 콘솔
직관적인 웹 기반 관리 인터페이스를 통해 버킷 관리, 파일 업로드/다운로드, 사용자 권한 관리 등을 쉽게 수행할 수 있습니다.

오브젝트 스토리지의 장점

확장성
파일 시스템과 달리 오브젝트 수와 용량에 제한이 없어 무한 확장이 가능합니다.

내구성
데이터 복제와 분산 저장을 통해 하드웨어 장애로부터 데이터를 보호합니다.

접근성
HTTP REST API를 통해 어디서나 쉽게 접근할 수 있습니다.

비용 효과성
블록 스토리지에 비해 저렴한 비용으로 대용량 데이터를 저장할 수 있습니다.

MinIO vs AWS S3 비교

1. 비용 구조

AWS S3

  • 종량제 과금: 사용한 스토리지 용량과 트래픽에 따라 비용 청구
  • 숨겨진 비용: API 호출, 데이터 전송, 요청 수에 따른 추가 비용
  • 예측 어려운 비용: 트래픽 변동에 따른 예상치 못한 요금 폭탄

MinIO

  • 고정 비용: 서버 인프라 비용만 발생
  • API 호출 무료: 아무리 많은 API 호출도 추가 비용 없음
  • 예측 가능한 비용: 서버 리소스만 관리하면 되므로 비용 계획 수립 용이

2. 성능 비교

항목AWS S3MinIO
처리량네트워크 대역폭에 의존로컬 네트워크 속도
지연시간인터넷 경유로 상대적으로 높음로컬 네트워크로 매우 낮음
동시 연결AWS 인프라에 의존서버 스펙에 따라 조정 가능

3. 데이터 프라이버시 및 보안

AWS S3

  • 클라우드 저장: 데이터가 AWS 데이터센터에 저장
  • 규정 준수: AWS의 보안 정책에 의존
  • 데이터 주권: 데이터 위치와 접근 제어가 제한적

MinIO

  • 온프레미스 저장: 자체 인프라에서 완전한 데이터 제어
  • 규정 준수: 조직의 보안 정책을 직접 적용
  • 데이터 주권: 데이터 위치와 접근 권한을 완전히 제어

4. 운영 및 관리

AWS S3

장점:
- 완전 관리형 서비스
- 무제한 확장성
- 99.999999999% (11 9's) 내구성 보장
- 다양한 스토리지 클래스 제공

단점:
- 벤더 종속성
- 비용 예측 어려움
- 설정 복잡성

MinIO

장점:
- 완전한 제어권
- 예측 가능한 비용
- 높은 성능
- S3 호환성

단점:
- 직접 운영 및 관리 필요
- 인프라 구축 및 유지보수
- 백업 및 재해복구 직접 구현

5. 사용 사례별 추천

AWS S3가 적합한 경우

글로벌 서비스: 전 세계 사용자에게 서비스 제공
가변적 워크로드: 트래픽이 불규칙하고 예측하기 어려운 경우
관리형 서비스 선호: 인프라 관리 부담을 줄이고 싶은 경우
AWS 생태계: 다른 AWS 서비스와 긴밀한 통합이 필요한 경우

MinIO가 적합한 경우

비용 최적화: 예측 가능하고 저렴한 운영 비용 필요
데이터 프라이버시: 민감한 데이터의 완전한 제어 필요
높은 성능: 낮은 지연시간과 높은 처리량 요구
온프레미스/하이브리드: 자체 인프라 환경에서 운영

Kubernetes에서 MinIO 구축하기

1단계: PVC (Persistent Volume Claim) 생성

MinIO 데이터의 영속성을 보장하기 위해 PVC를 생성합니다.

# 디렉토리 생성 및 이동
mkdir minio
cd minio
vi minio-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: minio-pvc
  namespace: msa-apps
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
kubectl apply -f minio-pvc.yaml

주요 설정 설명

  • ReadWriteOnce: 하나의 노드에서만 읽기/쓰기 가능
  • 10Gi: 10GB 스토리지 할당 (필요에 따라 조정)

2단계: MinIO Deployment 생성

MinIO 서버를 배포하기 위한 Deployment를 생성합니다.

vi minio-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: minio
  namespace: msa-apps
  labels:
    app: minio
spec:
  selector:
    matchLabels:
      app: minio
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: minio
    spec:
      containers:
      - name: minio
        image: minio/minio:RELEASE.2023-07-07T07-13-57Z
        args:
        - server
        - /data
        - --address
        - ":9100"
        - --console-address
        - ":9101"
        env:
        - name: MINIO_ROOT_USER
          value: "minioadmin"
        - name: MINIO_ROOT_PASSWORD
          value: "minioadmin"
        ports:
        - containerPort: 9100
          name: api
        - containerPort: 9101
          name: console
        volumeMounts:
        - name: minio-data
          mountPath: /data
      volumes:
      - name: minio-data
        persistentVolumeClaim:
          claimName: minio-pvc
kubectl apply -f minio-deployment.yaml

주요 설정 설명

  • 포트 9100: S3 API 서비스 포트
  • 포트 9101: 웹 콘솔 포트
  • strategy: Recreate: PVC 사용 시 권장되는 업데이트 전략
  • 환경변수: 관리자 계정 설정 (실제 운영 시 Secret 사용 권장)

3단계: MinIO Service 생성

클러스터 내부에서 MinIO에 접근하기 위한 Service를 생성합니다.

vi minio-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: minio
  namespace: msa-apps
  labels:
    app: minio
spec:
  ports:
  - port: 9100
    name: api
    targetPort: 9100
  - port: 9101
    name: console
    targetPort: 9101
  selector:
    app: minio
kubectl apply -f minio-service.yaml

4단계: 배포 상태 확인

# Pod 상태 확인
kubectl get pods -n msa-apps -l app=minio

# Service 확인
kubectl get services -n msa-apps | grep minio

# PVC 상태 확인
kubectl get pvc -n msa-apps minio-pvc

5단계: 외부 접근 설정 (선택사항)

웹 콘솔에 외부에서 접근하려면 NodePort 또는 Ingress를 설정합니다.

# minio-nodeport.yaml
apiVersion: v1
kind: Service
metadata:
  name: minio-console
  namespace: msa-apps
spec:
  type: NodePort
  ports:
  - port: 9101
    targetPort: 9101
    nodePort: 30901
  selector:
    app: minio

Spring Boot 애플리케이션 연동

의존성 추가

build.gradle에 MinIO 클라이언트 의존성을 추가합니다.

dependencies {
    // 기존 의존성...
    
    // MinIO 의존성 추가
    implementation 'io.minio:minio:8.5.2'
}

MinIO 운영 및 모니터링

웹 콘솔 접속

URL: http://클러스터IP:30901 (NodePort 설정 시)
계정: minioadmin / minioadmin

주요 기능

  • 버킷 관리
  • 파일 업로드/다운로드
  • 사용자 및 권한 관리
  • 모니터링 및 로그 확인

보안 설정

실제 운영환경에서는 반드시 다음 사항을 적용하세요:

# Secret을 통한 인증 정보 관리
apiVersion: v1
kind: Secret
metadata:
  name: minio-secret
  namespace: msa-apps
type: Opaque
stringData:
  username: "your-secure-username"
  password: "your-secure-password"

백업 전략

# MinIO 데이터 백업
kubectl exec -it minio-pod -n msa-apps -- mc mirror /data /backup

# PVC 스냅샷 생성 (CSI 지원 시)
kubectl create volumesnapshot minio-snapshot --source-pvc=minio-pvc

마치며

MinIO는 AWS S3와 호환되는 강력한 오픈소스 오브젝트 스토리지입니다. 특히 비용 절감, 데이터 프라이버시, 높은 성능이 중요한 환경에서는 AWS S3보다 더 나은 선택이 될 수 있습니다.

profile
비전공자의 개발 적응기

0개의 댓글