쿠버네티스란
쿠버네티스(Kubernetes, 줄여서 K8s)는 컨테이너화된 애플리케이션의 배포, 확장, 관리를 자동화해주는 오픈소스 플랫폼입니다.
원래 Google이 내부에서 사용하던 Borg 시스템에서 출발했고, 2014년에 오픈소스로 공개되었습니다. 현재는 CNCF(Cloud Native Computing Foundation)에서 관리하고 있습니다.
왜 필요한가
Docker로 컨테이너를 만드는 건 어렵지 않습니다. 하지만 컨테이너가 수십, 수백 개로 늘어나면 이런 문제가 생깁니다:
- 컨테이너가 죽으면 누가 다시 띄워주지?
- 트래픽이 몰리면 자동으로 늘릴 수 없을까?
- 여러 서버에 컨테이너를 어떻게 분배하지?
- 무중단 배포는 어떻게 하지?
쿠버네티스는 이 모든 걸 자동으로 처리해줍니다. 한마디로, 컨테이너들의 지휘자(오케스트레이터) 역할입니다.
핵심 개념
Pod
컨테이너를 감싸는 가장 작은 배포 단위입니다. 보통 하나의 Pod에 하나의 컨테이너가 들어갑니다. 아파트로 비유하면 한 세대에 해당합니다.
Node
Pod가 실행되는 물리/가상 서버입니다. 아파트 한 동이라고 생각하면 됩니다.
Cluster
여러 Node를 묶은 전체 시스템입니다. 아파트 단지 전체에 해당합니다.
Deployment
“이 앱을 몇 개 띄울지, 어떤 이미지를 쓸지” 같은 선언을 담은 설정입니다. 쿠버네티스가 이 선언을 보고 알아서 상태를 맞춰줍니다.
Service
Pod들에 접근할 수 있는 안정적인 네트워크 주소를 제공합니다. Pod는 수시로 생성/삭제되지만, Service는 고정된 진입점 역할을 합니다.
간단한 배포 흐름
# 1. Deployment 생성 (nginx 3개 띄우기)
kubectl create deployment my-app --image=nginx --replicas=3
# 2. 외부에서 접근 가능하도록 Service 노출
kubectl expose deployment my-app --port=80 --type=LoadBalancer
# 3. 상태 확인
kubectl get pods
kubectl get services
이 세 줄이면 로드밸런서 뒤에 nginx 3대가 떠 있는 환경이 만들어집니다.
언제 쓰면 좋고, 언제 과한가
쿠버네티스가 적합한 경우:
- 마이크로서비스 아키텍처를 운영할 때
- 트래픽 변동이 크고 자동 스케일링이 필요할 때
- 여러 팀이 독립적으로 배포해야 할 때
굳이 안 써도 되는 경우:
- 서비스가 1~2개이고 트래픽이 적을 때
- 팀 규모가 작고 단순한 배포로 충분할 때
- 서버리스(Lambda, Cloud Functions)로 해결 가능한 경우
학습 곡선이 꽤 가파르기 때문에, 규모가 작다면 Docker Compose나 단일 서버 배포가 더 현실적일 수 있습니다.
마무리
쿠버네티스는 컨테이너 운영의 사실상 표준이 되었습니다. 당장 프로덕션에 도입하지 않더라도, 개념을 알아두면 인프라 관련 대화에서 길을 잃지 않습니다.
다음에 공부하면 좋을 것들:
- ArgoCD — GitOps 기반 배포 자동화
- Ingress — 외부 트래픽 라우팅 규칙 관리
하나씩 천천히 파보면 됩니다. 화이팅!