Data Engineering/s3 minio

EP04 [ MinIO S3 + Cilium 기초 과정 ] MinIO 기본 설치 및 관리 #1 | MinIO 개념 이해하기 - 엔지니어가 알아야 할 S3 호환 스토리지의 핵심

ygtoken 2025. 3. 28. 10:46
728x90

이 글에서는 MinIO의 기본 개념과 특징을 살펴보고, 쿠버네티스 환경에서 MinIO를 활용하는 방법에 대한 기초 지식을 다룹니다. S3 호환 오브젝트 스토리지란 무엇인지, MinIO가 어떤 장점을 제공하는지, 그리고 왜 쿠버네티스와 함께 사용하면 더욱 효과적인지에 대해 알아보겠습니다.


📌 MinIO란 무엇인가?

✅ MinIO의 정의와 역할

MinIO는 고성능의 분산형 오브젝트 스토리지 시스템으로, Amazon S3(Simple Storage Service) API와 완벽하게 호환됩니다. 클라우드 네이티브 애플리케이션과 컨테이너화된 환경을 위해 특별히 설계되었으며, 쿠버네티스와 같은 오케스트레이션 플랫폼에서 원활하게 동작합니다.

▶️ 주요 특징:

  • Amazon S3 API와 100% 호환
  • 고성능 (단일 노드에서 초당 수 GB의 처리량)
  • 경량 설계 (단일 바이너리로 약 100MB)
  • 클라우드 네이티브 아키텍처
  • 강력한 보안 기능 (암호화, IAM 등)
  • 오픈 소스 (GNU AGPL v3)

 

minIO 아키텍처

 

✅ 오브젝트 스토리지의 개념

오브젝트 스토리지는 전통적인 파일 시스템이나 블록 스토리지와는 다른 방식으로 데이터를 저장합니다. 이를 이해하는 것이 MinIO 활용의 기초가 됩니다.

 

▶️ 오브젝트 스토리지 vs 다른 스토리지 유형:

특성 파일 스토리지 블록 스토리지 오브젝트 스토리지
데이터 구조 계층적 디렉토리 블록 단위 평면적 구조의 오브젝트
메타데이터 제한적 매우 제한적 풍부한 사용자 정의 메타데이터
확장성 제한적 중간 매우 높음 (페타바이트 이상)
성능 높음 (소규모) 매우 높음 중간 (대규모 데이터에 최적화)
사용 사례 일반 파일 공유 데이터베이스, VM 백업, 아카이브, 웹 콘텐츠

 

▶️ 오브젝트 스토리지 기본 구성 요소:

  • 오브젝트: 데이터 + 메타데이터 + 고유 식별자(UUID)
  • 버킷: 오브젝트들을 담는 최상위 컨테이너
  • API: 데이터 접근 및 관리를 위한 RESTful 인터페이스
# 오브젝트 스토리지 구조 예시
bucket/
  ├── object1 (데이터 + 메타데이터)
  ├── object2 (데이터 + 메타데이터)
  └── prefix/
      ├── object3 (데이터 + 메타데이터)
      └── object4 (데이터 + 메타데이터)

✅ S3 호환성이란?

Amazon S3는 업계 표준이 된 오브젝트 스토리지 서비스로, 그 API는 사실상의 표준(de facto standard)이 되었습니다. MinIO는 이 S3 API를 완벽하게 구현하여 호환성을 제공합니다.

 

▶️ S3 호환성의 의미:

  • S3를 지원하는 모든 애플리케이션이 MinIO와 함께 작동 가능
  • AWS SDK, 도구, 라이브러리를 그대로 사용 가능
  • AWS S3에서 MinIO로, 또는 그 반대로 쉽게 마이그레이션 가능
  • 멀티 클라우드 전략 및 클라우드 이식성 지원

▶️ 주요 S3 API 기능:

  • 버킷 생성, 삭제, 나열
  • 오브젝트 업로드, 다운로드, 삭제, 리스팅
  • 멀티파트 업로드
  • 버킷 정책 및 ACL
  • 버전 관리
  • 수명 주기 관리
  • 암호화
  • 이벤트 알림

S3 호환성 개념과 MinIO가 지원하는 주요 S3 API 기능 다이어그램


📌 MinIO 아키텍처 이해하기

✅ MinIO의 핵심 컴포넌트

MinIO의 아키텍처를 이해하는 것은 효과적인 배포와 운영을 위해 중요합니다.

▶️ 주요 컴포넌트:

  • MinIO 서버: 오브젝트 스토리지 기능을 제공하는 핵심 컴포넌트
  • MinIO 클라이언트(mc): 명령줄에서 MinIO 서버와 상호작용하는 도구
  • MinIO 콘솔: 웹 기반 GUI 관리 인터페이스
  • MinIO SDK: 다양한 프로그래밍 언어를 위한 라이브러리

▶️ MinIO 서버 모드:

  • 단일 노드 모드: 개발 및 테스트 환경에 적합
  • 분산 모드: 고가용성과 확장성을 위한 다중 노드 설정
# 단일 노드 모드 실행 예시
minio server /data

# 분산 모드 실행 예시 
minio server http://minio{1...4}/data{1...4}

✅ 이라즈 코딩(Erasure Coding)

MinIO는 데이터 내구성을 위해 이라즈 코딩 기술을 사용합니다. 이는 데이터 중복성과 복구 기능을 제공합니다.

▶️ 이라즈 코딩의 작동 방식:

  • 데이터를 여러 조각(shards)으로 나눔
  • 원본 조각(data shards)과 패리티 조각(parity shards)을 생성
  • 일부 조각이 손실되어도 나머지 조각으로 데이터 복구 가능
# 이라즈 코딩 예시 (4+2 구성)
원본 데이터: [A][B][C][D]
패리티 데이터: [P1][P2]

- 원본 조각 중 최대 2개가 손실되어도 복구 가능
- 스토리지 효율성: (4+2)/4 = 1.5x (RAID의 2x 또는 3x보다 효율적)

▶️ 이라즈 코딩의 장점:

  • RAID보다 높은 스토리지 효율성
  • 하드웨어 장애에 대한 강한 내구성
  • 더 빠른 데이터 복구 시간

이라즈 코딩의 데이터 분할 및 복구 과정 다이어그램

✅ 버킷과 객체 관리

MinIO에서 데이터를 구성하는 방식을 이해하는 것이 중요합니다.

▶️ 버킷 (Bucket):

  • 오브젝트를 저장하는 최상위 컨테이너
  • AWS S3와 동일한 버킷 명명 규칙을 따름
    • 3-63자 길이
    • 소문자, 숫자, 점, 하이픈만 허용
    • IP 주소 형식이 아님
    • 점으로 시작하거나 끝나지 않음

▶️ 오브젝트 (Object):

  • 파일 데이터와 메타데이터의 조합
  • 크기 제한 없음 (사실상 5TB까지 권장)
  • 변경 불가능(immutable) - 덮어쓰기는 가능하지만 수정은 불가능
  • 계층구조가 없음 (폴더는 단지 오브젝트 이름의 접두사로 시뮬레이션됨)

▶️ 메타데이터:

  • 시스템 메타데이터: 크기, 생성일, 콘텐츠 타입 등
  • 사용자 정의 메타데이터: 커스텀 키-값 페어
# MinIO 클라이언트(mc)를 사용한 버킷 및 오브젝트 관리 예시

# MinIO 서버 설정
mc alias set myminio http://localhost:9000 minioadmin minioadmin

# 버킷 생성
mc mb myminio/mybucket

# 오브젝트 업로드
mc cp myfile.txt myminio/mybucket/

# 오브젝트 나열
mc ls myminio/mybucket/

# 메타데이터 설정
mc cp --attr "Content-Type=application/json" myfile.json myminio/mybucket/

📌 쿠버네티스에서 MinIO의 활용 가치

✅ 클라우드 네이티브 스토리지의 필요성

쿠버네티스 환경에서 영구 스토리지를 관리하는 것은 중요한 과제입니다. MinIO는 이러한 환경에 최적화된 솔루션을 제공합니다.

▶️ 쿠버네티스 환경에서의 스토리지 과제:

  • Pod는 임시적이며 언제든 재시작될 수 있음
  • 스테이트풀 워크로드를 위한 영구 스토리지 필요
  • 클라우드 환경과 온프레미스 환경 간의 일관성
  • 확장성과 성능 요구사항

▶️ MinIO가 해결하는 문제:

  • S3 호환 API로 클라우드 이식성 제공
  • 컨테이너화된 환경에 최적화된 설계
  • StatefulSet으로 쉽게 배포 가능
  • 쿠버네티스 PV/PVC와 원활하게 통합

✅ 쿠버네티스와 MinIO 통합 시나리오

MinIO는 쿠버네티스 환경에서 다양한 방식으로 활용될 수 있습니다.

▶️ 주요 활용 사례:

  • 백업 및 복구 솔루션
  • 머신러닝/AI 파이프라인을 위한 데이터 레이크
  • 로그 및 메트릭 장기 저장
  • 미디어 및 콘텐츠 저장소
  • 기존 애플리케이션의 클라우드 마이그레이션
  • CI/CD 파이프라인 아티팩트 스토리지

▶️ 쿠버네티스 배포 옵션:

  • StatefulSet을 사용한 단일 인스턴스 모드
  • StatefulSet을 사용한 분산 모드
  • Operator를 통한 관리
  • Helm 차트를 사용한 배포
# 기본적인 MinIO StatefulSet 예시 (단일 인스턴스 모드)
apiVersion: apps/v1           # apps 그룹의 v1 API 버전 사용 (StatefulSet이 이 API 그룹에 속함)
kind: StatefulSet             # 상태를 유지하는 워크로드를 위한 StatefulSet 리소스 정의
metadata:
  name: minio                 # StatefulSet의 이름을 'minio'로 지정
  namespace: default          # 'default' 네임스페이스에 배포 (필요에 따라 변경 가능)
spec:
  serviceName: minio-headless # StatefulSet과 연결된 헤드리스 서비스 이름 (Pod 개별 접근용)
  replicas: 1                 # 단일 인스턴스 모드에서는 복제본 수가 1
  selector:
    matchLabels:
      app: minio              # 이 라벨을 가진 Pod를 StatefulSet이 관리하도록 지정
  template:
    metadata:
      labels:
        app: minio            # 생성될 Pod에 적용될 라벨 (selector.matchLabels와 일치해야 함)
    spec:
      containers:
# 기본적인 MinIO StatefulSet 예시 (단일 인스턴스 모드) (계속)
     - name: minio             # 컨테이너 이름을 'minio'로 지정
       image: minio/minio:RELEASE.2023-11-15T20-43-25Z  # 안정적인 MinIO 공식 이미지 버전
       args:
       - server                # MinIO 서버 모드로 실행
       - /data                 # 데이터를 저장할 디렉토리 경로 지정
       ports:
       - containerPort: 9000   # MinIO API 엔드포인트용 포트
         name: api             # 포트 이름 지정 (Service 연결 시 참조)
       - containerPort: 9001   # MinIO 웹 콘솔용 포트
         name: console         # 콘솔 포트 이름
       env:
       - name: MINIO_ROOT_USER     # MinIO 관리자 계정 환경 변수
         value: "minioadmin"       # 기본 관리자 이름 (실제 환경에서는 Secret 사용 권장)
       - name: MINIO_ROOT_PASSWORD # MinIO 관리자 비밀번호 환경 변수
         value: "minioadmin"       # 기본 비밀번호 (실제 환경에서는 Secret 사용 권장)
       volumeMounts:
       - name: data            # 사용할 볼륨 이름 (아래 volumes 참조)
         mountPath: /data      # 컨테이너 내부에 볼륨을 마운트할 경로
 volumeClaimTemplates:         # StatefulSet의 각 Pod용 PVC 자동 생성 템플릿
 - metadata:
     name: data                # 생성될 PVC 이름 (volumeMounts.name과 일치)
   spec:
     accessModes: [ "ReadWriteOnce" ]  # 하나의 노드에서만 읽기/쓰기 접근 가능
     resources:
       requests:
         storage: 10Gi         # 요청할 스토리지 용량 (환경에 맞게 조정)

 

 

쿠버네티스에서 MinIO 배포 구조 다이어그램

✅ Cilium과의 연동

MinIO를 쿠버네티스에 배포할 때 Cilium 네트워크 정책을 함께 사용하면 더욱 강력한 보안 환경을 구축할 수 있습니다.

 

▶️ Cilium을 통한 MinIO 보안 강화:

  • 네트워크 수준에서 MinIO 접근 제어
  • L7 정책을 통한 S3 API 호출 필터링
  • 특정 버킷 또는 작업에 대한 세밀한 접근 제어
  • 쿠버네티스 네임스페이스 간 통신 규제
  • 악성 트래픽으로부터 보호
# Cilium 네트워크 정책 예시 - MinIO API 접근 제어
apiVersion: cilium.io/v2       # Cilium의 API 버전 지정
kind: CiliumNetworkPolicy      # Cilium 네트워크 정책 리소스 정의
metadata:
  name: minio-policy           # 네트워크 정책 이름
  namespace: default           # 정책이 적용될 네임스페이스
spec:
  endpointSelector:            # 정책을 적용할 대상 Pod 선택
    matchLabels:
      app: minio               # MinIO Pod를 대상으로 지정
  ingress:                     # 수신 트래픽 규칙
  - fromEndpoints:             # 어떤 출발지로부터의 트래픽을 허용할지 지정
    - matchLabels:
        app: backend           # 'app: backend' 라벨이 있는 Pod의 트래픽만 허용
    toPorts:                   # 허용할 포트 규칙
    - ports:                   # 포트 목록
      - port: "9000"           # MinIO API 포트 (9000) 허용
        protocol: TCP          # TCP 프로토콜 사용

📌 MinIO 시작하기

✅ 간단한 MinIO 배포하기

실제로 쿠버네티스 환경에서 MinIO를 시작하는 가장 기본적인 방법을 알아보겠습니다.

▶️ 필요한 쿠버네티스 리소스:

  • Secret: MinIO 계정 자격 증명 저장
  • PersistentVolumeClaim: 데이터 저장소
  • StatefulSet: MinIO 서버 실행
  • Service: MinIO API 및 콘솔 접근

다음은 MinIO 배포를 위한 통합 YAML 예제입니다:

# minio-deploy.yaml
---
# MinIO 자격 증명을 위한 Secret
apiVersion: v1                 # 핵심 쿠버네티스 API 그룹의 v1 버전 사용
kind: Secret                   # 민감한 정보를 저장하기 위한 Secret 리소스 정의
metadata:
  name: minio-creds            # Secret 이름 지정
  namespace: default           # 배포할 네임스페이스 (필요에 따라 변경 가능)
type: Opaque                   # Opaque 타입: 일반적인 키-값 쌍 저장에 사용
data:
  # base64로 인코딩된 'minioadmin'
  root-user: bWluaW9hZG1pbg==      # MinIO 관리자 사용자명 (base64 인코딩됨)
  root-password: bWluaW9hZG1pbg==  # MinIO 관리자 비밀번호 (base64 인코딩됨)
---
# MinIO 서비스 (API 용)
apiVersion: v1                 # 핵심 쿠버네티스 API 그룹의 v1 버전 사용
kind: Service                  # 네트워크 서비스를 정의하는 Service 리소스
metadata:
  name: minio-service          # 서비스 이름 지정
  namespace: default           # 배포할 네임스페이스
  labels:
    app: minio                 # 서비스 식별 라벨
spec:
  selector:
    app: minio                 # 이 라벨을 가진 Pod로 트래픽 전달
  ports:
  - port: 9000                 # 서비스가 노출하는 포트
    targetPort: 9000           # Pod 내에서 대상이 되는 포트
    name: api                  # 포트 이름 (다중 포트 서비스에서 식별용)
  type: ClusterIP              # 클러스터 내부에서만 접근 가능한 서비스 타입
---
# MinIO 서비스 (콘솔 용)
apiVersion: v1                 # 핵심 쿠버네티스 API 그룹의 v1 버전 사용
kind: Service                  # 네트워크 서비스 리소스 정의
metadata:
  name: minio-console          # 콘솔용 서비스 이름 지정
  namespace: default           # 배포할 네임스페이스
  labels:
    app: minio                 # 서비스 식별 라벨
spec:
  selector:
    app: minio                 # 이 라벨을 가진 Pod로 트래픽 전달
  ports:
  - port: 9001                 # 서비스가 노출하는 포트
    targetPort: 9001           # Pod 내에서 대상이 되는 포트
    name: console              # 포트 이름
  type: NodePort               # 노드의 IP를 통해 외부에서 접근 가능한 서비스 타입
---
# MinIO StatefulSet
apiVersion: apps/v1            # apps API 그룹의 v1 버전 사용
kind: StatefulSet              # 상태 유지가 필요한 워크로드를 위한 StatefulSet 정의
metadata:
  name: minio                  # StatefulSet 이름
  namespace: default           # 배포할 네임스페이스
spec:
  serviceName: minio-service   # StatefulSet과 연결된 서비스 이름
  replicas: 1                  # 실행할 Pod 복제본 수 (단일 인스턴스 모드)
  selector:
    matchLabels:
      app: minio               # 이 라벨을 가진 Pod를 관리
  template:
    metadata:
      labels:
        app: minio             # Pod에 적용할 라벨
    spec:
      containers:
      - name: minio            # 컨테이너 이름
        image: minio/minio:RELEASE.2023-11-15T20-43-25Z  # MinIO 이미지 버전
        args:
        - server               # 서버 모드로 실행
        - /data                # 데이터 저장 경로
        env:
        - name: MINIO_ROOT_USER
          valueFrom:           # Secret에서 값을 참조
            secretKeyRef:      # 참조할 Secret 정보
              name: minio-creds   # Secret 이름
              key: root-user      # Secret 내 키 이름
        - name: MINIO_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: minio-creds
              key: root-password
        ports:
        - containerPort: 9000  # MinIO API 포트
          name: api
        - containerPort: 9001  # MinIO 콘솔 포트
          name: console
        volumeMounts:
        - name: data           # 마운트할 볼륨 이름
          mountPath: /data     # 컨테이너 내부 마운트 경로
        readinessProbe:        # Pod가 요청을 처리할 준비가 되었는지 확인하는 프로브
          httpGet:             # HTTP GET 요청으로 확인
            path: /minio/health/ready  # 헬스 체크 엔드포인트
            port: 9000         # 헬스 체크를 수행할 포트
          initialDelaySeconds: 10  # 컨테이너 시작 후 프로브 시작까지 대기 시간
          periodSeconds: 10    # 프로브 실행 간격
        livenessProbe:         # Pod가 살아있는지 확인하는 프로브
          httpGet:
            path: /minio/health/live
            port: 9000
          initialDelaySeconds: 120  # MinIO 시작에 시간이 필요하므로 더 긴 대기 시간 설정
          periodSeconds: 20    # 프로브 실행 간격
  volumeClaimTemplates:        # StatefulSet용 PVC 템플릿
  - metadata:
      name: data               # 볼륨 클레임 이름
    spec:
      accessModes: [ "ReadWriteOnce" ]  # 단일 노드 접근 모드
      resources:
        requests:
          storage: 10Gi        # 요청할 스토리지 크기

이 YAML 파일을 적용하려면:

# MinIO 배포 적용
kubectl apply -f minio-deploy.yaml

# 배포 상태 확인
kubectl get all -l app=minio

# MinIO 콘솔 접근 (NodePort 서비스 포트 확인)
kubectl get svc minio-console

# 예시 출력: minio-console   NodePort   10.96.x.y   <none>   9001:30091/TCP   10m
# 브라우저에서 접속: http://localhost:30091 (포트 번호는 실제 할당된 번호 사용)

✅ MinIO 클라이언트(mc) 설정

MinIO를 관리하기 위한 mc 명령줄 클라이언트 설정 방법입니다.

# MinIO 클라이언트 설치 (MacOS 예시)
brew install minio/stable/mc

# MinIO 클라이언트 설치 (Linux 예시)
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/

# MinIO 서버 alias 설정
# 쿠버네티스 포트 포워딩으로 접근
kubectl port-forward svc/minio-service 9000:9000 &

# alias 설정
mc alias set myminio http://localhost:9000 minioadmin minioadmin

# MinIO 서버 정보 확인
mc admin info myminio

✅ 기본 작업 수행

MinIO 클라이언트(mc)를 사용한 기본 작업 방법을 살펴보겠습니다.

# 버킷 생성
mc mb myminio/test-bucket

# 파일 업로드
mc cp myfile.txt myminio/test-bucket/

# 디렉토리 업로드 (재귀적)
mc cp --recursive mydirectory/ myminio/test-bucket/

# 버킷 내용 나열
mc ls myminio/test-bucket/

# 파일 다운로드
mc cp myminio/test-bucket/myfile.txt myfile_downloaded.txt

# 파일 삭제
mc rm myminio/test-bucket/myfile.txt

# 버킷 삭제 (빈 버킷만 가능)
mc rb myminio/test-bucket

# 버킷과 모든 내용 강제 삭제
mc rb --force myminio/test-bucket

📌 Summary

MinIO에 대한 기본 개념과 쿠버네티스에서의 활용에 대해 살펴보았습니다:

  • MinIO는 S3 호환 API를 제공하는 고성능 오브젝트 스토리지 시스템입니다
  • 오브젝트 스토리지는 버킷과 객체로 구성되며, 풍부한 메타데이터와 높은 확장성을 제공합니다
  • 이라즈 코딩 기술로 데이터 내구성과 스토리지 효율성을 동시에 확보합니다
  • StatefulSet을 사용하여 쿠버네티스에 쉽게 배포할 수 있습니다
  • MinIO는 백업, 로그 저장, 데이터 레이크 등 다양한 용도로 활용 가능합니다
  • Cilium 네트워크 정책과 함께 사용하면 세밀한 접근 제어와 보안 강화가 가능합니다
  • MinIO 클라이언트(mc)를 통해 명령줄에서 간편하게 관리할 수 있습니다
728x90