Data Engineering/s3 minio

EP03 [ MinIO S3 + Cilium 기초 과정 ] 쿠버네티스 기초 개념 #3 | 네임스페이스로 리소스 효율적으로 관리하기

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

이 글에서는 쿠버네티스 네임스페이스의 개념과 이를 활용한 효율적인 리소스 관리 방법에 대해 알아봅니다. MinIO와 Cilium을 포함한 다양한 워크로드를 논리적으로 분리하고 관리하는 전략부터 네임스페이스 간 통신 제어까지, 구체적인 예시와 함께 살펴보겠습니다.


📌 네임스페이스의 기본 개념과 필요성

✅ 네임스페이스란 무엇인가?

네임스페이스는 쿠버네티스 클러스터 내에서 리소스를 논리적으로 분리하는 가상 경계입니다. 동일한 물리적 클러스터를 여러 가상 클러스터로 나누어 사용할 수 있게 해주는 개념입니다.

▶️ 기본 네임스페이스:

# 클러스터의 기본 네임스페이스 확인
kubectl get namespaces

# 출력 예시:
NAME              STATUS   AGE
default           Active   45d      # 기본 네임스페이스
kube-node-lease   Active   45d      # 노드 상태 정보 저장
kube-public       Active   45d      # 공개 정보 저장
kube-system       Active   45d      # 시스템 컴포넌트용

▶️ 네임스페이스의 주요 역할:

  • 동일한 이름의 리소스를 다른 네임스페이스에 생성 가능 (이름 충돌 방지)
  • 리소스 격리 및 구성 관리
  • 접근 제어 및 권한 관리
  • 리소스 할당량 설정

 

✅ 네임스페이스가 필요한 상황

대규모 쿠버네티스 환경에서 네임스페이스는 다음과 같은 상황에서 특히 유용합니다:

 

▶️ 환경 분리: 개발, 테스트, 스테이징, 프로덕션 환경 구분

▶️ 팀/프로젝트 분리: 여러 팀이나 프로젝트가 동일한 클러스터 사용 시

▶️ 리소스 할당: 팀별/프로젝트별 리소스 사용량 제한

▶️ 액세스 제어: 세분화된 RBAC(역할 기반 접근 제어) 적용

# 개발 환경용 네임스페이스 생성 예시
apiVersion: v1                   # Kubernetes API 버전
kind: Namespace                  # 리소스 종류: Namespace
metadata:                        # 메타데이터
  name: dev-environment          # 네임스페이스 이름
  labels:                        # 라벨 설정
    environment: development     # 환경 라벨
    team: storage-team           # 팀 라벨

📌 네임스페이스 생성 및 관리

✅ 네임스페이스 생성 방법

네임스페이스를 생성하는 다양한 방법을 살펴보겠습니다:

 

▶️ YAML 파일을 통한 생성:

# minio-namespace.yaml
apiVersion: v1                   # Kubernetes API 버전
kind: Namespace                  # 리소스 종류
metadata:                        # 메타데이터 섹션
  name: minio-storage            # 네임스페이스 이름
  labels:                        # 라벨 정의
    app: minio                   # 애플리케이션 라벨
    type: storage                # 타입 라벨
    environment: production      # 환경 라벨
# YAML 파일로 네임스페이스 생성
kubectl apply -f minio-namespace.yaml

 

▶️ 명령형 방식으로 생성:

# 간단한 네임스페이스 생성
kubectl create namespace minio-dev

# 라벨을 포함한 네임스페이스 생성
kubectl create namespace minio-test --labels=app=minio,environment=test

✅ 네임스페이스 관리 명령어

네임스페이스를 관리하기 위한 기본 kubectl 명령어:

# 모든 네임스페이스 조회
kubectl get namespaces
kubectl get ns  # 축약형

# 특정 네임스페이스 세부 정보 확인
kubectl describe namespace minio-storage

# 현재 컨텍스트의 기본 네임스페이스 변경
kubectl config set-context --current --namespace=minio-storage

# 현재 컨텍스트 정보 확인
kubectl config get-contexts

# 네임스페이스 삭제 (주의: 내부 모든 리소스도 삭제됨)
kubectl delete namespace minio-dev

✅ 리소스 네임스페이스 지정

리소스 생성 시 네임스페이스를 지정하는 방법:

 

▶️ YAML 파일에 네임스페이스 지정:

# minio-deployment-namespaced.yaml
apiVersion: apps/v1              # Kubernetes API 버전
kind: Deployment                 # 리소스 종류
metadata:                        # 메타데이터 섹션
  name: minio                    # Deployment 이름
  namespace: minio-storage       # 네임스페이스 지정
  # ... 나머지 내용 생략 ...

 

▶️ 명령어로 네임스페이스 지정:

# 특정 네임스페이스에 리소스 생성
kubectl apply -f minio-deployment.yaml -n minio-storage

# 특정 네임스페이스의 리소스 조회
kubectl get pods -n minio-storage
kubectl get all -n minio-storage  # 해당 네임스페이스의 모든 리소스 조회

 

▶️ 모든 네임스페이스의 리소스 조회:

# 모든 네임스페이스의 Pod 조회
kubectl get pods --all-namespaces
kubectl get pods -A  # 축약형

📌 네임스페이스 구성 전략

✅ 환경별 네임스페이스 구성

다양한 환경을 네임스페이스로 구분하는 방법:

# 환경별 네임스페이스 생성
kubectl create namespace minio-dev --labels=environment=development
kubectl create namespace minio-staging --labels=environment=staging
kubectl create namespace minio-prod --labels=environment=production

 

▶️ 환경별 구성 이점:

  • 개발 과정의 각 단계별 격리
  • 각 환경에 맞는 리소스 할당 제어
  • 권한 분리 (예: 프로덕션 네임스페이스에 제한된 접근 권한)

✅ 기능별 네임스페이스 구성

서비스나 기능에 따른 네임스페이스 분리:

# 기능별 네임스페이스 생성
kubectl create namespace storage --labels=function=storage
kubectl create namespace database --labels=function=database
kubectl create namespace monitoring --labels=function=monitoring
kubectl create namespace networking --labels=function=networking

 

▶️ 기능별 MinIO와 Cilium 배포 예시:

# storage 네임스페이스용 MinIO 배포
apiVersion: apps/v1              # Kubernetes API 버전
kind: Deployment                 # 리소스 종류
metadata:                        # 메타데이터
  name: minio                    # Deployment 이름
  namespace: storage             # storage 네임스페이스 지정
  # ... 나머지 내용 생략 ...
---
# networking 네임스페이스용 Cilium 구성
apiVersion: cilium.io/v2         # Cilium API 버전
kind: CiliumNetworkPolicy        # Cilium 네트워크 정책
metadata:                        # 메타데이터
  name: minio-access             # 정책 이름
  namespace: networking          # networking 네임스페이스 지정
  # ... 정책 내용 생략 ...

✅ 팀별 네임스페이스 구성

조직 내 팀 구조에 따른 네임스페이스 구성:

# 팀별 네임스페이스 생성
kubectl create namespace team-storage --labels=team=storage-team
kubectl create namespace team-backend --labels=team=backend-team
kubectl create namespace team-frontend --labels=team=frontend-team
kubectl create namespace team-data --labels=team=data-team

 

▶️ 팀별 구성 이점:

  • 팀 간 리소스 충돌 방지
  • 팀 단위 권한 관리 용이
  • 팀별 리소스 사용량 모니터링

📌 네임스페이스 간 통신과 접근 제어

✅ 네임스페이스 간 서비스 통신

다른 네임스페이스의 서비스에 접근하는 방법:

▶️ 정규화된 도메인 이름(FQDN) 사용:

<서비스명>.<네임스페이스>.svc.cluster.local
# 다른 네임스페이스의 MinIO에 접근하는 Pod 예시
apiVersion: v1                   # Kubernetes API 버전
kind: Pod                        # 리소스 종류
metadata:                        # 메타데이터
  name: minio-client             # Pod 이름
  namespace: team-data           # team-data 네임스페이스에 배포
spec:                            # Pod 스펙
  containers:                    # 컨테이너 목록
  - name: mc                     # 컨테이너 이름
    image: minio/mc              # MinIO 클라이언트 이미지
    command: ["sleep", "3600"]   # 임시 명령어(테스트용)
    env:                         # 환경 변수 설정
    - name: MINIO_SERVER         # MinIO 서버 환경 변수
      # 다른 네임스페이스의 MinIO 서비스 FQDN
      value: "minio-service.storage.svc.cluster.local"

 

▶️ 서비스 디스커버리 테스트:

# 다른 네임스페이스의 서비스 접근 테스트
kubectl run -n team-data test-dns --image=busybox -it --rm -- nslookup minio-service.storage.svc.cluster.local

# 예상 출력:
# Name:   minio-service.storage.svc.cluster.local
# Address: 10.96.x.y

✅ Cilium을 활용한 네임스페이스 간 접근 제어

Cilium 네트워크 정책을 사용해 네임스페이스 간 통신을 세밀하게 제어할 수 있습니다:

# Cilium 네트워크 정책으로 네임스페이스 간 접근 제어
apiVersion: cilium.io/v2         # Cilium API 버전
kind: CiliumNetworkPolicy        # 리소스 종류
metadata:                        # 메타데이터
  name: minio-cross-ns-access    # 정책 이름
  namespace: storage             # storage 네임스페이스에 적용
spec:                            # 정책 스펙
  endpointSelector:              # 대상 엔드포인트 선택자
    matchLabels:                 # 라벨 매칭
      app: minio                 # MinIO Pod 선택
  ingress:                       # 인그레스 규칙(들어오는 트래픽)
  - fromEndpoints:               # 출발지 엔드포인트
    - matchLabels:               # 라벨 매칭
        k8s:io.kubernetes.pod.namespace: team-data  # team-data 네임스페이스에서
        app: data-processor      # data-processor 앱에서 오는 트래픽만 허용
    toPorts:                     # 포트 규칙
    - ports:                     # 허용 포트 목록
      - port: "9000"             # MinIO API 포트
        protocol: TCP            # TCP 프로토콜

▶️ 네임스페이스 라벨 기반 정책:

# 네임스페이스 라벨 기반 Cilium 정책
apiVersion: cilium.io/v2         # Cilium API 버전
kind: CiliumNetworkPolicy        # 리소스 종류
metadata:                        # 메타데이터
  name: allow-from-development   # 정책 이름
  namespace: storage             # storage 네임스페이스에 적용
spec:                            # 정책 스펙
  endpointSelector:              # 대상 엔드포인트
    matchLabels:                 # 라벨 매칭
      app: minio                 # MinIO Pod
  ingress:                       # 인그레스 규칙
  - fromEndpoints:               # 출발지 엔드포인트
    - matchLabels:               # 라벨 매칭
        # 'environment: development' 라벨이 있는 네임스페이스의 모든 Pod
        k8s:io.kubernetes.pod.namespace: development

📌 리소스 관리와 할당량

✅ 네임스페이스별 리소스 할당량

ResourceQuota를 사용하여 네임스페이스 내 리소스 사용량을 제한할 수 있습니다:

# minio-namespace-quota.yaml
apiVersion: v1                   # Kubernetes API 버전
kind: ResourceQuota              # 리소스 종류: ResourceQuota
metadata:                        # 메타데이터 섹션
  name: minio-quota              # ResourceQuota 이름
  namespace: storage             # 적용할 네임스페이스
spec:                            # 할당량 스펙 정의
  hard:                          # 하드 제한값 설정
    # Pod 수 제한
    pods: "10"                   # 최대 10개의 Pod 허용
    
    # CPU 리소스 제한
    requests.cpu: "4"            # 요청 가능한 최대 CPU 합계: 4 코어
    limits.cpu: "8"              # 제한 가능한 최대 CPU 합계: 8 코어
    
    # 메모리 리소스 제한
    requests.memory: 8Gi         # 요청 가능한 최대 메모리 합계: 8GB
    limits.memory: 16Gi          # 제한 가능한 최대 메모리 합계: 16GB
    
    # 스토리지 리소스 제한
    requests.storage: 100Gi      # 요청 가능한 최대 스토리지 합계: 100GB
    persistentvolumeclaims: "5"  # 최대 5개의 PVC 허용
# 리소스 할당량 적용 및 확인
kubectl apply -f minio-namespace-quota.yaml

# 할당량 상태 확인
kubectl describe resourcequota minio-quota -n storage

# 출력 예시:
# Name:            minio-quota
# Namespace:       storage
# Resource         Used   Hard
# --------         ----   ----
# limits.cpu       2      8
# limits.memory    2Gi    16Gi
# pods             3      10
# ...

✅ 기본 리소스 제한 설정

LimitRange를 사용하여 네임스페이스 내 기본 리소스 제한을 설정할 수 있습니다:

# minio-limit-range.yaml
apiVersion: v1                   # Kubernetes API 버전
kind: LimitRange                 # 리소스 종류: LimitRange
metadata:                        # 메타데이터 섹션
  name: minio-limits             # LimitRange 이름
  namespace: storage             # 적용할 네임스페이스
spec:                            # 스펙 정의
  limits:                        # 제한 정의 시작
  - type: Container              # 컨테이너 타입 제한
    default:                     # 기본 제한(명시적 설정 없을 때)
      cpu: "500m"                # CPU 제한: 0.5 코어
      memory: "512Mi"            # 메모리 제한: 512MB
    defaultRequest:              # 기본 요청(명시적 설정 없을 때)
      cpu: "100m"                # CPU 요청: 0.1 코어
      memory: "256Mi"            # 메모리 요청: 256MB
    max:                         # 최대 허용값
      cpu: "2"                   # 최대 CPU: 2 코어
      memory: "2Gi"              # 최대 메모리: 2GB
    min:                         # 최소 허용값
      cpu: "50m"                 # 최소 CPU: 0.05 코어
      memory: "64Mi"             # 최소 메모리: 64MB
# LimitRange 적용 및 확인
kubectl apply -f minio-limit-range.yaml

# LimitRange 상태 확인
kubectl describe limitrange minio-limits -n storage

✅ 네임스페이스별 리소스 사용량 모니터링

네임스페이스별 리소스 사용량을 모니터링하는 명령어:

# 네임스페이스별 리소스 사용량 확인
kubectl top pods -n storage    # storage 네임스페이스의 Pod CPU/메모리 사용량

# 모든 네임스페이스의 리소스 사용량 확인
kubectl top pods --all-namespaces

# 네임스페이스별 노드 리소스 사용량
kubectl top nodes

📌 MinIO와 Cilium을 위한 네임스페이스 구성 예시

✅ 프로덕션 환경 네임스페이스 설계

실제 환경에서 MinIO와 Cilium을 위한 네임스페이스 구성 예시:

# 핵심 네임스페이스 생성
kubectl create namespace storage-prod     # 프로덕션 스토리지
kubectl create namespace storage-backup   # 백업 스토리지
kubectl create namespace network-policies # 네트워크 정책 관리
kubectl create namespace monitoring       # 모니터링 시스템

▶️ 네임스페이스 분리의 이점:

  • 관련 리소스 그룹화 및 관리 용이성
  • 서비스별 세분화된 접근 제어
  • 장애 격리 (한 네임스페이스의 문제가 다른 네임스페이스에 영향 최소화)

✅ MinIO 멀티 테넌트 설계

여러 사용자나 팀이 공유하는 MinIO 환경을 설계할 때 네임스페이스를 활용하는 방법:

# 팀별 MinIO 인스턴스 구성 예시
---
# 데이터 과학팀용 MinIO
apiVersion: v1                   # Kubernetes API 버전
kind: Namespace                  # 리소스 종류
metadata:                        # 메타데이터
  name: minio-datascience        # 네임스페이스 이름
  labels:                        # 라벨 설정
    team: datascience            # 팀 라벨
    tier: storage                # 계층 라벨
---
# 미디어 처리팀용 MinIO
apiVersion: v1                   # Kubernetes API 버전
kind: Namespace                  # 리소스 종류
metadata:                        # 메타데이터
  name: minio-media              # 네임스페이스 이름
  labels:                        # 라벨 설정
    team: media                  # 팀 라벨
    tier: storage                # 계층 라벨
---
# 각 네임스페이스에 리소스 할당량 설정
apiVersion: v1                   # Kubernetes API 버전
kind: ResourceQuota              # 리소스 종류
metadata:                        # 메타데이터
  name: storage-quota            # 할당량 이름
  namespace: minio-datascience   # 데이터 과학팀 네임스페이스
spec:                            # 스펙 정의
  hard:                          # 하드 제한
    requests.storage: 500Gi      # 스토리지 요청 제한
    persistentvolumeclaims: "10" # PVC 개수 제한

✅ Cilium과 네임스페이스 통합

Cilium 네트워크 정책과 네임스페이스를 통합하여 다계층 보안 구현:

# 네임스페이스 선택적 접근 제어
apiVersion: cilium.io/v2         # Cilium API 버전
kind: CiliumNetworkPolicy        # 리소스 종류
metadata:                        # 메타데이터
  name: minio-namespace-access   # 정책 이름
  namespace: minio-media         # 미디어 팀 네임스페이스에 적용
spec:                            # 정책 스펙
  endpointSelector:              # 대상 엔드포인트
    matchLabels:                 # 라벨 매칭
      app: minio                 # MinIO 애플리케이션 선택
  ingress:                       # 인그레스 규칙
  - fromEndpoints:               # 허용할 출발지
    - matchLabels:               # 라벨 매칭
        # 'team: media' 라벨이 있는 네임스페이스의 Pod
        k8s:io.kubernetes.pod.namespace: media
        # 또는 monitoring 네임스페이스의 모든 Pod
    - matchLabels:
        k8s:io.kubernetes.pod.namespace: monitoring

 


📌 네임스페이스 관리 모범 사례

✅ 명명 규칙 및 구조화

일관된 네임스페이스 관리를 위한 모범 사례:

▶️ 명명 규칙:

  • 용도를 명확히 표현하는 이름 사용 (예: storage-prod, storage-dev)
  • 팀/서비스/환경을 구분할 수 있는 접두사 사용
  • 간결하고 명확한 이름 사용 (너무 긴 이름 지양)

▶️ 라벨링 전략:

# 효과적인 네임스페이스 라벨링 예시
apiVersion: v1                   # Kubernetes API 버전
kind: Namespace                  # 리소스 종류
metadata:                        # 메타데이터
  name: minio-prod               # 네임스페이스 이름
  labels:                        # 라벨 섹션
    environment: production      # 환경 구분
    app: minio                   # 애플리케이션 유형
    team: storage                # 담당 팀
    tier: backend                # 시스템 계층
    cost-center: infrastructure  # 비용 센터

✅ 네임스페이스 간 통신 설계

네임스페이스 간 통신을 효과적으로 설계하는 방법:

▶️ 서비스 디스커버리 패턴:

  • FQDN 사용 (예: service-name.namespace-name.svc.cluster.local)
  • 공통 서비스는 별도의 공유 네임스페이스에 배치
  • 서비스 메시나 API 게이트웨이를 통한 중앙화된 통신 관리

▶️ 통신 패턴 예시:

# 다른 네임스페이스의 MinIO에 접근하는 설정 예시
apiVersion: v1                   # Kubernetes API 버전
kind: ConfigMap                  # 리소스 종류
metadata:                        # 메타데이터
  name: app-config               # ConfigMap 이름
  namespace: application         # 애플리케이션 네임스페이스
data:                            # 데이터 섹션
  minio_endpoint: "http://minio-service.storage-prod.svc.cluster.local:9000"  # MinIO 서비스 FQDN
  # storage-prod 네임스페이스의 MinIO 서비스 참조

✅ 운영 자동화 및 관리

네임스페이스 관리 자동화를 위한 도구 및 전략:

▶️ GitOps 기반 네임스페이스 관리:

  • 네임스페이스 정의를 코드로 관리 (Infrastructure as Code)
  • CI/CD 파이프라인을 통한 네임스페이스 자동 생성 및 구성
  • Argo CD 또는 Flux와 같은 GitOps 도구 활용
# 네임스페이스 자동 생성을 위한 예시 스크립트 (shell)
for env in dev staging prod; do
  # 환경별 네임스페이스 생성
  kubectl create namespace "minio-${env}" --dry-run=client -o yaml | \
  kubectl apply -f -
  
  # 기본 ResourceQuota 적용
  kubectl apply -f "quota-${env}.yaml" -n "minio-${env}"
  
  # 네임스페이스별 RBAC 설정
  kubectl apply -f "rbac-${env}.yaml" -n "minio-${env}"
done

▶️ 모니터링 및 관리:

  • 네임스페이스별 리소스 사용량 모니터링 대시보드 구성
  • 네임스페이스 라이프사이클 관리 (생성부터 폐기까지)
  • 네임스페이스 정리 정책 수립 (미사용 네임스페이스 식별 및 정리)

📌 Summary

쿠버네티스 네임스페이스에 대해 다음과 같은 주요 내용을 살펴보았습니다:

  • 네임스페이스는 쿠버네티스 클러스터 내에서 리소스를 논리적으로 분리하는 가상 경계입니다
  • 환경, 팀, 기능별로 네임스페이스를 구성하여 리소스를 효율적으로 관리할 수 있습니다
  • ResourceQuota와 LimitRange를 통해 네임스페이스별 리소스 사용량을 제한할 수 있습니다
  • Cilium 네트워크 정책을 활용하여 네임스페이스 간 통신을 세밀하게 제어할 수 있습니다
  • 명명 규칙, 라벨링, 통신 설계, 운영 자동화 등의 모범 사례를 따르는 것이 중요
  • MinIO와 Cilium을 효과적으로 운영하기 위해 네임스페이스를 활용한 멀티테넌트 설계가 가능합니다
  • 네임스페이스 기반 관리는 복잡한 쿠버네티스 환경에서 리소스 격리와 조직화의 기본이 됩니다

 

728x90