1. 개요

Docker만 사용할 때의 문제점

Docker만으로 컨테이너를 운영하면 다음과 같은 문제들이 발생한다:

문제 설명
스케일링 트래픽 증가 시 수동으로 컨테이너를 올리고 연결해야 함
고가용성 컨테이너가 죽으면 직접 확인하고 다시 살려야 함
서비스 디스커버리 여러 컨테이너가 서로를 어떻게 찾을 것인가?
로드밸런싱 트래픽 분산이 없으면 여러 컨테이너를 묶는 의미가 없음
배포 무중단 배포를 어떻게 구현할 것인가?

Kubernetes는 선언적 구성을 통해 이 문제들을 해결한다.


1.1 Kubernetes란?

컨테이너화된 워크로드와 서비스를 관리하기 위한 오픈소스 오케스트레이션 플랫폼

명령형 vs 선언적 구성

Docker (명령형)

docker run -d --name web -p 80:80 nginx

→ “web이라는 컨테이너에 nginx 이미지를 올려서 실행하고 포트는 80:80으로 열어”

Kubernetes (선언적)

# "나는 nginx 컨테이너가 3개 실행되길 원해"
spec:
  replicas: 3

1.2 Docker와의 관계

Kubernetes는 컨테이너 런타임 위에서 동작하며, Docker는 그 런타임 중 하나다.


2. 아키텍처 이해

2.1 클러스터 구조

Kubernetes 클러스터는 Control PlaneWorker Node로 구성된다.

Control Plane 컴포넌트

컴포넌트 역할
API Server 모든 통신의 중심점. kubectl 명령을 받음
etcd 클러스터의 모든 상태를 저장하는 분산 key-value 저장소
Scheduler 새 Pod를 어느 노드에 배치할지 결정
Controller Manager 클러스터 상태를 원하는 대로 유지

Worker Node 컴포넌트

컴포넌트 역할
kubelet 노드의 에이전트. Pod의 생성/삭제를 담당

핵심 정리

  1. Kubernetes가 필요한 이유: Docker만으로는 스케일링, 고가용성, 서비스 디스커버리, 로드밸런싱, 무중단 배포가 어렵다
  2. 선언적 구성: “어떻게”가 아닌 “무엇을” 원하는지 선언하면 Kubernetes가 알아서 처리
  3. 아키텍처: Control Plane이 전체를 관리하고, Worker Node에서 실제 워크로드가 실행됨