이전 강의에서 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 이미지 로딩
- Minikube 환경 사용 시
- minikube image load my-node-app:1.0
- Minikube 내부 Docker 레지스트리에 해당 이미지를 로드합니다.
- Kind 환경 사용 시
- kind load docker-image my-node-app:1.0
- 쿠버네티스 클러스터가 별도 머신인 경우
- 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 활용 시 고려사항
- 클라우드 제공 Managed K8s
- AWS(EKS), GCP(GKE), Azure(AKS) 등에서 마스터 노드 관리, 자동 스케일링, 로드밸런서 통합 등을 지원합니다.
- 인프라 관리 부담이 크게 줄어듭니다.
- Helm Chart
- Kubernetes 애플리케이션 패키징 도구로, 여러 YAML 파일을 하나의 차트(Chart)로 묶어 배포.
- 버전 관리, 의존성 관리가 편리해집니다.
- 이중화 & 롤백 전략
- Pod 장애 시 자동 재시작, Node 장애 시 재스케줄링 등 기본 내결함성(HA)을 확보.
- Canary Deployment, Blue-Green Deployment 같은 패턴도 지원.
- 보안 & 모니터링
- RBAC(Role-Based Access Control), Network Policy, Secret, ConfigMap 등으로 세부적인 보안 설정 가능.
- Prometheus, Grafana, ELK 스택 등 모니터링 & 로깅 솔루션과 잘 연동.
Tip: 도커 런타임 교체
최근 Kubernetes는 “Docker Shim” 지원이 중단되어, Containerd나 CRI-O 같은 CRI(컨테이너 런타임 인터페이스) 호환 런타임을 권장합니다.
그러나 Docker Desktop 또는 Minikube, Kind 환경 등에서는 내부적으로 Containerd를 사용하므로, 사용자가 크게 신경 쓸 필요는 없습니다.
📝 정리
- Kubernetes 핵심: Pod, Service, Deployment 등 컨테이너 관리 자동화의 기본 단위를 이해해야 합니다.
- Docker와의 연계: Kubernetes에서 실행할 애플리케이션은 결국 Docker 이미지로 컨테이너화되어 있으며, 이를 YAML 매니페스트로 선언적 관리합니다.
- Swarm vs K8s: Swarm은 단순성과 빠른 학습을, Kubernetes는 강력한 확장성과 풍부한 생태계를 장점으로 합니다.
- 프로덕션 고려: Managed K8s, Helm, 클라우드 네이티브 인프라 도입이 일반적 추세입니다.
다음 강의 예고
다음 10강(마지막 강의)에서는 Docker 실전 프로젝트 형태로, 지금까지 배운 Docker Compose, Swarm, 혹은 Kubernetes를 활용해 실제 E2E(End-to-End) 배포 흐름을 간단히 구축해 보는 예시를 제시합니다.
Docker & Kubernetes의 개념을 종합해, 더 큰 확장성과 유연성을 갖춘 인프라를 구성해 보세요! 😊
더 알아보기: Kubernetes 공식 문서