카테고리 없음

🐳 Docker 강의 9강: Kubernetes(쿠버네티스)와 Docker 연계 및 비교

브라더댄 2025. 1. 27. 01:17
728x90
반응형
SMALL

이전 강의에서 Docker Swarm을 통해 간단히 오케스트레이션 환경을 살펴봤다면, 이제는 업계 표준으로 자리 잡은 Kubernetes에서 어떻게 Docker를 활용하고 비교할 수 있는지 알아보겠습니다.

🚀 강의 목표

  • Kubernetes의 주요 개념(Pod, Service, Deployment, etc.)과 Docker의 관계를 이해합니다.
  • Minikube 또는 Kind(Kubernetes in Docker) 등 로컬 환경에서 간단히 Kubernetes 클러스터를 구성해 봅니다.
  • Docker 이미지를 Kubernetes에 배포하고 스케일링, 업데이트를 실습합니다.
  • Swarm과 Kubernetes의 차이점을 정리하고, 어떤 상황에서 Kubernetes를 선택해야 하는지 논의합니다.

1. 왜 Kubernetes인가?

1.1 컨테이너 오케스트레이션의 사실상 표준

  • **Kubernetes(K8s)**는 구글이 내부 Borg 시스템을 오픈소스화하면서 출발했습니다.
  • Swarm, Mesos 등의 경쟁 솔루션도 있지만, 현재는 Kubernetes가 가장 널리 사용되는 컨테이너 오케스트레이션 툴입니다.

1.2 Docker + Kubernetes의 시너지

  • Docker로 애플리케이션을 컨테이너화하면, Kubernetes가 이를 자동 배포, 스케일링, 롤링 업데이트, 서비스 디스커버리 등 더욱 고도화된 관점에서 관리해줍니다.
  • **클라우드 환경(AWS, GCP, Azure)**에서도 Kubernetes가 기본 제공되거나(Managed K8s), 쉽게 연동할 수 있어 이식성이 뛰어납니다.

Tip: Docker Desktop의 Kubernetes 기능
macOS/Windows에서 Docker Desktop 사용 시, “Kubernetes” 탭에서 로컬 K8s 클러스터를 활성화할 수 있습니다. 이 기능을 켜면 추가 설치 없이 미니멀한 쿠버네티스 환경을 테스트할 수 있습니다.


2. Kubernetes 주요 개념 요약

2.1 Pod

  • 가장 작은 배포 단위. 하나 이상의 컨테이너가 Pod 내부에서 함께 실행되고, 네트워킹 및 스토리지를 공유합니다.

2.2 Service

  • Pod에 고정된 IP를 부여하고, 로드 밸런싱 역할을 합니다. Pod가 죽거나 새로 생겨도 Service를 통해 일관된 접근이 가능합니다.

2.3 Deployment

  • 여러 Pod을 스케일링, 롤링 업데이트, 롤백 등의 기능을 제공합니다.
  • “리플리카 개수(N개의 Pod)”를 선언적으로 관리하고, 장애 발생 시 자동으로 새로운 Pod를 생성합니다.

2.4 ConfigMap & Secret

  • 설정값이나 비밀번호/인증서를 K8s에서 관리하여, Pod에 주입할 수 있는 메커니즘입니다.

Tip: Declarative vs Imperative
Kubernetes는 보통 YAML 매니페스트(Deployment, Service, etc.)를 통해 **선언형(Declarative)**으로 리소스를 정의합니다. kubectl apply -f <파일>.yaml로 배포하면, K8s가 원하는 상태로 시스템을 자동 조정합니다.


3. 로컬 클러스터 준비하기 (Minikube 예시)

3.1 Minikube 설치

  • macOS(Homebrew) 예시:
    brew install minikube
    
  • Windows/Ubuntu 등 다른 환경은 Minikube 공식 문서 참고.

3.2 클러스터 시작

minikube start
  • 로컬에서 1노드짜리 K8s 클러스터가 기동됩니다.
  • kubectl 명령어가 자동으로 설정되며, kubectl get pods 등으로 상태 확인이 가능합니다.

Tip: Kind(Kubernetes in Docker)
Minikube 대신 Kind를 사용해 Docker 컨테이너로 K8s 노드를 띄울 수도 있습니다.

GO111MODULE="on" go get sigs.k8s.io/kind@v0.17.0
kind create cluster

이런 식으로 로컬 개발환경에서 간편하게 Kubernetes 테스트가 가능합니다.


4. Docker 이미지로 Kubernetes 배포 실습

4.1 Dockerfile 예시

간단한 Node.js 앱을 컨테이너화했다고 가정:

FROM node:16
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
  • 이미지를 빌드하고, 예컨대 my-node-app:1.0 태그를 부여합니다.

4.2 이미지 로딩

  1. Minikube 환경 사용 시
    • minikube image load my-node-app:1.0
    • Minikube 내부 Docker 레지스트리에 해당 이미지를 로드합니다.
  2. Kind 환경 사용 시
    • kind load docker-image my-node-app:1.0
  3. 쿠버네티스 클러스터가 별도 머신인 경우
    • Private Registry, Docker Hub 등에 docker push 후, K8s에서 image: <registry>/my-node-app:1.0 형식으로 이미지 Pull.

Tip: 이미지 Pull Error
쿠버네티스가 이미지를 내려받으려 할 때 인증이나 네트워크 문제로 실패할 수 있습니다.

  • Private Registry를 사용한다면 kubectl create secret docker-registry로 Pull secret을 설정 후 Deployment에 매핑해야 합니다.

4.3 Deployment & Service YAML

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: node-app-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: node-app
  template:
    metadata:
      labels:
        app: node-app
    spec:
      containers:
      - name: node-app
        image: my-node-app:1.0
        ports:
        - containerPort: 3000

service.yaml

apiVersion: v1
kind: Service
metadata:
  name: node-app-service
spec:
  type: NodePort
  selector:
    app: node-app
  ports:
    - port: 3000
      targetPort: 3000
      nodePort: 30001
  • Deployment: Pod 2개를 생성(replica = 2), app: node-app 라벨을 부여.
  • Service: NodePort로 30001을 할당해, http://:30001 로 접속 가능.

4.4 배포

kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
  • 결과: 2개의 Pod이 실행되고, Service를 통해 노드의 30001번 포트에서 Node.js 애플리케이션을 접근할 수 있습니다.

Tip: Minikube에서 NodePort 접근

  • minikube service node-app-service 명령을 실행하면 브라우저로 자동 접속하거나, IP/포트를 알려줍니다.
  • 혹은 minikube ip 명령으로 Cluster IP를 확인 후, http://<CLUSTER_IP>:30001로 접속하세요.

5. Swarm vs Kubernetes 간단 비교

항목 Docker Swarm Kubernetes

학습 난이도 상대적으로 쉬움 높음
생태계 & 확장성 제한적(기본 기능에 충실) 매우 풍부(Helm, Operators 등)
구성 난이도 Docker CLI 기반, 간단한 설정 YAML 매니페스트, 다양한 컴포넌트 설정 필요
자동화 & 기능성 스케일링, 롤링 업데이트 제공 오토스케일, 스토리지 플러그인, 네트워킹 등 풍부
보편적 인지도 일부 DevOps 팀에서 사용 업계 표준, 클라우드 네이티브 시대의 대세

Tip: 프로덕션 레벨 선택

  • 중소 규모 프로젝트: Swarm만으로도 충분한 경우가 많습니다(설정이 간단).
  • 대규모/클라우드 네이티브: Kubernetes가 더 폭넓은 기능, 커뮤니티, 생태계를 제공해 일반적 선택이 됩니다.

6. 실제 프로덕션에서 K8s 활용 시 고려사항

  1. 클라우드 제공 Managed K8s
    • AWS(EKS), GCP(GKE), Azure(AKS) 등에서 마스터 노드 관리, 자동 스케일링, 로드밸런서 통합 등을 지원합니다.
    • 인프라 관리 부담이 크게 줄어듭니다.
  2. Helm Chart
    • Kubernetes 애플리케이션 패키징 도구로, 여러 YAML 파일을 하나의 차트(Chart)로 묶어 배포.
    • 버전 관리, 의존성 관리가 편리해집니다.
  3. 이중화 & 롤백 전략
    • Pod 장애 시 자동 재시작, Node 장애 시 재스케줄링 등 기본 내결함성(HA)을 확보.
    • Canary Deployment, Blue-Green Deployment 같은 패턴도 지원.
  4. 보안 & 모니터링
    • RBAC(Role-Based Access Control), Network Policy, Secret, ConfigMap 등으로 세부적인 보안 설정 가능.
    • Prometheus, Grafana, ELK 스택 등 모니터링 & 로깅 솔루션과 잘 연동.

Tip: 도커 런타임 교체
최근 Kubernetes는 “Docker Shim” 지원이 중단되어, ContainerdCRI-O 같은 CRI(컨테이너 런타임 인터페이스) 호환 런타임을 권장합니다.
그러나 Docker Desktop 또는 Minikube, Kind 환경 등에서는 내부적으로 Containerd를 사용하므로, 사용자가 크게 신경 쓸 필요는 없습니다.


📝 정리

  1. Kubernetes 핵심: Pod, Service, Deployment 등 컨테이너 관리 자동화의 기본 단위를 이해해야 합니다.
  2. Docker와의 연계: Kubernetes에서 실행할 애플리케이션은 결국 Docker 이미지로 컨테이너화되어 있으며, 이를 YAML 매니페스트로 선언적 관리합니다.
  3. Swarm vs K8s: Swarm은 단순성과 빠른 학습을, Kubernetes는 강력한 확장성과 풍부한 생태계를 장점으로 합니다.
  4. 프로덕션 고려: Managed K8s, Helm, 클라우드 네이티브 인프라 도입이 일반적 추세입니다.

다음 강의 예고

다음 10강(마지막 강의)에서는 Docker 실전 프로젝트 형태로, 지금까지 배운 Docker Compose, Swarm, 혹은 Kubernetes를 활용해 실제 E2E(End-to-End) 배포 흐름을 간단히 구축해 보는 예시를 제시합니다.

Docker & Kubernetes의 개념을 종합해, 더 큰 확장성과 유연성을 갖춘 인프라를 구성해 보세요! 😊


더 알아보기: Kubernetes 공식 문서

 

728x90
반응형
LIST