인프라 · Kubernetes
Kubernetes
컨테이너가 수십, 수백 개로 늘어나면 "어디에 띄우고, 죽으면 살리고, 트래픽 늘면 늘릴지"를 사람이 일일이 챙길 수 없습니다. Kubernetes(쿠버네티스, k8s)는 이 일을 자동으로 해주는 컨테이너 오케스트레이션 도구입니다.
한 줄로
Kubernetes? 는 Docker? 로 만든 이미지를 받아 여러 서버에 자동으로 배치하고, 죽으면 다시 살리고, 부하가 늘면 개수를 늘려 줍니다. 내가 "이 앱을 3개 띄워줘"라고 원하는 상태만 적어두면, 쿠버네티스가 알아서 그 상태를 맞춰 유지해요.
컨테이너가 "택배 상자"라면, 쿠버네티스는 "물류센터 자동화 시스템". 어느 트럭에 실을지, 사고 나면 어떻게 다시 보낼지, 주문이 몰리면 트럭을 몇 대 더 부를지를 사람 없이 알아서 처리합니다.
왜 / 어디에 쓰나
- 자동 복구 — 컨테이너나 서버가 죽어도 자동으로 다시 띄워 서비스 중단을 막음
- 확장(스케일) — 트래픽이 늘면 같은 앱의 복제본 개수를 늘리고, 줄면 줄임
- 무중단 배포 — 새 버전을 조금씩 교체(rolling update), 문제 생기면 되돌리기
- 서비스 디스커버리/로드밸런싱 — 여러 복제본 앞에 하나의 안정적인 주소를 제공
핵심 개념
| 개념 | 설명 |
|---|---|
| Pod(파드) | 쿠버네티스가 배치하는 가장 작은 단위. 보통 컨테이너 1개(때로 여러 개)를 담음. |
| Deployment | "이 Pod를 몇 개 유지해줘"를 선언. 복제본 수 관리·롤링 업데이트·롤백 담당. |
| Service | 여러 Pod 앞에 두는 고정 접점(주소). Pod가 바뀌어도 같은 이름으로 접근·부하 분산. |
| Node / Cluster | Pod가 실제로 도는 서버 한 대가 Node, 그 Node들의 모음이 Cluster. |
기본 명령 (kubectl)
클러스터를 다루는 명령줄 도구는 kubectl 입니다.
kubectl get pods # 실행 중인 Pod 목록 kubectl get deployments # Deployment 목록 kubectl get services # Service 목록 kubectl logs <pod-name> # Pod 로그 보기 kubectl describe pod <pod-name> # Pod 상세 상태/이벤트 kubectl exec -it <pod-name> -- bash # Pod 안으로 들어가기 # 복제본 개수 늘리기 (수동 스케일) kubectl scale deployment myapp --replicas=3 # 매니페스트(yaml) 적용 kubectl apply -f deployment.yaml
Deployment 예시 (yaml)
Docker로 빌드한 myapp:1.0 이미지를 3개 띄우는 선언입니다.
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3 # Pod 3개 유지
selector:
matchLabels: { app: myapp }
template:
metadata:
labels: { app: myapp }
spec:
containers:
- name: myapp
image: myapp:1.0 # Docker로 빌드한 이미지
ports:
- containerPort: 8080Docker와의 관계
Docker가 앱을 이미지로 굽고 컨테이너 하나를 띄우는 도구라면, 쿠버네티스는 그 이미지를 여러 서버에 걸쳐 많이, 자동으로 굴리는 도구입니다. 그래서 보통 Docker를 먼저 익히고 그 다음 단계로 쿠버네티스를 배웁니다.