MinIO Study 1주차 MinIO On k8s
가시다님이 운영하시는 MinIO Study 1주차 내용을 정리한 게시글 입니다.
1. MinIO On k8s
MinIO를 k8s 에 구성해야하는 이유
- 완전한 자동화의 실현
k8s의 본질은 '완전한 자동화'입니다. 현대 애플리케이션은 Stateless 컨테이너로 구현되어 k8s를 통해 자유롭게 확장, 이동하지만, 데이터(State)는 어딘가에 영속적으로 저장되어야 합니다. 만약 이 데이터를 k8s 외부의 MinIO에 저장한다면, k8s는 애플리케이션만 관리하고 데이터가 저장된 스토리지는 관리하지 못하는 '반쪽짜리 자동화'에 머무르게 됩니다. 스토리지의 확장, 장애 복구 등은 결국 수동으로 처리해야 하며, 이는 k8s의 핵심 가치를 훼손합니다.
진정한 인프라 독립성 및 이식성(Portability) 확보
만약 로컬에서는 파일 시스템을, 개발 환경에서는 AWS S3를, 운영 환경에서는 Azure Blob Storage를 사용한다면 어떻게 될까요? 각 스토리지의 API, 성능 특성, 비용 모델이 모두 달라 애플리케이션은 특정 환경에 종속되고 환경 간 이동이 매우 어려워집니다. 하지만 MinIO를 컨테이너화하여 k8s에서 실행하면, AWS, Azure, GCP, 온프레미스 등 어떤 쿠버네티스 환경에서든 100% 동일하게 동작하는 표준 S3 API 엔드포인트를 확보할 수 있습니다. 이를 통해 개발부터 운영까지 일관된 스토리지 환경을 구성하여 진정한 이식성을 실현합니다.스토리지가 서비스(Storage-as-a-Service)로 진화
MinIO는 자체적으로 이레이저 코딩을 통한 데이터 보호, 암호화, 장애 복구 기능을 내장한 지능형 소프트웨어입니다. 이를 k8s 위에서 'Operator' 패턴으로 실행하면, 스토리지 인프라는 더 이상 개발자가 신경 써야 할 대상이 아닙니다. 개발자는 필요할 때마다 표준 S3 API를 통해 스토리지를 '서비스'처럼 소비하기만 하면 됩니다. 스토리지의 프로비저닝, 확장, 업그레이드, 모니터링 등 모든 복잡한 운영은 쿠버네티스가 자동화하여 처리합니다.
Minio Operator 구성 및 실습환경 구성


Figure 1.1 MinIO k8s Operator 구성
mkdir minio && cd minio
# kind 설치
kind create cluster --name myk8s --image kindest/node:v1.33.4 --config - <<EOF
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 30000
hostPort: 30000
- containerPort: 30001
hostPort: 30001
- containerPort: 30002
hostPort: 30002
- role: worker
- role: worker
- role: worker
- role: worker
EOF
helm repo add minio-operator https://operator.min.io
helm repo update
helm install \
--namespace minio-operator \
--create-namespace \
--set operator.replicaCount=1 \
operator minio-operator/operator
kubectl get all -n minio-operator
Tenant
Tenant는 MinIO Cluster의 서버 풀 구성, 보안 및 네트워크, 리소스 할당,과 같은 정보들을 담은 CR입니다.

Figure 1.2 MinIO Tenant 설명
MinIO에서는 로컬로 연결된 스토리지가 있는 Worker Node에 Tenant를 배포할 것을 강력히 권장합니다.
이때 WorkerNode는 Production을 위한 하드웨어 체크리스트를 충족해야합니다.
Operator를 이용하여 Tenant를 생성할 때 자체 NameSpace를 이용해서 생성을하며, 해당 Name Space에서 구성에 필요한 Pod를 구성합니다.
Tenant Pod는 Init Container, MinIO기능을 수행하는 Container, Tenant 설정을 모니터링 및 감시하는 SideCar Container로 구성되어있습니다.
MinIO Operator Tenant Chart는 Community에서 관리하는 MinIO Chart와 다르기 떄문에 공식문서에서 사용하는 helm Chart를 이용하여 설치하는 것을 권장합니다.
curl -sLo values.yaml https://raw.githubusercontent.com/minio/operator/master/helm/tenant/values.yaml
# values 수정 : 기본키(minio , minio123)
tenant:
pools:
- servers: 4
name: pool-0
volumesPerServer: 1 # The number of volumes attached per MinIO Tenant Pod / Server.
size: 1Gi # The capacity per volume requested per MinIO Tenant Pod.
env:
- name: MINIO_STORAGE_CLASS_STANDARD
value: "EC:1"
helm install \
--namespace tenant-0 \
--create-namespace \
--values values.yaml \
tenant-0 minio-operator/tenant
# web UI NodePort
kubectl patch svc -n tenant-0 myminio-console -p '{"spec": {"type": "NodePort", "ports": [{"port": 9443, "targetPort": 9443, "nodePort": 30001}]}}'
wslview https://127.0.0.1:30001
# API NodePort 적용
kubectl patch svc -n tenant-0 minio -p '{"spec": {"type": "NodePort", "ports": [{"port": 443, "targetPort": 9000, "nodePort": 30002}]}}'
mc alias set k8sminio https://127.0.0.1:30002 minio minio123 --insecure
# 버킷 생성
mc mb k8sminio/mybucket --insecure
파일을 업로드하고, 정상적으로 분산 저장이 되는지 확인해보겠습니다.
# Node의 PV 확인
for node in worker worker2 worker3 worker4; do echo "node : myk8s-$node" ; docker exec -it myk8s-$node tree -h /var/local-path-provisioner; echo; done
# node : myk8s-worker
# [4.0K] /var/local-path-provisioner
# `-- [4.0K] pvc-06add113-a7b0-4cd0-a0df-475e413c9d56_tenant-0_data0-myminio-pool-0-2
# `-- [4.0K] data
# `-- [4.0K] mybucket
# `-- [4.0K] temp.txt
# `-- [3.6K] xl.meta
# 5 directories, 1 file
# node : myk8s-worker2
# [4.0K] /var/local-path-provisioner
# `-- [4.0K] pvc-21fa43e4-bff4-43ec-ad38-768863336ba0_tenant-0_data0-myminio-pool-0-3
# `-- [4.0K] data
# `-- [4.0K] mybucket
# `-- [4.0K] temp.txt
# `-- [3.6K] xl.meta
# 5 directories, 1 file
# node : myk8s-worker3
# [4.0K] /var/local-path-provisioner
# `-- [4.0K] pvc-71a0ffd3-69d7-4265-9d1e-49313462231b_tenant-0_data0-myminio-pool-0-0
# `-- [4.0K] data
# `-- [4.0K] mybucket
# `-- [4.0K] temp.txt
# `-- [3.6K] xl.meta
# 5 directories, 1 file
# node : myk8s-worker4
# [4.0K] /var/local-path-provisioner
# `-- [4.0K] pvc-7bd484a3-7060-4f2f-9254-be8bd8371e7c_tenant-0_data0-myminio-pool-0-1
# `-- [4.0K] data
# `-- [4.0K] mybucket
# `-- [4.0K] temp.txt
# `-- [3.6K] xl.meta
# 5 directories, 1 file
docker exec -it myk8s-worker sh -c 'cat /var/local-path-provisioner/*/data/mybucket/temp.txt/xl.meta'
docker exec -it myk8s-worker2 sh -c 'cat /var/local-path-provisioner/*/data/mybucket/temp.txt/xl.meta'
docker exec -it myk8s-worker3 sh -c 'cat /var/local-path-provisioner/*/data/mybucket/temp.txt/xl.meta'
# Parity Disk 확인
docker exec -it myk8s-worker4 sh -c 'cat /var/local-path-provisioner/*/data/mybucket/temp.txt/xl.meta'
IAM 인증
외부에서 MinIO와 통신을 하기 위해 신원 확인 및 권한 체크가 필수적으로 필요한데 이때, 관리를 MinIO 내부에서 관리를 할 수 있지만 OpenID, LDAP, AD와 같은 도구를 이용해서 관리를 할 수 있습니다.
MinIO는 정책 기반 접근 제어(PBAC)를 이용하여 제어를 수행하며, PBAC는 AWS IAM 정책 구문, 구조 및 동작과 호환되도록 설계되어 있습니다.
'DevOps > Study' 카테고리의 다른 글
| MinIO Study 2주차 Performance & Warp (0) | 2025.09.20 |
|---|---|
| MinIO Study 2주차 DirectPV (0) | 2025.09.20 |
| MinIO Study 1주차 MinIO 소개 (0) | 2025.09.13 |
| Cilium Study [1기] 8주차 K8S Security & Tetragon (0) | 2025.09.06 |
| Cilium Study [1기] 7주차 Cilium Performance & Tunning (1) | 2025.08.31 |