
들어가며
현대 애플리케이션에서 파일 저장과 관리는 필수적인 요소입니다. 이미지, 동영상, 문서 등 다양한 형태의 데이터를 효율적으로 저장하고 관리하기 위해서는 안정적인 오브젝트 스토리지가 필요합니다. 이번 글에서는 AWS S3와 호환되는 오픈소스 오브젝트 스토리지인 MinIO의 개념부터 Kubernetes 환경에서의 구축까지 알아보겠습니다.
MinIO는 고성능 분산 오브젝트 스토리지 서버로, Amazon S3 API와 완벽하게 호환되는 오픈소스 솔루션입니다. Go 언어로 개발되었으며, 클라우드 네이티브 환경에서 Petabyte 규모의 데이터를 처리할 수 있는 확장성을 제공합니다.
S3 API 호환성
Amazon S3와 100% 호환되는 API를 제공하여 기존 S3 클라이언트 라이브러리를 그대로 사용할 수 있습니다. 애플리케이션 코드 변경 없이 S3에서 MinIO로 마이그레이션이 가능합니다.
고성능
다중 코어 시스템에서 병렬 처리를 최적화하여 높은 처리량을 제공합니다. NVMe SSD와 같은 고성능 스토리지에서 최적의 성능을 발휘합니다.
분산 아키텍처
Erasure Coding 기술을 사용하여 데이터 무결성과 가용성을 보장하면서도 스토리지 효율성을 극대화합니다.
경량 설계
단일 바이너리로 제공되어 설치와 배포가 매우 간단하며, 컨테이너 환경에 최적화되어 있습니다.
웹 콘솔
직관적인 웹 기반 관리 인터페이스를 통해 버킷 관리, 파일 업로드/다운로드, 사용자 권한 관리 등을 쉽게 수행할 수 있습니다.
확장성
파일 시스템과 달리 오브젝트 수와 용량에 제한이 없어 무한 확장이 가능합니다.
내구성
데이터 복제와 분산 저장을 통해 하드웨어 장애로부터 데이터를 보호합니다.
접근성
HTTP REST API를 통해 어디서나 쉽게 접근할 수 있습니다.
비용 효과성
블록 스토리지에 비해 저렴한 비용으로 대용량 데이터를 저장할 수 있습니다.
| 항목 | AWS S3 | MinIO |
|---|---|---|
| 처리량 | 네트워크 대역폭에 의존 | 로컬 네트워크 속도 |
| 지연시간 | 인터넷 경유로 상대적으로 높음 | 로컬 네트워크로 매우 낮음 |
| 동시 연결 | AWS 인프라에 의존 | 서버 스펙에 따라 조정 가능 |
장점:
- 완전 관리형 서비스
- 무제한 확장성
- 99.999999999% (11 9's) 내구성 보장
- 다양한 스토리지 클래스 제공
단점:
- 벤더 종속성
- 비용 예측 어려움
- 설정 복잡성
장점:
- 완전한 제어권
- 예측 가능한 비용
- 높은 성능
- S3 호환성
단점:
- 직접 운영 및 관리 필요
- 인프라 구축 및 유지보수
- 백업 및 재해복구 직접 구현
✅ 글로벌 서비스: 전 세계 사용자에게 서비스 제공
✅ 가변적 워크로드: 트래픽이 불규칙하고 예측하기 어려운 경우
✅ 관리형 서비스 선호: 인프라 관리 부담을 줄이고 싶은 경우
✅ AWS 생태계: 다른 AWS 서비스와 긴밀한 통합이 필요한 경우
✅ 비용 최적화: 예측 가능하고 저렴한 운영 비용 필요
✅ 데이터 프라이버시: 민감한 데이터의 완전한 제어 필요
✅ 높은 성능: 낮은 지연시간과 높은 처리량 요구
✅ 온프레미스/하이브리드: 자체 인프라 환경에서 운영
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
주요 설정 설명
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
주요 설정 설명
클러스터 내부에서 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
# 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
웹 콘솔에 외부에서 접근하려면 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
build.gradle에 MinIO 클라이언트 의존성을 추가합니다.
dependencies {
// 기존 의존성...
// MinIO 의존성 추가
implementation 'io.minio:minio:8.5.2'
}
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보다 더 나은 선택이 될 수 있습니다.