Docker만으로 컨테이너를 운영하면 다음과 같은 문제들이 발생한다:
| 문제 | 설명 |
|---|---|
| 스케일링 | 트래픽 증가 시 수동으로 컨테이너를 올리고 연결해야 함 |
| 고가용성 | 컨테이너가 죽으면 직접 확인하고 다시 살려야 함 |
| 서비스 디스커버리 | 여러 컨테이너가 서로를 어떻게 찾을 것인가? |
| 로드밸런싱 | 트래픽 분산이 없으면 여러 컨테이너를 묶는 의미가 없음 |
| 배포 | 무중단 배포를 어떻게 구현할 것인가? |
Kubernetes는 선언적 구성을 통해 이 문제들을 해결한다.
컨테이너화된 워크로드와 서비스를 관리하기 위한 오픈소스 오케스트레이션 플랫폼
Docker (명령형)
docker run -d --name web -p 80:80 nginx
→ “web이라는 컨테이너에 nginx 이미지를 올려서 실행하고 포트는 80:80으로 열어”
Kubernetes (선언적)
# "나는 nginx 컨테이너가 3개 실행되길 원해"
spec:
replicas: 3
Kubernetes는 컨테이너 런타임 위에서 동작하며, Docker는 그 런타임 중 하나다.

Kubernetes 클러스터는 Control Plane과 Worker Node로 구성된다.

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