Overview
MinIO는 고성능, 확장 가능하고 배포가 용이한 분산 객체 스토리지 시스템이다.
Amazon S3와 완벽하게 호환되며, 온프레미스, 프라이빗 클라우드 및 하이브리드 환경에서 실행할 수 있는 S3 호환 스토리지 솔루션으로 널리 사용된다.
MinIO의 주요 특징
Scalability (확장성) → 여러 노드를 연결하여 페타바이트(PB) 규모 데이터까지 관리 가능
High Availability (고가용성) → Erasure Coding 및 Bitrot Protection 지원
Performance (성능 최적화) → 고속 데이터 처리 및 대량 트래픽 동시 처리 지원
S3 API Compatibility (S3 API 호환성) → Amazon S3용 기존 애플리케이션과 100% 호환
Security (보안 강화) → TLS 암호화, IAM 역할 기반 정책 적용, ID 관리 가능
Multi-tenancy (다중 테넌시 지원) → 여러 사용자 및 팀별 스토리지 분리 및 권한 관리 가능
MinIO는 Kubernetes 및 컨테이너 환경에서도 강력한 오브젝트 스토리지 솔루션으로 활용될 수 있으며, 대규모 데이터 저장, 백업 및 클라우드 기반 서비스에 최적화되어 있다.
Minio란?
Minio는 확장 가능하고 안전하며 배포가 용이하도록 설계된 고성능 분산 객체 스토리지 시스템이다. 사진, 비디오, 로그 파일, 백업, 컨테이너 이미지 등 구조화되지 않은 데이터를 저장하는 데 자주 사용된다.
Minio는 Amazon S3 클라우드 스토리지 서비스와 호환되므로 온프레미스 또는 프라이빗 클라우드 환경에서 실행할 수 있는 S3 호환 스토리지 솔루션을 찾는 기업과 개발자에게 인기가 많다.
Minio 주요기능
- Scalability
- Minio는 여러 노드를 연결하여 확장하여 페타바이트 규모의 데이터를 효율적으로 관리할 수 있다.
- 모든 노드에 데이터를 분산시켜 내결함성과 성능을 향상시킨다.
- High Availability and Durability
- Minio는 erasure coding 및 bitrot protection을 지원하여 하드웨어 오류 및 데이터 손상으로부터 데이터를 보호한다.
- 분산 특성으로 인해 인프라의 일부가 중단되더라도 지속적인 접근이 가능하다.
- Performance
- Minio는 지연 시간 없이 많은 수의 동시 요청을 처리할 수 있는 기능을 갖춘 고성능 환경을 지원하도록 설계되었으므로 웹 및 클라우드 서비스와 같은 트래픽이 많은 애플리케이션에 적합하다.
- S3 Compatibility
- Amazon S3 API와 완벽하게 호환되는 Minio는 Amazon S3용으로 설계된 기존 도구 및 라이브러리와 원활하게 통합될 수 있다.
- 이러한 호환성을 통해 사용자는 애플리케이션 코드를 변경하지 않고도 Amazon의 클라우드로 마이그레이션할 수 있다.
- Security
- Minio는 미사용 암호화(AES-256 사용) 및 전송 중 암호화(TLS) 지원, Minio에 내장된 ID 서버를 통한 ID 및 액세스 관리, OpenID Connect 또는 LDAP/AD를 사용하는 외부 ID 공급자와의 통합 등 강력한 보안 기능을 제공한다.
- Multi-tenancy
- Minio는 다중 테넌트를 지원하므로 여러 사용자 또는 팀이 엄격한 격리 및 제어를 통해 운영된다.
- Deployment
- Minio는 Kubernetes를 포함한 다양한 플랫폼에 배포하여 자동화된 관리, 확장 및 복구를 통한 기본 경험을 제공할 수 있다. 또한 가상 머신, 베어메탈 및 컨테이너화된 환경에서의 배포도 지원한다.
MinIO Standalone vs Distributed Mode 차이
비교 항목 | Standalone Mode | Distributed Mode |
설명 | 단일 노드에서 실행되는 MinIO 인스턴스 | 여러 노드에서 실행되며 데이터가 분산됨 |
가용성(HA) | 낮음 (단일 노드 장애 시 서비스 중단) | 높음 (노드 장애 시에도 데이터 접근 가능) |
데이터 보호 | Erasure Coding 없음 | Erasure Coding 및 Bitrot Protection 지원 |
권장 사용 사례 | 개발, 테스트 환경 | 대규모 배포 및 프로덕션 환경 |
설치 예제 | `helm install --set mode=standalone ...` | `helm install --set mode=distributed ...` |
- Standalone Mode는 개발 및 테스트에 적합하며, Production에서는 반드시 Distributed Mode를 사용해야 한다.
Distributed Mode 설치 예제
helm install minio-distributed minio/minio --namespace minio --create-namespace \\
--set mode=distributed \\
--set replicas=4 \\
--set accessKey=rootuser \\
--set secretKey=rootpass123
- 이제 MinIO는 다중 노드에서 실행되며 고가용성을 보장할 수 있다.
Minio 설치
helm repo add minio https://charts.min.io/
helm repo list
NAME URL
minio https://charts.min.io/
# Standard
helm install my-minio minio/minio --namespace minio --create-namespace --set accessKey=rootuser,secretKey=rootpass123
# Toy Setup
helm install --set resources.requests.memory=512Mi --set replicas=1 --set persistence.enabled=false --set mode=standalone --set rootUser=rootuser,rootPassword=rootpass123 --generate-name minio/minio --namespace minio --create-namespace
Toy Setup으로 설치해주었다.
helm install --set resources.requests.memory=512Mi --set replicas=1 --set persistence.enabled=false --set mode=standalone --set rootUser=rootuser,rootPassword=rootpass123 --generate-name minio/minio --namespace minio --create-namespace
NAME: minio-1724308499
LAST DEPLOYED: Thu Aug 22 06:34:59 2024
NAMESPACE: minio
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
MinIO can be accessed via port 9000 on the following DNS name from within your cluster:
minio-1724308499.minio.svc.cluster.local
To access MinIO from localhost, run the below commands:
1. export POD_NAME=$(kubectl get pods --namespace minio -l "release=minio-1724308499" -o jsonpath="{.items[0].metadata.name}")
2. kubectl port-forward $POD_NAME 9000 --namespace minio
Read more about port forwarding here: <http://kubernetes.io/docs/user-guide/kubectl/kubectl_port-forward/>
You can now access MinIO server on . Follow the below steps to connect to MinIO server with mc client:
1. Download the MinIO mc client - <https://min.io/docs/minio/linux/reference/minio-mc.html#quickstart>
2. export MC_HOST_minio-1724308499-local=http://$(kubectl get secret --namespace minio minio-1724308499 -o jsonpath="{.data.rootUser}" | base64 --decode):$(kubectl get secret --namespace minio minio-1724308499 -o jsonpath="{.data.rootPassword}" | base64 --decode)@localhost:9000
3. mc ls minio-1724308499-local
설치 확인한다.
k get po,svc,deploy -n minio
NAME READY STATUS RESTARTS AGE
pod/minio-1724308499-68b6695d9c-j2wnj 1/1 Running 0 3m7s
pod/my-minio-post-job-2546w 0/1 CrashLoopBackOff 3 (37s ago) 5m35s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/minio-1724308499 ClusterIP 10.233.6.155 <none> 9000/TCP 3m8s
service/minio-1724308499-console ClusterIP 10.233.30.81 <none> 9001/TCP 3m8s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/minio-1724308499 1/1 1 1 3m7s
Service Type을 nodeport로 변경한다.
k get svc -n minio
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
minio-1724308499 ClusterIP 10.233.6.155 <none> 9000/TCP 7m28s
minio-1724308499-console ClusterIP 10.233.30.81 <none> 9001/TCP 7m28s
kubectl patch svc minio-1724308499-console -n minio --type='json' -p='[{"op": "replace", "path": "/spec/type", "value": "NodePort"}]'
k get svc -n minio
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
minio-1724308499 ClusterIP 10.233.6.155 <none> 9000/TCP 8m5s
minio-1724308499-console NodePort 10.233.30.81 <none> 9001:30211/TCP 8m5s
Console 접근한다.
아까 설정한 ID/PW 로 로그인 해준다. (`rootUser=rootuser,rootPassword=rootpass123`)
Minio 활용
링크 참고해서, Minio Clinet 다운로드 후에 Bucket 생성해본다.
# MAC install
brew install minio/stable/mc
# etc 링크 참고
minio와 연결하려면 아래와 같이 설정해야 한다.
ex)
mc alias set <ALIAS> <YOUR-MINIO-ENDPOINT> <ACCESS-KEY> <SECRET-KEY>
mc alias set myminio http://10.0.71.51:30211 rootuser rootpass123
mc: <ERROR> Unable to initialize new alias from the provided credentials. S3 API Requests must be made to API port.
에러가 발생한다. 왜그럴까?
k logs -n minio minio-1724308499-68b6695d9c-j2wnj | less
Formatting 1st pool, 1 set(s), 1 drives per set.
WARNING: Host local has more than 0 drives of set. A host failure will result in data becoming unavailable.
MinIO Object Storage Server
Copyright: 2015-2024 MinIO, Inc.
License: GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>
Version: RELEASE.2024-04-18T19-09-19Z (go1.21.9 linux/amd64)
API:
WebUI:
Docs: <https://min.io/docs/minio/linux/index.html>
Status: 1 Online, 0 Offline.
STARTUP WARNINGS:
- The standard parity is set to 0. This can lead to data loss.
You are running an older version of MinIO released 4 months before the latest release
Update: Run `mc admin update ALIAS`
minio 로그를 보면 알 수 있다. API Endpoint도 Nodeport로 열어줘야 한다.
kubectl patch svc minio-1724308499 -n minio --type='json' -p='[{"op": "replace", "path": "/spec/type", "value": "NodePort"}]'
k get svc -n minio
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
minio-1724308499 NodePort 10.233.6.155 <none> 9000:31067/TCP 23m
minio-1724308499-console NodePort 10.233.30.81 <none> 9001:30211/TCP 23m
다시 연결해본다. 성공적으로 연결되었다. console은 web 역할만 해줄뿐이고 mc 명령어로 endpoint 연결할때는
`minio-1724308499` 해당 리소스와 연결해줘야 한다.
mc alias set myminio http://10.0.71.51:31067 rootuser rootpass123
mc: Configuration written to `/Users/somaz/.mc/config.json`. Please update your access credentials.
mc: Successfully created `/Users/somaz/.mc/share`.
mc: Initialized share uploads `/Users/somaz/.mc/share/uploads.json` file.
mc: Initialized share downloads `/Users/somaz/.mc/share/downloads.json` file.
Added `myminio` successfully.
아래와 같이 connection을 확인해줄 수 있다.
mc admin info myminio
● 10.0.71.51:31067
Uptime: 24 minutes
Version: 2024-04-18T19:09:19Z
Network: 1/1 OK
Drives: 1/1 OK
Pool: 1
┌──────┬───────────────────────┬─────────────────────┬──────────────┐
│ Pool │ Drives Usage │ Erasure stripe size │ Erasure sets │
│ 1st │ 38.8% (total: 46 GiB) │ 1 │ 1 │
└──────┴───────────────────────┴─────────────────────┴──────────────┘
1 drive online, 0 drives offline, EC:0
문법은 해당 링크에서 확인 가능하다.
# Bucket 생성
mc mb myminio/somaz-bucket
Bucket created successfully `myminio/somaz-bucket`.
# Bucket 생성 확인
mc ls myminio
[2024-08-22 16:01:27 KST] 0B somaz-bucket/
# 파일 업로드
mc cp test.txt myminio/somaz-bucket
/Users/somaz/test.txt: 13 B / 13 B
# 파일 업로드 확인
mc ls myminio/somaz-bucket
[2024-08-22 16:03:19 KST] 13B STANDARD test.txt
# Local 파일 삭제 후 somaz-bucket 파일 가져오기
rm -rf test.txt
mc cp myminio/somaz-bucket/test.txt .
...10.0.71.51:31067/somaz-bucket/test.txt: 13 B / 13 B
cat test.txt
test!! somaz
아래와 같이 Console에서도 확인 가능하다.
MinIO Erasure Coding 설정
Erasure Coding을 위한 최소 요구사항
- Standalone Mode: 적용 불가
- Distributed Mode: 최소 4개 이상의 노드 필요
- MinIO는 Erasure Coding을 통해 RAID-5, RAID-6처럼 장애 허용.
Erasure Coding 활성화 방법
helm install minio-distributed minio/minio --namespace minio --create-namespace \\
--set mode=distributed \\
--set replicas=4 \\
--set erasureSetDriveCount=4
- 이렇게 하면 최소 4개의 노드에서 데이터 보호가 가능해짐.
현재 Erasure Coding 상태 확인
mc admin info myminio
출력 예시:
┌──────┬───────────────────────┬─────────────────────┬──────────────┐
│ Pool │ Drives Usage │ Erasure stripe size │ Erasure sets │
│ 1st │ 38.8% (total: 46 GiB) │ 4 │ 1 │
└──────┴───────────────────────┴─────────────────────┴──────────────┘
- Erasure Coding이 적용된 것을 확인할 수 있다.
MinIO Policy 설정
1) Read-Only 사용자를 생성
mc alias set myminio https://10.0.71.51:31067 rootuser rootpass123
mc admin user add myminio readonly-user readonly-pass
2) Read-Only Policy 생성
mc admin policy add myminio readonly-policy readonly.json
3) Read-Only Policy 파일(readonly.json) 예제
json
복사편집
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket"
],
"Resource": ["arn:aws:s3:::*"]
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": ["arn:aws:s3:::*/*"]
}
]
}
- 이제 readonly-user는 MinIO에서 파일 읽기만 가능하고, 쓰기는 불가능하다.
4) Policy 적용
mc admin policy set myminio readonly-policy user=readonly-user
- 이제 보안이 강화된 MinIO를 운영할 수 있다.
MinIO와 Prometheus/Grafana 모니터링
1) MinIO에서 Prometheus 활성화
helm install my-minio minio/minio --namespace minio \\
--set metrics.enabled=true \\
--set metrics.serviceMonitor.enabled=true
2) Prometheus에서 MinIO Target 추가 (prometheus.yml)
scrape_configs:
- job_name: 'minio'
static_configs:
- targets: ['10.0.71.51:31067']
3) MinIO Grafana 대시보드 추가
kubectl port-forward -n monitoring svc/grafana 3000:80
- 이제 Grafana에서 MinIO 대시보드를 확인할 수 있다!
마무리 글 | MinIO의 가치와 활용성
MinIO는 고성능, 고가용성, 확장성을 갖춘 오브젝트 스토리지 솔루션으로,
Amazon S3와의 완벽한 호환성을 제공하면서도 온프레미스 및 클라우드 환경에서 손쉽게 배포할 수 있는 장점이 있다.
이번 글에서는 MinIO의 주요 기능과 Standalone Mode vs Distributed Mode의 차이, Helm을 이용한 Kubernetes 배포, 그리고 MinIO Client(mc) 활용법까지 전반적인 사용 방법을 다루었다. 또한 Erasure Coding을 통한 데이터 보호, 정책 기반의 접근 제어, Prometheus/Grafana를 통한 모니터링 등의 고급 기능도 살펴보았다.
특히 Prometheus 및 Grafana 연계를 통해 모니터링을 강화하고, Erasure Coding을 설정하여 높은 내구성을 확보하는 방법을 적용하면, 기업 환경에서도 안정적으로 사용할 수 있는 스토리지 솔루션이 될 수 있다.
MinIO 활용 방향
- 백업 및 로그 저장소: 빠르고 안정적인 객체 저장소가 필요할 때
- 멀티 테넌시 스토리지: 사용자별 권한 설정이 필요할 때
- 클라우드 네이티브 환경: Kubernetes 및 CI/CD와 연동하여 DevOps 환경 구축 시
- 데이터 분석 & AI 모델 저장소: 대규모 데이터를 처리하는 머신러닝/딥러닝 환경에서
앞으로의 발전 방향
MinIO는 지속적인 업데이트를 통해 성능 최적화, 보안 강화, 운영 편의성 개선을 이루고 있으며, 앞으로도 클라우드 및 하이브리드 환경에서 핵심적인 오브젝트 스토리지 역할을 수행할 것으로 기대된다.
기업 환경에서 S3 대안이 필요하다면?
👉 MinIO를 활용하여 강력한 스토리지 인프라를 구축해보자!
Reference
https://github.com/minio/minio/blob/master/helm/minio/README.md
https://min.io/docs/minio/linux/reference/minio-mc.html#quickstart
'Open Source Software' 카테고리의 다른 글
Vaultwarden(Bitwarden)이란? (2) | 2024.11.08 |
---|---|
Harbor란? (4) | 2024.10.08 |
Habor Robot Account(하버 로봇 계정)란? (0) | 2024.08.21 |
Cephadm-ansible이란? (3) | 2024.02.29 |
Rook-Ceph란? (0) | 2024.02.20 |