Data Engineering/s3 minio

EP01 [ MinIO S3 + Cilium 기초 과정 ] 쿠버네티스 기초 개념 #1 | Docker Desktop 쿠버네티스 특성 이해하기 - 엔지니어 관점에서

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

이 글에서는 Docker Desktop 쿠버네티스 환경의 특성과 제한사항, 그리고 실무 엔지니어 관점에서 이를 효과적으로 활용하는 방법에 대해 살펴봅니다. 특히 MinIO와 Cilium을 구축하기 위한 기반 환경으로서 Docker Desktop 쿠버네티스의 아키텍처적 특징과 최적화 방법을 상세히 알아보겠습니다.


📌 Docker Desktop 쿠버네티스 소개

✅ Docker Desktop 쿠버네티스란?

Docker Desktop은 개발자들이 로컬 환경에서 컨테이너를 쉽게 실행할 수 있도록 해주는 도구로, 2018년부터 내장된 쿠버네티스 기능을 제공하고 있습니다. 이를 통해 별도의 복잡한 설정 없이 단일 노드 쿠버네티스 클러스터를 로컬에서 빠르게 시작할 수 있습니다.

▶️ 활성화 방법: Docker Desktop 설정 메뉴의 'Kubernetes' 섹션에서 'Enable Kubernetes' 체크박스를 선택하고 'Apply & Restart'를 클릭하면 자동으로 설치 및 구성됩니다.

[Docker Desktop 설정 화면에서 쿠버네티스 활성화 옵션을 보여주는 이미지]

▶️ 주요 장점:

  • 별도 가상 머신이나 추가 설치 없이 Docker 환경 내에서 쿠버네티스 실행
  • Docker와 쿠버네티스 환경을 통합적으로 관리
  • 로컬에서 개발한 이미지를 별도 레지스트리 없이 즉시 테스트 가능

✅ Docker Desktop 쿠버네티스의 실무적 가치

실제 업무 환경에서 Docker Desktop 쿠버네티스는 다음과 같은 가치를 제공합니다:

▶️ 개발-테스트 사이클 단축: 개발자가 로컬에서 즉시 쿠버네티스 환경을 구성하여 코드 변경 후 빠르게 테스트할 수 있습니다.

▶️ 학습 및 실험 환경: 실제 프로덕션 환경에 영향을 주지 않고 쿠버네티스 리소스, 구성, 관리 방법을 배울 수 있습니다.

▶️ CI/CD 파이프라인 검증: 배포 스크립트와 Helm 차트 등을 프로덕션 환경에 적용하기 전에 로컬에서 검증할 수 있습니다.


📌 Docker Desktop 쿠버네티스의 아키텍처 특성

✅ 싱글 노드 아키텍처

Docker Desktop 쿠버네티스는 단일 노드 클러스터로, 이는 실제 프로덕션 환경과는 다른 특성을 가집니다:

# 노드 상태 확인
kubectl get nodes

# 출력 결과:
NAME             STATUS   ROLES           AGE    VERSION
docker-desktop   Ready    control-plane   3d7h   v1.28.2

▶️ 컨트롤 플레인과 워커 노드 통합: 프로덕션 환경에서는 일반적으로 컨트롤 플레인과 워커 노드가 분리되지만, Docker Desktop에서는 모든 컴포넌트가 단일 노드에서 실행됩니다. 이는 관리가 간편하지만, 노드 간 통신이나 분산 시스템 문제를 완전히 시뮬레이션하기 어렵습니다.

▶️ 컴포넌트 구성:

# 쿠버네티스 시스템 포드 확인
kubectl get pods -n kube-system

# 출력 예시:
NAME                                     READY   STATUS    RESTARTS   AGE
coredns-5dd5756b68-abc12                 1/1     Running   0          3d7h
coredns-5dd5756b68-def34                 1/1     Running   0          3d7h
etcd-docker-desktop                      1/1     Running   0          3d7h
kube-apiserver-docker-desktop            1/1     Running   0          3d7h
kube-controller-manager-docker-desktop   1/1     Running   0          3d7h
kube-proxy-abcde                         1/1     Running   0          3d7h
kube-scheduler-docker-desktop            1/1     Running   0          3d7h
storage-provisioner                      1/1     Running   0          3d7h
vpnkit-controller                        1/1     Running   0          3d7h

[Docker Desktop 쿠버네티스의 단일 노드 아키텍처를 보여주는 다이어그램]

✅ 네트워크 특성

Docker Desktop 쿠버네티스의 네트워킹 구성은 특히 Cilium과 같은 고급 CNI를 적용할 때 이해해야 할 중요한 요소입니다:

▶️ 기본 CNI: Docker Desktop은 자체 구현된 CNI를 사용합니다. 이는 Docker의 브릿지 네트워크와 통합되어 있어서 컨테이너 간 통신을 가능하게 합니다.

▶️ 서비스 접근성: NodePort와 LoadBalancer 타입의 서비스는 다음과 같이 localhost를 통해 직접 접근할 수 있습니다:

# LoadBalancer 서비스 예시
apiVersion: v1
kind: Service
metadata:
  name: minio-service  # 서비스 이름을 정의합니다
spec:
  type: LoadBalancer   # Docker Desktop에서는 자동으로 localhost에 포트 매핑
                       # 이는 개발 편의성을 위한 것으로, 실제 클라우드 환경에서는 
                       # 외부 로드밸런서가 프로비저닝됩니다
  ports:
  - port: 9000         # 서비스가 노출할 포트 번호
    targetPort: 9000   # 컨테이너 내부에서 실행 중인 애플리케이션 포트
                       # MinIO의 기본 API 포트는 9000입니다
  selector:
    app: minio         # 이 서비스가 트래픽을 전달할 Pod를 선택하는 라벨 셀렉터
                       # 'app: minio' 라벨이 있는 Pod로 트래픽이 라우팅됩니다

▶️ DNS 해결: CoreDNS가 클러스터 내부 서비스 이름 해결을 담당합니다. 이는 MinIO와 같은 StatefulSet 워크로드의 개별 포드에 안정적으로 접근하기 위해 중요합니다.

✅ 스토리지 특성

Docker Desktop 쿠버네티스의 스토리지 처리 방식은 MinIO와 같은 데이터 중심 워크로드에 중요한 영향을 미칩니다:

▶️ 기본 StorageClass: docker-desktop이라는 기본 StorageClass가 제공됩니다:

# StorageClass 확인
kubectl get storageclass

# 출력 결과:
NAME                 PROVISIONER          RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
docker-desktop       docker.io/hostpath   Delete          Immediate           false                  3d7h

▶️ hostPath 프로비저너: 이 StorageClass는 호스트 머신의 파일시스템을 사용하는 hostPath 기반 프로비저너를 사용합니다. 이는 다음과 같은 의미를 가집니다:

  • 기본적으로 /run/desktop/mnt/host/c/Users/Public/Documents/Hyper-V/Virtual hard disks/ (Windows) 또는 /var/lib/docker/volumes/ (macOS) 아래에 볼륨이 생성됩니다.
  • 운영 체제에 따라 성능 차이가 있을 수 있으며, macOS나 Windows에서는 Linux보다 I/O 성능이 낮을 수 있습니다.

▶️ PV/PVC 예시:

# PVC 생성 예시
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: minio-data     # PVC의 고유 이름
spec:
  accessModes:
    - ReadWriteOnce    # Docker Desktop의 hostPath는 RWO만 지원
                       # 이는 볼륨이 단일 노드에서만 읽기/쓰기 가능함을 의미합니다
  storageClassName: docker-desktop  # 앞서 살펴본 기본 StorageClass 사용
                                   # 이 StorageClass는 hostPath 프로비저너를 사용합니다
  resources:
    requests:
      storage: 10Gi    # 요청할 스토리지 용량 크기
                       # MinIO는 데이터 저장소이므로 충분한 용량이 필요합니다

[Docker Desktop의 스토리지 아키텍처와 볼륨 프로비저닝 흐름을 보여주는 다이어그램]


📌 Docker Desktop 쿠버네티스 최적화 방법

✅ 리소스 관리 전략

Docker Desktop 쿠버네티스에서 리소스를 효율적으로 관리하기 위한 방법:

▶️ Docker Desktop 리소스 할당 최적화: Docker Desktop 설정에서 CPU, 메모리, 디스크 리소스를 프로젝트 요구사항에 맞게 조정해야 합니다:

# 현재 노드의 리소스 상태 확인
kubectl describe node docker-desktop | grep -A 5 Capacity
kubectl describe node docker-desktop | grep -A 5 Allocatable

# 메모리 및 CPU 사용량 확인
kubectl top node

MinIO와 Cilium을 함께 실행하기 위한 권장 최소 설정:

  • CPU: 2코어 이상
  • 메모리: 4GB 이상
  • 디스크: 30GB 이상

▶️ 워크로드별 리소스 제한 설정: 각 워크로드에 적절한 리소스 요청과 제한을 명시하는 것이 중요합니다:

# MinIO StatefulSet 리소스 설정 예시
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: minio        # StatefulSet의 이름
spec:
  # ... 생략 ...
  template:
    spec:
      containers:
      - name: minio
        image: minio/minio:RELEASE.2023-10-16T04-13-43Z  # 안정적인 MinIO 버전 사용
        resources:
          requests:  # 최소 요구 리소스 - 클러스터가 Pod를 스케줄링할 때 고려됨
            memory: "512Mi"  # MinIO는 메모리 집약적이므로 적절한 값 설정 필요
                            # 너무 작으면 성능 저하나 OOM이 발생할 수 있습니다
            cpu: "250m"     # 0.25 CPU 코어를 요청
                           # 최소한의 처리 능력을 보장합니다
          limits:    # 최대 사용 리소스 - Pod가 이 이상 사용할 수 없음
            memory: "1Gi"   # 메모리 한도 초과 시 OOM Killer에 의해 종료될 수 있음
                           # 적절한 한도 설정으로 다른 워크로드 보호
            cpu: "500m"     # CPU는 스로틀링됨
                           # 과도한 CPU 사용을 방지합니다

✅ 개발 워크플로우 최적화

Docker Desktop 쿠버네티스에서 개발 효율성을 높이는 방법:

▶️ 로컬 이미지 즉시 활용: Docker Desktop의 큰 장점은 로컬에서 빌드한 이미지를 레지스트리 푸시 없이 바로 쿠버네티스에서 사용할 수 있다는 것입니다:

# 로컬에서 이미지 빌드
docker build -t my-app:dev .

# 쿠버네티스에서 바로 사용
kubectl run test-pod --image=my-app:dev

 

▶️ 네임스페이스 활용: 여러 프로젝트나 환경을 분리하기 위해 네임스페이스를 효과적으로 활용합니다:

# 개발용 네임스페이스 생성
kubectl create namespace minio-dev

# 특정 네임스페이스에 리소스 배포
kubectl apply -f minio-statefulset.yaml -n minio-dev

# 기본 네임스페이스 전환
kubectl config set-context --current --namespace=minio-dev

 

▶️ 컨텍스트 관리: 여러 클러스터 간 전환을 위한 컨텍스트 관리:

# 현재 컨텍스트 확인
kubectl config current-context  # Docker Desktop 환경에서는 'docker-desktop'으로 표시됨

# 컨텍스트 목록 확인
kubectl config get-contexts     # 여러 개발 환경 간 전환 가능

# Docker Desktop 컨텍스트로 전환
kubectl config use-context docker-desktop  # 다른 클러스터에서 작업 후 복귀 시 유용

✅ 디버깅 및 트러블슈팅 전략

Docker Desktop 쿠버네티스에서 효과적인 문제 해결 방법:

▶️ 로그 확인 및 분석:

# 포드 로그 확인
kubectl logs -f pod/minio-0  # 실시간 로그 스트리밍으로 문제 진단

# 이전 컨테이너의 로그 확인 (재시작된 경우)
kubectl logs -f pod/minio-0 --previous  # 크래시된 컨테이너의 로그 확인 가능

# 특정 네임스페이스의 모든 이벤트 확인
kubectl get events -n minio-dev --sort-by='.lastTimestamp'  # 시간순 이벤트 확인

 

▶️ 포드 내부 접근 및 디버깅:

# 포드 내부 쉘 접근
kubectl exec -it minio-0 -- /bin/sh  # MinIO 컨테이너 내부에서 직접 명령 실행

# 특정 컨테이너 지정 (다중 컨테이너 포드의 경우)
kubectl exec -it minio-0 -c minio -- /bin/sh  # 사이드카가 있는 경우 유용

# 임시 디버깅 도구 활용
kubectl run netshoot --rm -it --image=nicolaka/netshoot -- /bin/bash  # 네트워크 디버깅용

 

▶️ 상태 모니터링 및 진단:

# 포드 상태 실시간 모니터링
kubectl get pods -n minio-dev -w  # '-w' 옵션으로 상태 변화 감시

# 포드 세부 상태 확인
kubectl describe pod minio-0 -n minio-dev  # 이벤트, 볼륨, 컨테이너 상태 등 상세 정보

# 리소스 사용량 확인
kubectl top pod -n minio-dev  # CPU/메모리 사용량 확인(metrics-server 필요)

 


📌 Docker Desktop 쿠버네티스의 한계와 고려사항

✅ 프로덕션 환경과의 차이점

Docker Desktop 쿠버네티스는 편리하지만 실제 프로덕션 환경과는 차이가 있습니다:

▶️ 싱글 노드 한계: 단일 노드 환경이므로 다음과 같은 시나리오를 테스트하기 어렵습니다:

  • 노드 간 네트워크 지연 및 분리 상황
  • 노드 장애 시 포드 재스케줄링
  • 실제 분산 환경에서의 StatefulSet 동작

▶️ 네트워킹 기능 제한: Cilium과 같은 고급 CNI 기능 중 일부는 Docker Desktop 환경에서 제한될 수 있습니다:

  • XDP(eXpress Data Path) 기능은 호스트 커널 버전에 의존
  • 멀티 클러스터 기능 테스트의 제약
  • 특정 eBPF 기능은 Docker Desktop의 가상화 레이어로 인해 제한될 수 있음

▶️ 리소스 제약: 호스트 머신의 리소스에 직접 제한되므로 대규모 워크로드 테스트에 한계가 있습니다:

  • 많은 수의 포드를 실행할 경우 성능 저하
  • 높은 I/O를 요구하는 MinIO 워크로드의 성능 한계
  • 메모리 집약적 애플리케이션의 제약

✅ MinIO & Cilium 특화 고려사항

Docker Desktop 쿠버네티스에서 MinIO와 Cilium을 운영할 때 특별히 고려해야 할 사항:

▶️ MinIO 관련 고려사항:

  • 분산 모드 제한: 여러 노드에 걸친 진정한 분산 모드 테스트가 어려움
  • I/O 성능: hostPath 기반 스토리지는 특히 macOS나 Windows에서 성능이 제한적
  • 데이터 지속성: Docker Desktop 리셋 시 데이터 손실 가능성
# MinIO 단일 인스턴스 모드 설정 예시 (Docker Desktop에 최적화)
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: minio  # StatefulSet 이름
spec:
  serviceName: minio-headless  # 헤드리스 서비스 이름
                              # StatefulSet Pod에 안정적인 네트워크 ID 제공
  replicas: 1  # Docker Desktop에서는 단일 인스턴스 권장
               # 멀티 노드 환경이 아니므로 복제본이 의미가 없음
  # ... 생략 ...
  template:
    spec:
      containers:
      - name: minio
        image: minio/minio:RELEASE.2023-10-16T04-13-43Z
        args:
        - server  # 단일 노드 모드 명령
                 # 분산 모드는 'server /data{1...n}' 형식을 사용함
        - /data   # 데이터 디렉토리 지정
                 # 이 디렉토리는 PV에 마운트됨
        # 분산 모드 대신 단일 인스턴스 모드 사용
        # Docker Desktop 환경에서는 단일 인스턴스가 더 안정적

▶️ Cilium 관련 고려사항:

  • 커널 호환성: 호스트 OS 커널과 Cilium의 eBPF 요구사항 간 호환성 확인 필요
  • 설치 복잡성: Docker Desktop의 기본 CNI를 Cilium으로 교체하는 과정에서 주의 필요
  • 기능 제한: 모든 고급 Cilium 기능이 Docker Desktop에서 완전히 지원되지 않을 수 있음
# Cilium 설치 전 Docker Desktop 쿠버네티스 호환성 확인
kubectl get nodes -o wide  # 노드 정보 확인
uname -r  # 호스트 커널 버전 확인 (Cilium은 4.9 이상 권장)

# Cilium CLI를 사용한 설치 (Docker Desktop 호환 모드)
cilium install --helm-set ipam.mode=kubernetes \
               --helm-set kubeProxyReplacement=disabled
               # Docker Desktop 환경에서는 kube-proxy 대체를 비활성화하는 것이 안정적

✅ 대안 및 보완 전략

Docker Desktop 쿠버네티스의 한계를 보완하기 위한 방법:

▶️ 대체 로컬 쿠버네티스 솔루션 고려:

  • Kind (Kubernetes in Docker): 다중 노드 클러스터를 시뮬레이션할 수 있어 StatefulSet의 분산 테스트에 유용
  • Minikube: 더 완전한 쿠버네티스 환경을 제공하며, 다양한 드라이버 옵션 지원
  • K3d/K3s: 경량화된 쿠버네티스로, 리소스 사용량이 적으면서도 기능적으로 완전함

▶️ 하이브리드 접근법:

  • 간단한 기능 테스트는 Docker Desktop에서 수행
  • 멀티 노드 시나리오나 고급 기능은 Kind 또는 클라우드 테스트 환경에서 검증
  • CI/CD 파이프라인에 통합하여 다양한 환경에서 자동 테스트 수행

📌 Summary

Docker Desktop 쿠버네티스는 다음과 같은 특징을 가진 환경입니다:

  • 단일 노드 구조로 간편하게 설정할 수 있어 개발 및 테스트에 적합
  • 호스트 머신의 리소스에 직접 제한되므로 적절한 리소스 할당이 중요
  • MinIO의 기본 기능과 Cilium의 네트워크 정책을 학습하고 테스트하기에 충분
  • 실제 프로덕션 환경과는 차이가 있으므로 한계를 이해하고 사용해야 함
  • 효율적인 디버깅 및 트러블슈팅 방법을 익히면 개발 생산성을 크게 향상 가능
  • 필요에 따라 대체 솔루션을 고려하거나 하이브리드 접근법 활용 권장

 

728x90