Phase 6레슨 29
Kubernetes
Pod, Service, Deployment, Ingress, HPA — 컨테이너 오케스트레이션
💡ELI5·
오케스트라 지휘자와 Kubernetes
Kubernetes Cluster
├── Control Plane (지휘자)
│ ├── API Server
│ ├── Scheduler (Pod를 어디에 배치?)
│ ├── Controller Manager (상태 유지)
│ └── etcd (클러스터 상태 저장)
└── Worker Nodes (악단)
├── Pod 1 (주문 서비스)
├── Pod 2 (주문 서비스)
└── Pod 3 (결제 서비스)💡 비유 — Kubernetes = 오케스트라 지휘자. 악단(Node)에 있는 악기(Pod/Container)를 조율. 누가 어디서 연주할지(Scheduler), 악기가 고장 나면 교체(Controller), 전체 균형 유지. 지휘자가 없으면 악기마다 제멋대로 연주.
🔬Deep Dive·
핵심 리소스
| 리소스 | 역할 | 비유 |
|---|---|---|
| Pod | 컨테이너 그룹 (최소 배포 단위) | 악기 하나 |
| Deployment | Pod의 복제본 수 + 업데이트 관리 | 악기 파트 관리 |
| Service | Pod에 대한 고정 IP + 로드 밸런싱 | 악기 파트 입구 |
| Ingress | 외부 트래픽을 Service로 라우팅 (HTTP) | 공연장 입구 |
| ConfigMap/Secret | 설정/비밀 정보 주입 | 악보 / 비밀 지시 |
| HPA | CPU/메트릭 기반 Pod 수 자동 조정 | 악기 수 조절 |
💻Code·
Deployment + Service 예시
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-service
spec:
replicas: 3 # 3개 Pod 유지
selector:
matchLabels:
app: order-service
template:
metadata:
labels:
app: order-service
spec:
containers:
- name: order
image: order-service:v2
ports:
- containerPort: 8080
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
---
apiVersion: v1
kind: Service
metadata:
name: order-service
spec:
selector:
app: order-service
ports:
- port: 80
targetPort: 8080
type: ClusterIP # 클러스터 내부 IP🔬Deep Dive·
HPA (Horizontal Pod Autoscaler)
HPA 주기적 확인 (15초):
CPU 사용률 > 70% → Pod 증가 (최대 10개)
CPU 사용률 < 30% → Pod 감소 (최소 3개)
트래픽 3배 증가:
Pod 3개 (CPU 90%) → Pod 6개 (CPU 45%) → Pod 9개 (CPU 30%)
주의: 메트릭 수집 지연으로 초기 1-2분은 과부하 가능⚖️Trade-off·
Kubernetes의 Trade-off
| 이점 | 대가 |
|---|---|
| 자동 확장/축소 | 학습 곡선 매우 가파름 |
| 자가 치유 (Pod 재시작) | 컨트롤 플레인 관리 복잡 |
| 선언적 설정 (GitOps) | Stateful 워크로드에 부적합 |
| 멀티 클라우드 이식성 | 작은 서비스에 과도함 |
Kubernetes는 '언제'가 아니라 '필요한가?'를 먼저 물어야 한다. 관리형(EKS/GKE)을 써도 운영 부담이 크다.
❓ 체크포인트 질문
- 1.Pod가 컨테이너가 아닌 컨테이너 그룹인 이유는?
- 2.Service가 필요한 이유는?
- 3.Deployment가 Pod를 직접 관리하지 않고 ReplicaSet을 거치는 이유는?
- 4.HPA(Horizontal Pod Autoscaler)의 동작은?
- 5.Kubernetes가 만능이 아닌 이유는?