📗 프로비저닝 - MinIO (standalone)
개발·테스트 목적이면 standalone으로 충분하다. 운영환경에서 고가용성 및 노드 장애 허용이 필요하면 반드시 distributed 모드를 써야 한다. MinIO는 4개 이상의 노드/디스크가 있어야 분산 모드로 작동하며, 내부적으로 erasure coding을 통해 redundancy를 제공한다.
| 구성 모드 | 최소 노드 수 | 디스크 수 | 권장 메모리 |
|---|---|---|---|
| Standalone | 1 | 1 | 4 GB |
| Distributed Mode | 4 | ≥ 4/node | ≥ 8 GB/node |
서비스 차이
| 서비스 이름 | 용도 | 기본 포트 |
|---|---|---|
minio | S3 API 서버 (데이터 I/O) | 9000 |
minio-console | 웹 콘솔 (관리 UI) | 9001 |
🏳️🌈 [궁금한점]
🔗[목차]
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
helm pull oci://registry-1.docker.io/bitnamicharts/minio --untar
운영 환경에서는 CSI를 사용해야 한다.
k apply -f mysc.yml
apiVersion: storage.k8s.io/v1
kind: StorageClass
reclaimPolicy: Delete
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
sudo mkdir /tmp/data1
sudo chown -R 1000:1000 /tmp/data1
StorageClass 지정하는 것에 유의한다.
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv1
labels:
type: local
spec:
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage
capacity:
storage: 2Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/tmp/data1"
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- {key: kubernetes.io/hostname, operator: In, values: [slave1]}
k apply -f poc-minio-dev.yaml
persistentvolume/my-pv1 created
k get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
my-pv1 2Gi RWO Delete Available local-storage 3s
cp values.yaml dev-values.yaml
mode: standalone
resources:
requests:
memory: 512Mi
cpu: 250m
limits:
memory: 1Gi
cpu: 500m
persistence:
enabled: true
storageClass: "local-storage" # 필요한 경우 수정
size: 2Gi
accessModes:
- ReadWriteOnce
auth:
rootUser: minioadmin
rootPassword: minioadmin
service:
type: NodePort
console:
service:
type: NodePort
## 개발
helm install my-minio . -n my-dev -f dev-values.yaml --create-namespace
NAME: my-minio
LAST DEPLOYED: Thu Jun 5 20:14:12 2025
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: minio
CHART VERSION: 17.0.2
APP VERSION: 2025.5.24
Did you know there are enterprise versions of the Bitnami catalog? For enhanced secure software supply chain features, unlimited pulls from Docker, LTS support, or application customization, see Bitnami Premium or Tanzu Application Catalog. See https://www.arrow.com/globalecs/na/vendors/bitnami for more information.
** Please be patient while the chart is being deployed **
Minio(R) can be accessed via port 9000 on the following DNS name from within your cluster:
my-minio.default.svc.cluster.local
To get your credentials run:
export ROOT_USER=$(kubectl get secret --namespace default my-minio -o jsonpath="{.data.root-user}" | base64 -d)
export ROOT_PASSWORD=$(kubectl get secret --namespace default my-minio -o jsonpath="{.data.root-password}" | base64 -d)
To connect to your Minio(R) server using a client:
- Run a Minio(R) Client pod and append the desired command (e.g. 'admin info'):
kubectl run --namespace default my-minio-client \
--rm --tty -i --restart='Never' \
--env MINIO_SERVER_ROOT_USER=$ROOT_USER \
--env MINIO_SERVER_ROOT_PASSWORD=$ROOT_PASSWORD \
--env MINIO_SERVER_HOST=my-minio \
--image docker.io/bitnami/minio-client:2025.5.21-debian-12-r1 -- admin info minio
To access the Minio(R) Console:
- Get the Minio(R) Console URL:
echo "Minio(R) Console URL: http://127.0.0.1:9090"
kubectl port-forward --namespace default svc/my-minio-console 9090:9090
WARNING: There are "resources" sections in the chart not set. Using "resourcesPreset" is not recommended for production. For production installations, please set the following values according to your workload needs:
- console.resources
+info https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
apiVersion: v1
data:
root-password: bWluaW9hZG1pbg==
root-user: bWluaW9hZG1pbg==
kind: Secret
metadata:
annotations:
meta.helm.sh/release-name: my-minio
meta.helm.sh/release-namespace: default
creationTimestamp: "2025-06-05T11:14:10Z"
labels:
app.kubernetes.io/component: minio
app.kubernetes.io/instance: my-minio
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: minio
app.kubernetes.io/part-of: minio
app.kubernetes.io/version: 2025.5.24
helm.sh/chart: minio-17.0.2
name: my-minio
namespace: default
resourceVersion: "568757"
uid: abb09c8a-4371-42b4-8f59-c7ab6f975678
type: Opaque
echo "bWluaW9hZG1pbg==" | base64 -d
minioadmin
kubectl get secret my-minio -o jsonpath="{.data.root-user}" | base64 -d
kubectl get secret my-minio -o jsonpath="{.data.root-password}" | base64 -d
k get po -n my-dev
NAME READY STATUS RESTARTS AGE
my-minio-5cf49bdf9b-w2r9t 1/1 Running 0 3m
my-minio-console-5d68c86f54-fn6mn 1/1 Running 0 3m
curl -O https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/
mc --version
mc version RELEASE.2025-05-21T01-59-54Z (commit-id=f71ad84bcf0fd4369691952af5d925347837dcec)
Runtime: go1.24.3 linux/amd64
Copyright (c) 2015-2025 MinIO, Inc.
License GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>
k get svc -n my-dev
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-minio NodePort 10.99.231.20 <none> 9000:32464/TCP 3m24s
my-minio-console NodePort 10.99.14.58 <none> 9090:31326/TCP 3m24s
mc alias set local http://192.168.56.10:32464 minioadmin minioadmin
Added `local` successfully.
mc mb local/mybucket
Bucket created successfully `local/mybucket`.
mc ls local
[2025-06-06 16:53:28 KST] 0B mybucket/

# helm 삭제 후 재 생성
helm delete my-minio -n my-dev
helm install my-minio . -n my-dev -f dev-values.yaml --create-namespace
# persistentVolumeReclaimPolicy: Retain 일 경우 - Released 상태의 pv Available로 변경
rm -rf /tmp/data1/*
kubectl patch pv my-pv1 -p '{"spec":{"claimRef": null}}'
# persistentVolumeReclaimPolicy: Retain 일 경우 - PV 생성
k apply -f poc-minio-dev.yaml