새소식

Storage

[MinIO Study 1주차] MinIO 배포 및 기본 활용

  • -

CoudNet@ 팀의 가시다님께서 리딩하시는 MinIO Study 1주차 스터디 내용 정리

 

 

스터디 첫 주차에는 MinIO 스토리지에 대해 소개하고 동작 방식을 학습했습니다.
이번 글에서는 MinIO 를 실제 배포해보고 앞서 배웠던 동작 방식 개념을 실습해보려고 합니다.



1. MinIO as a Container (SNSD)

 

MinIO 첫 실습인 만큼 Single-Node Single-Disk (SNSD) 배포 방식을 사용하겠습니다.
SNSD 는 Docker 를 통해서 간단하게 실습할 수 있습니다.

 

 

1.1. MinIO Docker 배포

 

별도 실습 디렉토리 생성
mkdir /tmp/data
tree -h /tmp/data

 

Docker 를 통한 MinIO 배포
# Port : MinIO API 포트 (9000), 웹콘솔 포트 (9090)
# Volume: Host /tmp/data 디렉토리를 MinIO 컨테이너 /data 디렉토리로 마운트
# 웹콘솔 접속을 위한 어드민 유저, 패스워드 설정
# 컨테이너 실행 시 'server /data --console-address ":9090"' 명령어 수행

docker run -itd -p 9000:9000 -p 9090:9090 --name minio -v /tmp/data:/data \
  -e "MINIO_ROOT_USER=admin" -e "MINIO_ROOT_PASSWORD=minio123" \
  quay.io/minio/minio server /data --console-address ":9090"

# 컨테이너 배포 확인
docker ps

 

 

이 때, 아래와 같이 컨테이너 로그를 확인해보면 SNSD 배포 방식이므로 아래와 같이 서버 호스트 장애 발생 시 데이터 시스템이 다운될 수 있다는 경고창이 발생합니다.
그리고 MinIO 접속 URL 및 접속 유저에 대한 로그도 출력이 됩니다.

 

docker logs minio

 



1.2. MinIO 접속 및 사용

 

배포가 잘 되었다면 http://127.0.0.1:9090/login 브라우저에 접속하여 유저 정보를 입력합니다.

 

 

그 후 MinIO 버킷을 생성하고 테스트 파일을 넣어줍니다.
테스트 파일은 직접 만들어서 넣거나 아래 파일을 다운로드 해서 넣으셔도 됩니다.
아래 파일은 1000줄 짜리 텍스트가 많은 소설 파일입니다.

life.txt
66.7 kB

 

 

 

그 후 실제로 MinIO 가 관리하는 데이터 디렉토리에서 파일을 확인해보겠습니다.

 

# 트리 구조로 디렉토리 확인
tree -h /tmp/data

# xl.meta 파일 확인
cat /tmp/data/test/life.txt/xl.meta| head

#
cat /tmp/data/test/life.txt/xl.meta| tail

 

 

해당 위치에는 Bucket 명칭의 디렉토리가 생성된 후 그 하위에 Erasure Code 기반의 XL Format을 따르는 파일이 생성되어있는 것을 확인할 수 있습니다.

 

 

1.3. MinIO CLI 활용 (MC)

 

MinIO 는 Unix 명령어처럼 사용할 수 있는 MinIO Client CLI 도구를 사용할 수 있습니다.

 

brew install minio/stable/mc
mc --help

# 
mc alias list

 

 

mc 에는 기본적으로 AWS Profile 처럼 MinIO 스토리지에 접근할 수 있는 Alias(별칭) 접근 정보를 입력할 수 있습니다.
아래 명령어를 입력하여 Docker 로 배포한 MinIO 스토리지를 Alias 로 등록할 수 있습니다.

 

mc alias set 'myminio' 'http://127.0.0.1:9000' 'admin' 'minio123'

 

 

# myminio 정보 확인
mc admin info myminio

# myminio/test 버킷 조회
mc ls myminio/test

 

 

1.4. MinIO 접근 정책 활용

 

MinIO 도 사용하기 위해 인증/인가를 확인해야 합니다.
MinIO 는 S3 와 호환되기 때문에 AWS S3 정책과 동일합니다.

 

# IAM 기본 정책 및 커스텀 정책 확인
mc admin policy list myminio

# IAM 정책 세부
mc admin policy info myminio consoleAdmin | jq

 

 

AWS S3 버킷도 외부 공개 설정을 할 수 있는 것처럼 MinIO 도 동일하게 외부 공개를 설정할 수 있습니다.

 

# 기본 Private
mc anonymous get myminio/test

# 객체 접근
curl -s http://127.0.0.1:9000/test/life.txt

# Public 변경
mc anonymous set public myminio/test
mc anonymous get myminio/test

# 객체 접근
curl -s http://127.0.0.1:9000/test/life.txt | head -n 10

 

 

Private 일 때는 Access Denied 지만, Public 일 경우 리소스 조회가 가능한 것을 알 수 있습니다.

 

다음 실습을 위해 리소스 제거

 

docker rm -f minio && rm -rf /tmp/data



 

2. MinIO as a Container (SNMD)

 

이번에는 Single-Node Multi-Disk (SNMD) 배포를 Docker 를 통해 확인해보겠습니다.

 

 

2.1. MinIO Docker 배포

 

멀티 디스크인만큼 디렉토리를 4개 생성합니다.

 

mkdir -p /tmp/disk1 /tmp/disk2 /tmp/disk3 /tmp/disk4
tree -h /tmp

 

Docker 를 통한 MinIO 배포
# Port : MinIO API 포트 (9000), 웹콘솔 포트 (9090)
# Volume: Host 각 디렉토리를 MinIO 컨테이너 각 /data 디렉토리로 마운트
# 웹콘솔 접속을 위한 어드민 유저, 패스워드 설정
# 컨테이너 실행 시 'server /data --console-address ":9090"' 명령어 수행
# 데이터블록:패리티 블록 비율은 3:1

docker run -itd -p 9000:9000 -p 9090:9090 --name minio \
  -v /tmp/disk1:/data1 \
  -v /tmp/disk2:/data2 \
  -v /tmp/disk3:/data3 \
  -v /tmp/disk4:/data4 \
  -e "MINIO_ROOT_USER=admin" -e "MINIO_ROOT_PASSWORD=minio123" -e "MINIO_STORAGE_CLASS_STANDARD=EC:1" \
  quay.io/minio/minio server /data{1...4} --console-address ":9090"

# 컨테이너 배포 확인
docker ps



2.2. MinIO 접속 및 사용

 

아까와 동일하게 웹 콘솔에 접근하여 파일을 업로드 합니다.
업로드 하는 스크린샷은 아까와 동일하므로 찍지 않았습니다.

 

이후 MinIO 디렉토리를 확인해봅니다.

 

tree -h /tmp

 

 

하나의 파일이 동일한 크기로 나누어져 저장된 것을 알 수 있습니다.
각각의 파일 내용을 확인해봅니다.

 

cat /tmp/disk1/test/life.txt/xl.meta | head -n 5
cat /tmp/disk2/test/life.txt/xl.meta | head -n 5
cat /tmp/disk3/test/life.txt/xl.meta | head -n 5
cat /tmp/disk4/test/life.txt/xl.meta | head -n 5

 

 

저의 경우 disk3 에 있는 파일이 난수화 되어 있는 Parity 블록 파일인 것을 확인할 수 있었습니다.

 

 

2.3. MinIO 유실 재현 및 복구 확인

 

Parity 에 의한 복구 테스트를 위해서 기존 파일을 강제로 삭제해봅니다.
각자 패리티가 아닌 디렉토리를 제거하면 됩니다.

 

# disk1 데이터 블록 강제 삭제
rm -rf /tmp/disk1/test
tree -h /tmp

 

 

버킷 수동 회복

 

# 데이터 복구
mc admin heal myminio/test

# 데이터 확인 (복구에 약간의 시간 소요)
tree -h /tmp
cat /tmp/disk1/test/life.txt/xl.meta | head -n 5

 

 

복구된 파일 확인

 

 

다음 실습을 위해 리소스 제거

 

docker rm -f minio && rm -rf /tmp/disk{1..4}



 

3. MinIO on K8S

 

3.1. Kind 를 통한 K8S 배포

 

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

 

 

3.2. MinIO Operator 배포

 

MinIO on k8s

 

 

MinIO Operator 는 MinIO Tenant 를 K8S 에 CRD 로 배포하고 관리하는 K8S 네이티브 Operator 입니다.
MinIO Operator 는 Helm 으로 설치할 수 있습니다.

실습인 관계로 Operator 파드는 1개만 배포합니다.

 

# Add the MinIO Operator Repo to Helm
helm repo add minio-operator https://operator.min.io
helm repo update
helm search repo minio-operator

# Helm 설치
helm install \
  --namespace minio-operator \
  --create-namespace \
  --set operator.replicaCount=1 \
  operator minio-operator/operator 

 

Operator 배포 후, CRD 에 Tenant 가 추가된 것을 확인할 수 있습니다.

 

kubectl get crd

 

 

 

3.3. MinIO Tenant 배포

 

출처:  https://docs.min.io/community/minio-object-store/operations/deployments/k8s-minio-tenants.html

 

 

MinIO 테넌트는 MinIO 오브젝트 스토리지 서비스를 제공하기 위해 네임스페이스 내에 배포된 K8S 리소스 세트입니다.

 

Tenant 구성 요소

 

  • 워커 노드

MinIO 에서는 로컬로 연결된 스토리지가 있는 K8S 워커 노드에 테넌트를 배포할 것을 강력히 권장

 

  • 영구 볼륨

MinIO 는 일반적으로 ReadWriteOnce 접근 모드를 지원하는 모든 Kubernetes 영구 볼륨(PV)을 사용할 수 있습니다.
StorageClass 는 Retain, DirectPV 를 강력히 권장합니다.

 

  • 테넌트 네임스페이스

테넌트는 자체 네임스페이스를 가져야합니다.

각 테넌트 파드는 3개의 컨테이너를 실행하는데, 각각의 컨테이너는 다음과 같습니다.

 

a. MinIO 컨테이너
- 모든 표준 MinIO 기능 실행

- 마운트 지점(영구 볼륨)에 객체를 저장하고 검색

 

b. Init 컨테이너
- 파드 시작 시 가동
- 시작 시 구성 비밀 관리 (Configuration Secrets)

 

c. SideCar 컨테이너
- 테넌트의 구성 비밀을 모니터링하고 변경될 경우 업데이트 (Reload)



Tenant 배포

 

Tenant values 파일에서 다음 내용 수정 후 배포

curl -sLo values.yaml https://raw.githubusercontent.com/minio/operator/master/helm/tenant/values.yaml

# 아래 값으로 변경 후 배포
vim values.yaml

...
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

kubectl get tenants -A -w

 

 

kubectl get sts,pod,svc,ep,pvc,secret -n tenant-0

 

 

아래 명령어를 입력하여 MinIO Pod 로그를 확인해봅니다.
Docker 와는 다르게 MinIO API 엔드포인트가 Kubernetes 서비스 엔드포인트로 변경된 것을 알 수 있습니다.

 

kubectl logs -n tenant-0 -l v1.min.io/pool=pool-0

 

 

MinIO 접근 정보 확인

 

kubectl get secret -n tenant-0 myminio-env-configuration -o jsonpath='{.data.config\.env}' | base64 -d ; echo

 

 

 

3.4. MinIO 콘솔 및 CLI 접속

 

기본적으로 MinIO 콘솔 서비스가 ClusterIP 로 배포되어 있어 NodePort 로 패치해줍니다.

 

kubectl patch svc -n tenant-0 myminio-console -p '{"spec": {"type": "NodePort", "ports": [{"port": 9443, "targetPort": 9443, "nodePort": 30001}]}}'

# 콘솔 접근
open https://127.0.0.1:30001

 

 

MinIO CLI 접근을 위한 NodePort 변경

 

kubectl patch svc -n tenant-0 minio -p '{"spec": {"type": "NodePort", "ports": [{"port": 443, "targetPort": 9000, "nodePort": 30002}]}}'

# mc alias 등록
mc alias set k8sminio https://127.0.0.1:30002 minio minio123 --insecure
mc alias list
mc admin info k8sminio --insecure

 

 

MinIO cli 를 이용한 버킷 생성

 

mc mb k8sminio/mybucket --insecure
mc ls k8sminio --insecure

 

 

3.5. 파일 업로드 후 MinIO 데이터 분산 저장 확인

 

버킷에 파일을 업로드 후 각 K8S 노드에 기본 툴을 설치합니다.

 

#
for node in worker worker2 worker3 worker4; do echo "node : myk8s-$node" ; docker exec -it myk8s-$node sh -c 'apt update && apt install tree -y'; echo; done

#
kubectl describe 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

 

 

각각의 디렉토리에 파일이 쪼개어져 저장되어 있는 것을 알 수 있습니다.



 

4. MinIO IAM

 

MinIO 도 AWS S3 와 마찬가지로 클라이언트 작업에 대해서 인증과 인가를 모두 수행하도록 요구할 수 있습니다.

 

 

Authentication (인증)

 

- 연결된 클라이언트 신원을 확인하는 프로세스
- 클라이언트가 AWS SigV4 프로토콜을 사용하여 인증하도록 요구
- 클라이언트는 PUT, GET, DELETE 작업과 같은 S3 또는 MinIO API 에 접근하기 위한 Access Key 와 Secret Key 를 제출

 

Authorization (인가)

 

- 인증된 클라이언트가 배포된 작업과 자원에 수행할 수 있는 것을 제한
- 정책 기반 접근 제어 (PBAC) 을 사용하며, 각 정책은 사용자 또는 사용자 그룹의 권한을 설명하는 하나 이상의 규칙을 정의
- MinIO 는 S3 특정 작업(action) 및 조건(condition) 을 지원
- 기본적으로 MinIO 는 사용자가 할당받거나 상속받은 정책에 명시적으로 참조되지 않은 작업이나 자원에 대한 접근을 거부

 

ID 식별

 

- 내부 및 외부 ID 관리 모두 지원
- 인증 후, 작업 수행 권한 여부에 따라 클라이언트 요청 허용 또는 거부

- 지원되는 IDP 목록: OpenID, MinIO Authentication Plugin, AD/LDAP, Access Management Plugin

 

 

4.1. 사용자 관리

 

MinIO 사용자는 고유한 액세스키와 비밀키로 구성
클라이언트는 기존 MinIO 사용자의 유효한 액세스키와 비밀키를 모두 지정하여 신원을 인증

 

각 사용자는 해당 사용자가 액세스할 수 있는 작업과 리고스를 명시적으로 나열하는 하나 이상의 정책을 할당
그룹의 정책 상속 가능

 

명시적으로 허용되지 않은 모든 작업 또는 리소스에 대한 액세스는 거부

 

 

4.2. 웹 콘솔에서 사용자 생성 및 관리

 

웹 콘솔 -> Identity -> Users -> Create User

 

 

생성할 유저 정보 입력

 

- Username: viewuser
- Password: viewpasswd
- Policy: readonly

 

 

생성한 유저로 로그인한 후 버킷 조회 시도

 

s3:ListBucket 권한이 없어 조회가 실패하는 것을 확인할 수 있습니다.

 

 

 

4.3. 사용자 권한 수정

 

웹 콘솔에서 viewuser 를 위한 s3:ListBucket 정책을 부여해주도록 하겠습니다.

 

웹 콘솔 -> Policies -> Create Policy

 

 

신규 정책 정보 기입

 

- Policy Name: ViewBucket

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "MinIOReadAccess",
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::*"
            ]
        }
    ]
}

 

 

만약 신규 정책을 생성하지 않고, 기존 정책을 수정하려면 정책 선택 후 Raw Policy 를 수정하시면 됩니다.

 

 

유저 권한 편집

 

 

권한 변경된 유저로 버킷 확인

 

 

 

4.4. 사용자 액세스키 발급 및 사용

 

viewuser 액세스키 발급

 

- 웹콘솔 -> Access Kyes -> Create Access Key

 

 

테스트인 관계로 만료기간은 설정하지 않았습니다.
생성된 AccessKey 와 Secret Key 는 다운로드 혹은 잘 저장해둡니다.

 

 

MinIO CLI Alias 등록

 

# Alias 등록
mc alias set k8sviewuser https://127.0.0.1:30002 <ACCESS_KEY> <SECRET_KEY> --insecure

 

 

등록한 유저 액세스키를 사용

 

# 신규 파일 생성
echo -e "HelloWorld" >> helloworld.txt

# 객체 쓰기
mc cp ./helloworld.txt k8sviewuser/mybucket/helloword.txt --insecure

# 객체 조회
mc ls k8sviewuser/mybucket/helloword.txt --insecure

 

 

MinIO 콘솔에서도 확인

 

 


 

이번 글에서는 실제 MinIO 를 배포해보고 동작 방식을 확인해봤습니다.
동작 자체가 너무 AWS S3 와 똑같아서 UI 만 다른 S3 를 다루는 느낌이라 색다르게 재밌었던 것 같습니다.

Contents

포스팅 주소를 복사했습니다