Data Engineering/s3 minio

EP02 [ MinIO S3 + Cilium 기초 과정 ] 쿠버네티스 기초 개념 #2 | 쿠버네티스 핵심 리소스 활용법 - Pod, Service, Deployment

ygtoken 2025. 3. 27. 00:43
728x90

이 글에서는 쿠버네티스의 핵심 리소스인 Pod, Service, Deployment에 대해 자세히 살펴봅니다. MinIO와 Cilium 환경 구축의 기반이 되는 이 리소스들의 개념, 특성, 그리고 효과적인 활용 방법을 실제 예제와 함께 상세히 알아보겠습니다.


📌 Pod: 쿠버네티스의 기본 배포 단위

✅ Pod의 기본 개념과 특성

Pod는 쿠버네티스에서 가장 작은 배포 단위로, 하나 이상의 컨테이너를 포함하는 그룹입니다. 대부분의 경우 하나의 Pod에는 하나의 컨테이너가 포함되지만, 밀접하게 관련된 여러 컨테이너가 함께 동작해야 하는 경우 하나의 Pod에 여러 컨테이너를 포함할 수 있습니다.

▶️ Pod의 주요 특성:

  • Pod 내 컨테이너들은 항상 같은 노드에서 실행됨
  • 동일한 네트워크 네임스페이스를 공유 (localhost로 서로 통신 가능)
  • 동일한 스토리지 볼륨을 공유 가능
  • Pod가 종료되면 재생성되더라도 새로운 IP 주소를 할당받음

[Pod의 기본 구조와 다중 컨테이너 구성을 보여주는 다이어그램]

✅ Pod의 활용법

기본적인 MinIO Pod를 생성하는 YAML 예제:

# minio-pod.yaml
apiVersion: v1                   # Kubernetes API 버전 지정
kind: Pod                        # 리소스 종류: Pod 정의
metadata:                        # Pod의 메타데이터 섹션 시작
  name: minio-single             # Pod의 고유 이름 지정
  labels:                        # Pod에 적용할 라벨 정의 시작
    app: minio                   # 애플리케이션 식별 라벨
    tier: storage                # 시스템 계층 구분 라벨
spec:                            # Pod 스펙 정의 시작
  containers:                    # Pod 내 컨테이너 목록 시작
  - name: minio                  # 컨테이너 이름 지정
    image: minio/minio:RELEASE.2023-10-16T04-13-43Z  # 사용할 MinIO 이미지와 태그
    args:                        # 컨테이너 실행 시 전달할 명령줄 인자
    - server                     # MinIO를 서버 모드로 실행
    - /data                      # 데이터 저장 위치 지정
    ports:                       # 컨테이너가 노출하는 포트 목록
    - containerPort: 9000        # S3 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           # 컨테이너 내 마운트 경로
  volumes:                       # Pod 레벨에서 정의된 볼륨 목록
  - name: data                   # 볼륨 이름(volumeMounts에서 참조됨)
    emptyDir: {}                 # 임시 스토리지 타입(Pod 삭제 시 데이터 손실)

Pod를 생성하고 관리하는 기본 kubectl 명령어:

# Pod 생성
kubectl apply -f minio-pod.yaml  # YAML 파일에 정의된 리소스 생성

# Pod 상태 확인
kubectl get pod minio-single     # 특정 Pod의 상태 조회

# Pod 세부 정보 확인
kubectl describe pod minio-single  # Pod의 상세 정보 및 이벤트 확인

# Pod 로그 확인
kubectl logs minio-single        # Pod의 로그 출력(문제 해결 시 유용)

# Pod 내부 접속
kubectl exec -it minio-single -- /bin/sh  # Pod 내부 쉘에 대화형으로 접속

# Pod 삭제
kubectl delete pod minio-single  # 해당 Pod 삭제(리소스 정리)

✅ 다중 컨테이너 Pod 패턴

자주 사용되는 다중 컨테이너 Pod 패턴:

▶️ 사이드카 패턴: 주 컨테이너를 보조하는 컨테이너 추가

# MinIO 로그 수집 사이드카 예제
apiVersion: v1                   # Kubernetes API 버전 지정
kind: Pod                        # 리소스 종류: Pod 정의
metadata:                        # Pod의 메타데이터 섹션
  name: minio-with-sidecar       # Pod 이름 지정
spec:                            # Pod 스펙 정의 시작
  containers:                    # Pod 내 컨테이너 목록 시작
  - name: minio                  # 메인 컨테이너(MinIO) 이름
    image: minio/minio:RELEASE.2023-10-16T04-13-43Z  # MinIO 이미지 지정
    args:                        # MinIO 서버 실행 인자
    - server                     # 서버 모드로 실행
    - /data                      # 데이터 디렉토리 지정
    volumeMounts:                # 볼륨 마운트 설정 시작
    - name: data                 # 데이터 볼륨 이름
      mountPath: /data           # 메인 데이터 저장 경로
    - name: logs                 # 로그 볼륨 이름
      mountPath: /var/log/minio  # MinIO 로그 저장 경로
  
  - name: log-collector          # 사이드카 컨테이너 이름(로그 수집기)
    image: fluent/fluent-bit:1.9 # 로그 수집 도구 이미지
    volumeMounts:                # 사이드카 볼륨 마운트
    - name: logs                 # 메인 컨테이너와 공유하는 로그 볼륨
      mountPath: /var/log/minio  # 동일한 로그 디렉토리에 마운트
    - name: config               # Fluent Bit 설정 볼륨
      mountPath: /fluent-bit/etc/ # 설정 파일 마운트 위치
  
  volumes:                       # Pod 레벨 볼륨 정의 시작
  - name: data                   # 데이터 볼륨 이름
    emptyDir: {}                 # 임시 볼륨(Pod 수명과 동일)
  - name: logs                   # 로그 볼륨 이름
    emptyDir: {}                 # 컨테이너 간 공유되는 임시 볼륨
  - name: config                 # 설정 볼륨 이름
    configMap:                   # ConfigMap 타입 볼륨
      name: fluentbit-config     # 사용할 ConfigMap 이름

▶️ 앰배서더 패턴: 외부 서비스에 대한 프록시 역할을 하는 컨테이너 추가 ▶️ 어댑터 패턴: 메인 컨테이너의 출력을 표준화하는 컨테이너 추가

[다양한 다중 컨테이너 Pod 패턴을 보여주는 다이어그램]


📌 Service: 안정적인 네트워크 접근점

✅ Service의 기본 개념과 종류

Service는 Pod 그룹에 대한 네트워크 접근 정책을 정의하는 리소스입니다. Pod는 생성, 삭제될 때마다 IP가 변경되기 때문에, Service를 통해 안정적인 네트워크 엔드포인트를 제공합니다.

▶️ 주요 Service 유형:

  • ClusterIP: 클러스터 내부에서만 접근 가능한 서비스 (기본값)
  • NodePort: 모든 노드의 특정 포트에서 접근 가능
  • LoadBalancer: 클라우드 제공업체의 로드 밸런서를 통해 외부에서 접근 가능
  • ExternalName: 외부 서비스에 대한 CNAME 레코드 생성
  • Headless Service: 클러스터 DNS를 통해 Pod IP를 직접 제공 (StatefulSet에서 중요)

✅ Service의 활용법

MinIO를 위한 다양한 Service 구성 예제:

▶️ ClusterIP Service (기본 내부 서비스):

# minio-clusterip-service.yaml
apiVersion: v1                   # Kubernetes API 버전 지정
kind: Service                    # 리소스 종류: Service 정의
metadata:                        # 서비스 메타데이터 섹션
  name: minio-service            # 서비스 이름
  labels:                        # 서비스 식별 라벨
    app: minio                   # 애플리케이션 라벨
spec:                            # 서비스 스펙 정의 시작
  type: ClusterIP                # 서비스 타입: 클러스터 내부에서만 접근 가능
  ports:                         # 서비스 포트 정의 시작
  - port: 9000                   # 서비스가 노출하는 포트
    targetPort: api              # 대상 Pod의 포트 이름(Pod 정의 참조)
    protocol: TCP                # 사용할 프로토콜
    name: api                    # 이 포트의 이름
  - port: 9001                   # 콘솔용 서비스 포트
    targetPort: console          # 대상 Pod의 콘솔 포트 이름
    protocol: TCP                # 프로토콜
    name: console                # 포트 이름
  selector:                      # Pod 선택 라벨 시작
    app: minio                   # 이 라벨을 가진 Pod로 트래픽 전달

▶️ NodePort Service (개발 및 테스트용):

# minio-nodeport-service.yaml
apiVersion: v1                   # Kubernetes API 버전 지정
kind: Service                    # 리소스 종류: Service
metadata:                        # 서비스 메타데이터
  name: minio-nodeport           # 서비스 이름
spec:                            # 서비스 스펙 정의
  type: NodePort                 # 서비스 타입: 모든 노드의 특정 포트로 접근 가능
  ports:                         # 포트 정의 시작
  - port: 9000                   # 클러스터 내부 서비스 포트
    targetPort: api              # 대상 Pod 포트 이름
    nodePort: 30900              # 노드에서 외부로 노출될 포트(30000-32767 범위)
    name: api                    # 포트 이름
  - port: 9001                   # 콘솔용 내부 서비스 포트
    targetPort: console          # 대상 Pod의 콘솔 포트
    nodePort: 30901              # 콘솔용 노드포트
    name: console                # 포트 이름
  selector:                      # Pod 선택 라벨
    app: minio                   # 트래픽을 전달할 Pod 라벨

▶️ LoadBalancer Service (프로덕션 환경용):

# minio-loadbalancer-service.yaml
apiVersion: v1                   # Kubernetes API 버전 지정
kind: Service                    # 리소스 종류: Service
metadata:                        # 메타데이터 섹션
  name: minio-lb                 # 서비스 이름
  annotations:                   # 서비스 어노테이션 시작
    # 클라우드 제공자별 로드밸런서 설정(AWS 예시)
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb"  # Network Load Balancer 타입 지정
    service.beta.kubernetes.io/aws-load-balancer-internal: "false"  # 외부 접근 가능 설정
spec:                            # 서비스 스펙 정의
  type: LoadBalancer             # 서비스 타입: 클라우드 로드밸런서 자동 프로비저닝
  ports:                         # 포트 정의
  - port: 9000                   # 로드밸런서가 외부에 노출하는 포트
    targetPort: api              # 대상 Pod의 포트 이름
    name: api                    # 이 포트의 이름
  - port: 9001                   # 콘솔용 로드밸런서 포트
    targetPort: console          # 대상 Pod의 콘솔 포트
    name: console                # 포트 이름
  selector:                      # Pod 선택 라벨
    app: minio                   # 트래픽을 라우팅할 Pod 라벨

 

▶️ Headless Service (StatefulSet용 중요):

# minio-headless-service.yaml
apiVersion: v1                   # Kubernetes API 버전 지정
kind: Service                    # 리소스 종류: Service
metadata:                        # 메타데이터 섹션
  name: minio-headless           # 서비스 이름
spec:                            # 서비스 스펙 정의
  clusterIP: None                # Headless Service 핵심 설정: IP 할당하지 않음
                                 # Pod IP에 직접 DNS 레코드 생성
  ports:                         # 포트 정의
  - port: 9000                   # 서비스 포트
    targetPort: api              # 대상 Pod 포트 이름
    name: api                    # 이 포트의 이름
  - port: 9001                   # 콘솔용 서비스 포트
    targetPort: console          # 대상 Pod의 콘솔 포트
    name: console                # 포트 이름
  selector:                      # Pod 선택 라벨
    app: minio                   # 이 라벨을 가진 Pod 선택
  publishNotReadyAddresses: true # 준비되지 않은 Pod도 DNS에 등록
                                 # StatefulSet에서 중요한 설정

 

Service를 관리하는 기본 kubectl 명령어:

# Service 생성
kubectl apply -f minio-clusterip-service.yaml  # YAML 파일에서 서비스 생성

# Service 목록 확인
kubectl get services            # 모든 서비스 목록 조회
kubectl get svc                 # 축약형 명령어

# Service 세부 정보 확인
kubectl describe service minio-service  # 서비스 상세 정보 확인

# Service 엔드포인트 확인 (연결된 Pod IP 확인)
kubectl get endpoints minio-service     # 서비스가 연결된 실제 Pod IP 조회

# Service를 통한 Pod 접근 테스트
kubectl run -it --rm debug --image=busybox -- wget -qO- http://minio-service:9000/minio/health/live
# 임시 Pod를 생성하여 서비스 연결성 테스트

# Service 삭제
kubectl delete service minio-service    # 서비스 삭제

 


📌 Deployment: 선언적 Pod 관리

✅ Deployment의 기본 개념과 특성

Deployment는 Pod와 ReplicaSet에 대한 선언적 업데이트를 제공합니다. Deployment를 사용하면 Pod의 원하는 상태를 정의하고, 쿠버네티스가 실제 상태를 원하는 상태로 변경하도록 할 수 있습니다.

▶️ Deployment의 주요 기능:

  • Pod의 선언적 업데이트 및 롤백
  • 스케일링 (복제본 수 조정)
  • 롤링 업데이트 (무중단 배포)
  • 배포 이력 관리

▶️ Deployment vs 직접 Pod 관리:

  • Pod가 실패하면 Deployment가 자동으로 새 Pod 생성
  • Pod의 상태를 지속적으로 모니터링
  • 인프라 변경 없이 애플리케이션 업데이트 가능

✅ Deployment의 활용법

MinIO를 위한 기본 Deployment 설정:

# minio-deployment.yaml
apiVersion: apps/v1              # Kubernetes API 버전(apps 그룹)
kind: Deployment                 # 리소스 종류: Deployment
metadata:                        # 메타데이터 섹션
  name: minio-deployment         # Deployment 이름
  labels:                        # 식별 라벨
    app: minio                   # 애플리케이션 라벨
spec:                            # Deployment 스펙 정의
  replicas: 2                    # 유지할 Pod 복제본 수
  selector:                      # Pod 선택자 정의
    matchLabels:                 # 라벨 매칭 조건
      app: minio                 # 관리할 Pod의 라벨
  strategy:                      # 업데이트 전략 정의
    type: RollingUpdate          # 업데이트 타입: 롤링 업데이트(점진적 교체)
    rollingUpdate:               # 롤링 업데이트 설정
      maxUnavailable: 1          # 업데이트 중 최대 사용 불가능 Pod 수
      maxSurge: 1                # 업데이트 중 설정된 복제본 수 대비 추가 생성 가능한 최대 Pod 수
  template:                      # Pod 템플릿 정의(새 Pod 생성 시 사용)
    metadata:                    # Pod 메타데이터
      labels:                    # Pod 라벨 설정
        app: minio               # Pod 라벨(selector와 일치해야 함)
    spec:                        # Pod 스펙 정의
      containers:                # 컨테이너 목록
      - name: minio              # 컨테이너 이름
        image: minio/minio:RELEASE.2023-10-16T04-13-43Z  # 사용할 이미지
        args:                    # 실행 인자
        - server                 # MinIO 서버 모드
        - /data                  # 데이터 디렉토리
        ports:                   # 포트 설정
        - containerPort: 9000    # API 포트
          name: api              # 포트 이름
        - containerPort: 9001    # 콘솔 포트
          name: console          # 포트 이름
        env:                     # 환경 변수 설정
        - name: MINIO_ROOT_USER  # 관리자 사용자명 환경 변수
          valueFrom:             # Secret에서 값 참조
            secretKeyRef:        # Secret 키 참조 방식
              name: minio-creds  # Secret 이름
              key: root-user     # Secret 내 키 이름
        - name: MINIO_ROOT_PASSWORD  # 관리자 비밀번호 환경 변수
          valueFrom:             # Secret에서 값 참조
            secretKeyRef:        # Secret 키 참조
              name: minio-creds  # Secret 이름
              key: root-password # Secret 내 키 이름
        resources:               # 리소스 요청 및 제한
          requests:              # 최소 요청 리소스
            memory: "256Mi"      # 요청 메모리
            cpu: "100m"          # 요청 CPU(0.1 코어)
          limits:                # 최대 제한 리소스
            memory: "512Mi"      # 최대 메모리
            cpu: "200m"          # 최대 CPU(0.2 코어)
        volumeMounts:            # 볼륨 마운트 설정
        - name: data             # 데이터 볼륨 이름
          mountPath: /data       # 마운트 경로
      volumes:                   # Pod 볼륨 정의
      - name: data               # 볼륨 이름
        persistentVolumeClaim:   # PVC 타입 볼륨
          claimName: minio-pvc   # 사용할 PVC 이름

Deployment 관리를 위한 kubectl 명령어:

# Deployment 생성
kubectl apply -f minio-deployment.yaml  # YAML 파일로 Deployment 생성

# Deployment 목록 확인
kubectl get deployments        # 모든 Deployment 조회
kubectl get deploy             # 축약형 명령어

# Deployment 세부 정보 확인
kubectl describe deployment minio-deployment  # 상세 정보 확인

# Deployment 확장(스케일 아웃)
kubectl scale deployment minio-deployment --replicas=3  # 복제본 수 변경

# Deployment 이미지 업데이트
kubectl set image deployment/minio-deployment minio=minio/minio:RELEASE.2023-11-20T22-40-59Z
# 컨테이너 이미지 변경(롤링 업데이트 시작)

# Deployment 롤백
kubectl rollout undo deployment/minio-deployment  # 이전 버전으로 롤백

# 특정 버전으로 롤백
kubectl rollout undo deployment/minio-deployment --to-revision=2  # 특정 리비전으로 롤백

# Deployment 이력 확인
kubectl rollout history deployment/minio-deployment  # 배포 이력 조회

# Deployment 상태 확인
kubectl rollout status deployment/minio-deployment  # 롤아웃 진행 상태 확인

✅ Deployment와 StatefulSet의 차이

MinIO를 운영할 때 Deployment와 StatefulSet 중 어떤 것을 선택해야 할까요?

▶️ Deployment 사용 사례 (MinIO 단일 인스턴스):

  • 스테이트리스 워크로드에 적합
  • 빠른 스케일링과 롤링 업데이트 지원
  • 포드 간 구별이 필요하지 않을 때
  • 간단한 스토리지 구성
# MinIO 단일 인스턴스 Deployment 예시
apiVersion: apps/v1              # Kubernetes API 버전
kind: Deployment                 # 리소스 종류: Deployment
metadata:                        # 메타데이터
  name: minio-single             # Deployment 이름
spec:                            # 스펙 정의
  replicas: 1                    # 복제본 수: 단일 인스턴스
  selector:                      # Pod 선택자
    matchLabels:                 # 라벨 매칭
      app: minio                 # Pod 식별 라벨
  template:                      # Pod 템플릿
    metadata:                    # Pod 메타데이터
      labels:                    # Pod 라벨
        app: minio               # 라벨 값
    spec:                        # Pod 스펙
      containers:                # 컨테이너 목록
      - name: minio              # 컨테이너 이름
        image: minio/minio:RELEASE.2023-10-16T04-13-43Z  # 이미지
        args:                    # 실행 인자
        - server                 # 단일 서버 모드
        - /data                  # 데이터 경로

▶️ StatefulSet 사용 사례 (MinIO 분산 모드):

  • 안정적인 네트워크 식별자 필요
  • 순차적 배포 및 확장이 필요
  • 각 Pod마다 고유한 상태를 유지해야 함
  • 각 인스턴스에 고유한 PV가 필요할 때
# MinIO 분산 모드를 위한 StatefulSet 예시
apiVersion: apps/v1              # Kubernetes API 버전
kind: StatefulSet                # 리소스 종류: StatefulSet
metadata:                        # 메타데이터
  name: minio                    # StatefulSet 이름
spec:                            # 스펙 정의
  serviceName: minio-headless    # 연관된 헤드리스 서비스 이름
  replicas: 4                    # 복제본 수: 분산 모드에서는 최소 4개 권장
  selector:                      # Pod 선택자
    matchLabels:                 # 라벨 매칭
      app: minio                 # Pod 식별 라벨
  template:                      # Pod 템플릿
    metadata:                    # Pod 메타데이터
      labels:                    # Pod 라벨
        app: minio               # 라벨 값
    spec:                        # Pod 스펙
      containers:                # 컨테이너 목록
      - name: minio              # 컨테이너 이름
        image: minio/minio:RELEASE.2023-10-16T04-13-43Z  # 이미지
        args:                    # 실행 인자
        - server                 # 서버 모드
        - http://minio-{0...3}.minio-headless.default.svc.cluster.local/data
        # 위 인자는 분산 모드 구성을 위한 것으로, 각 Pod의 DNS 이름을 지정

[Deployment 관리 워크플로우 및 StatefulSet과의 차이점을 보여주는 다이어그램]


📌 리소스 간 관계 및 통합 활용

✅ 리소스 간 연결 방법

Pod, Service, Deployment는 서로 유기적으로 연결되어 작동합니다:

▶️ Pod → Service: Service의 selector가 Pod의 라벨과 일치하면 연결됩니다. 이 연결을 통해 Service가 Pod로 트래픽을 라우팅합니다.

▶️ Deployment → Pod: Deployment는 Pod 템플릿을 기반으로 ReplicaSet을 생성하고, ReplicaSet이 실제 Pod를 생성 및 관리합니다.

▶️ Service → Deployment: 직접적인 연결은 없지만, Service의 selector가 Deployment가 관리하는 Pod의 라벨과 일치하면 서로 통합됩니다.

✅ MinIO를 위한 통합 구성 예시

다음은 MinIO를 위한 Deployment와 Service를 함께 사용하는 완전한 예제입니다:

# minio-complete.yaml
---
# Secret for MinIO credentials
apiVersion: v1                   # Kubernetes API 버전
kind: Secret                     # 리소스 종류: Secret(민감 정보 저장)
metadata:                        # 메타데이터
  name: minio-creds              # Secret 이름
type: Opaque                     # Secret 타입: 일반 민감 정보
data:                            # 데이터 섹션
  root-user: bWluaW9hZG1pbg==    # minioadmin (base64 인코딩됨)
  root-password: bWluaW9hZG1pbg==  # minioadmin (base64 인코딩됨)
---
# PVC for MinIO data
apiVersion: v1                   # Kubernetes API 버전
kind: PersistentVolumeClaim      # 리소스 종류: PVC(영구 볼륨 요청)
metadata:                        # 메타데이터
  name: minio-data               # PVC 이름
spec:                            # PVC 스펙 정의
  accessModes:                   # 접근 모드 설정
    - ReadWriteOnce              # 단일 노드 읽기/쓰기 접근
  resources:                     # 리소스 요청
    requests:                    # 요청할 리소스
      storage: 10Gi              # 스토리지 용량 요청(10GB)
---
# Deployment for MinIO
apiVersion: apps/v1              # Kubernetes API 버전
kind: Deployment                 # 리소스 종류: Deployment
metadata:                        # 메타데이터
  name: minio                    # Deployment 이름
  labels:                        # 라벨 정의
    app: minio                   # 애플리케이션 라벨
spec:                            # Deployment 스펙
  replicas: 1                    # 복제본 수(단일 인스턴스)
  selector:                      # Pod 선택자
    matchLabels:                 # 라벨 매칭 조건
      app: minio                 # 관리할 Pod 라벨
  template:                      # Pod 템플릿
    metadata:                    # Pod 메타데이터
      labels:                    # Pod 라벨
        app: minio               # 애플리케이션 라벨
    spec:                        # Pod 스펙
      containers:                # 컨테이너 목록
      - name: minio              # 컨테이너 이름
        image: minio/minio:RELEASE.2023-10-16T04-13-43Z  # 이미지 버전
        args:                    # 실행 인자
        - server                 # 서버 모드
        - /data                  # 데이터 경로
        ports:                   # 포트 설정
        - containerPort: 9000    # API 포트
          name: api              # 포트 이름
        - containerPort: 9001    # 콘솔 포트
          name: console          # 포트 이름
        env:                     # 환경 변수
        - name: MINIO_ROOT_USER  # 관리자 사용자명
          valueFrom:             # 값 참조 방식
            secretKeyRef:        # Secret에서 참조
              name: minio-creds  # Secret 이름
              key: root-user     # Secret 키
        - name: MINIO_ROOT_PASSWORD  # 관리자 비밀번호
          valueFrom:             # 값 참조 방식
            secretKeyRef:        # Secret에서 참조
              name: minio-creds  # Secret 이름
              key: root-password # Secret 키
        volumeMounts:            # 볼륨 마운트
        - name: data             # 볼륨 이름
          mountPath: /data       # 마운트 경로
      volumes:                   # Pod 볼륨 정의
      - name: data               # 볼륨 이름
        persistentVolumeClaim:   # PVC 타입
          claimName: minio-data  # 사용할 PVC 이름
---
# Service for MinIO (ClusterIP)
apiVersion: v1                   # Kubernetes API 버전
kind: Service                    # 리소스 종류: Service
metadata:                        # 메타데이터
  name: minio-service            # 서비스 이름
spec:                            # 서비스 스펙
  type: ClusterIP                # 서비스 타입: 클러스터 내부용
  ports:                         # 포트 정의
  - port: 9000                   # 서비스 포트
    targetPort: api              # 대상 Pod 포트
    name: api                    # 포트 이름
  - port: 9001                   # 콘솔 서비스 포트
    targetPort: console          # 대상 Pod 콘솔 포트
    name: console                # 포트 이름
  selector:                      # Pod 선택자
    app: minio                   # 대상 Pod 라벨
---
# Service for MinIO (NodePort for external access)
apiVersion: v1                   # Kubernetes API 버전
kind: Service                    # 리소스 종류: Service
metadata:                        # 메타데이터
  name: minio-nodeport           # 서비스 이름
spec:                            # 서비스 스펙
  type: NodePort                 # 서비스 타입: 노드 포트(외부 접근용)
  ports:                         # 포트 정의
  - port: 9000                   # 서비스 포트
    targetPort: api              # 대상 Pod 포트
    nodePort: 30900              # 노드에 노출될 포트
    name: api                    # 포트 이름
  - port: 9001                   # 콘솔 서비스 포트
    targetPort: console          # 대상 Pod 콘솔 포트
    nodePort: 30901              # 콘솔용 노드 포트
    name: console                # 포트 이름
  selector:                      # Pod 선택자
    app: minio                   # 대상 Pod 라벨

이 YAML 파일 하나로 다음과 같은 리소스를 모두 생성할 수 있습니다:

  • MinIO 인증 정보를 위한 Secret
  • 데이터 저장을 위한 PVC
  • MinIO 서버를 실행하는 Deployment
  • 클러스터 내부 접근을 위한 ClusterIP Service
  • 외부 접근을 위한 NodePort Service

✅ 각 리소스의 확인 및 검증 방법

통합 구성을 적용한 후 모든 리소스가 올바르게 작동하는지 확인하는 방법:

# 모든 리소스 적용
kubectl apply -f minio-complete.yaml  # 모든 리소스를 한 번에 생성

# 모든 리소스 상태 확인
kubectl get all -l app=minio          # minio 라벨이 있는 모든 리소스 조회

# Secret 확인
kubectl get secret minio-creds        # Secret 존재 확인

# PVC 확인
kubectl get pvc minio-data            # PVC 상태 확인

# MinIO 서비스 연결 테스트
kubectl run -it --rm debug --image=busybox -- wget -qO- http://minio-service:9000/minio/health/live
# 임시 디버깅 Pod를 생성하여 MinIO 헬스체크 엔드포인트 접근 테스트

# 외부에서 NodePort 접근 (Docker Desktop의 경우)
curl http://localhost:30900/minio/health/live
# Docker Desktop 환경에서 로컬호스트를 통해 MinIO API 접근 테스트

# Docker Desktop 환경에서 웹 브라우저로 MinIO 콘솔 접근
# http://localhost:30901
# 브라우저에서 MinIO 콘솔에 접근하는 URL 안내

[리소스 간 연결 관계를 시각적으로 보여주는 종합 다이어그램]


📌 Cilium과 MinIO 통합을 위한 준비

앞서 살펴본 리소스들은 Cilium 네트워킹과 MinIO S3 스토리지를 쿠버네티스에 통합하기 위한 중요한 기초입니다. 여기서는 후속 에피소드에서 다룰 내용을 간략히 미리 살펴봅니다.

✅ Cilium 네트워크 정책을 위한 라벨 설계

Cilium 네트워크 정책은 Pod 라벨을 기반으로 작동하므로, 효과적인 라벨 설계가 중요합니다:

# Cilium 네트워크 정책을 위한 라벨이 포함된 MinIO Deployment 예시
apiVersion: apps/v1              # Kubernetes API 버전
kind: Deployment                 # 리소스 종류: Deployment
metadata:                        # 메타데이터
  name: minio                    # Deployment 이름
spec:                            # 스펙 정의
  # ... 생략 ...
  template:                      # Pod 템플릿
    metadata:                    # Pod 메타데이터
      labels:                    # Pod 라벨 정의
        app: minio               # 애플리케이션 식별 라벨
        role: storage            # 역할 라벨(스토리지 서비스 표시)
        tier: backend            # 계층 라벨(백엔드 서비스 표시)
        environment: dev         # 환경 라벨(개발 환경 표시)

▶️ 효과적인 라벨링 전략:

  • 애플리케이션 식별을 위한 app 라벨
  • 역할 구분을 위한 role 라벨
  • 애플리케이션 계층을 나타내는 tier 라벨
  • 환경을 구분하는 environment 라벨

✅ MinIO StatefulSet 준비

분산 환경에서의 MinIO 배포를 위한 StatefulSet 미리보기:

# MinIO StatefulSet 예시 (간략화)
apiVersion: apps/v1              # Kubernetes API 버전
kind: StatefulSet                # 리소스 종류: StatefulSet
metadata:                        # 메타데이터
  name: minio                    # StatefulSet 이름
spec:                            # 스펙 정의
  serviceName: minio-headless    # 연결된 헤드리스 서비스 이름(필수)
  replicas: 4                    # Pod 복제본 수
  # ... 생략 ...
  volumeClaimTemplates:          # PVC 템플릿 정의(StatefulSet의 고유 기능)
  - metadata:                    # PVC 메타데이터
      name: data                 # PVC 이름 템플릿
    spec:                        # PVC 스펙
      accessModes: [ "ReadWriteOnce" ]  # 접근 모드
      resources:                 # 리소스 요청
        requests:                # 요청 내용
          storage: 10Gi          # 스토리지 크기

▶️ StatefulSet의 장점:

  • 각 Pod에 대한 고유한 식별자 제공
  • 영구 스토리지의 자동 프로비저닝
  • 순차적인 배포 및 스케일링

📌 Summary

쿠버네티스의 핵심 리소스에 대해 알아보았습니다:

  • Pod는 쿠버네티스의 기본 실행 단위로, 하나 이상의 컨테이너를 포함할 수 있습니다
  • Service는 Pod 집합에 안정적인 네트워크 엔드포인트를 제공하며, 다양한 유형(ClusterIP, NodePort, LoadBalancer, Headless)이 있습니다
  • Deployment는 Pod를 선언적으로 관리하며, 롤링 업데이트, 롤백, 스케일링 기능을 제공합니다
  • 리소스 간 라벨 선택자를 통해 유기적으로 연결되어 완전한 애플리케이션 구성을 만들 수 있습니다
  • MinIO를 위한 통합 구성은 Secret, PVC, Deployment, Service를 모두 포함할 수 있습니다
  • Cilium 네트워킹과 MinIO StatefulSet 구성을 위한 라벨 설계가 중요합니다

 

728x90