학습 목표
Pod가 K8s 스케줄·네트워크·볼륨의 최소 단위임을 설명할 수 있다.
Deployment가 ReplicaSet을 통해 복제 수와 롤링 업데이트를 관리함을 설명할 수 있다.
liveness·readiness probe 차이와 실무 설정 포인트를 설명할 수 있다.
kubectl rollout으로 업데이트·롤백 흐름을 설명할 수 있다.
문제 상황
docker run으로 띄운 컨테이너가 죽으면 그냥 멈춘다- K8s는 재시작·재스케줄을 기대한다
- Pod 하나만
apply했는데 노드 장애 시 서비스 중단- replicas와 다른 노드 배치가 필요하다
- 이미지
v2로 바꿨더니 잠깐 503이 났다- 무중단 rolling update·readiness 설정 이슈
- liveness만 넣었더니 시작 중인 Pod가 계속 재시작된다
- readiness 없이 트래픽이 준비 안 된 Pod로 간다
- ReplicaSet과 Deployment를 둘 다 써야 하는지 헷갈린다
- 일반 앱은 Deployment만 다루면 된다
K8s 개요에서 control plane·선언적 API를 봤다. 이번 편은 워크로드의 기본 단위 Pod와 운영에서 가장 많이 쓰는 Deployment다.
1. Pod란
Pod — 1개 이상 컨테이너가 공유 네트워크·스토리지를 갖는 K8s 최소 배포 단위.

| 특징 | 설명 |
|---|---|
| 공유 네트워크 | Pod IP 하나, localhost로 컨테이너 간 통신 |
| 공유 볼륨 | emptyDir, configMap volume 등 마운트 공유 |
| 일시적 | 스케줄·재시작 시 새 Pod (이름·IP 변경) |
| 원자 단위 | Pod 안 컨테이너는 같은 노드에 함께 뜬다 |
apiVersion: v1
kind: Pod
metadata:
name: api
spec:
containers:
- name: app
image: my/api:1.0.0
ports:
- containerPort: 8080
- 사이드카 패턴 — 로그 수집·프록시를 같은 Pod의 두 번째 컨테이너로
- 프로덕션에서는 Pod를 직접 만들기보다 Deployment가 생성하게 둔다
2. Pod 생명주기
| Phase | 의미 |
|---|---|
| Pending | 스케줄 대기·이미지 pull 중 |
| Running | 최소 1컨테이너 실행 중 |
| Succeeded | 모든 컨테이너 정상 종료 (Job 등) |
| Failed | 컨테이너 비정상 종료 |
| Unknown | 노드와 통신 불가 |
Pending → Running → (Succeeded | Failed)
- restartPolicy —
Always(기본),OnFailure,Never - 컨테이너 crash 시 kubelet이 정책에 따라 재시작
kubectl get pods—STATUS,RESTARTS,AGE로 상태 확인
3. ReplicaSet과 Deployment
ReplicaSet — Pod 레이블 셀렉터에 맞는 Pod 수를 desired replicas에 맞춘다.
Deployment — ReplicaSet을 소유하고, 롤링 업데이트·롤백을 제공한다.

| 리소스 | 역할 |
|---|---|
| Deployment | 선언적 업데이트, rollout history |
| ReplicaSet | replicas: N 유지 |
| Pod | 실제 컨테이너 프로세스 |
apiVersion: apps/v1
kind: Deployment
metadata:
name: api
labels:
app: api
spec:
replicas: 3
selector:
matchLabels:
app: api
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
labels:
app: api
spec:
containers:
- name: app
image: my/api:1.2.0
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /health/ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
livenessProbe:
httpGet:
path: /health/live
port: 8080
initialDelaySeconds: 15
periodSeconds: 10
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
전체 manifest 참고.
- Pod 하나가 삭제되면 ReplicaSet 컨트롤러가 새 Pod 생성
kubectl scale deployment api --replicas=5— desired state 변경
4. 롤링 업데이트와 롤백
이미지 태그를 바꾸면 Deployment가 점진적으로 Pod를 교체한다.

spec.strategy |
동작 |
|---|---|
| RollingUpdate (기본) | 일부씩 새 Pod 기동 → 구 Pod 종료 |
| Recreate | 전부 종료 후 새로 기동 (다운타임) |
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
| 파라미터 | 의미 |
|---|---|
| maxSurge | desired보다 추가로 띄울 수 있는 Pod 수 |
| maxUnavailable | 업데이트 중 내려갈 수 있는 Pod 수 |
kubectl set image deployment/api app=my/api:1.3.0
kubectl rollout status deployment/api
kubectl rollout history deployment/api
kubectl rollout undo deployment/api
maxUnavailable: 0— capacity 유지하며 교체 (readiness 필수)- 실패 시 이전 ReplicaSet으로
undo
5. Liveness와 Readiness Probe
| Probe | 질문 | 실패 시 |
|---|---|---|
| liveness | 프로세스가 살아 있는가 | 컨테이너 재시작 |
| readiness | 트래픽 받을 준비 됐는가 | Service 엔드포인트에서 제외 |
containers:
- name: app
image: my/api:1.2.0
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /health/ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
livenessProbe:
httpGet:
path: /health/live
port: 8080
initialDelaySeconds: 15
periodSeconds: 10
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
| 타입 | 용도 |
|---|---|
| httpGet | HTTP 상태 코드 200~399 |
| tcpSocket | 포트 연결 가능 여부 |
| exec | 명령 exit 0 |
- readiness 없으면 — 시작 중 Pod에 요청 → 503
- liveness 너무 공격적 — DB warm-up 중 재시작 루프
initialDelaySeconds·failureThreshold로 시작 시간 반영
6. 실무 체크리스트
| 항목 | 권장 |
|---|---|
| 워크로드 | Stateless API → Deployment |
| 복제 | replicas >= 2, PDB는 이후 편 |
| 리소스 | requests/limits 설정 (스케줄링 편) |
| probe | readiness 필수, liveness는 hang 감지용 |
| 이미지 | 태그 latest 지양, digest·semver 태그 |
| 보안 | 4편 — non-root, readOnlyRootFilesystem Pod spec에 반영 |
kubectl get deploy,rs,pods -l app=api
kubectl describe pod <name> # Events, probe 실패 이유
7. 정리
- Pod — 스케줄 단위, 컨테이너·네트워크·볼륨 공유
- ReplicaSet — replica 수 유지, Deployment — 업데이트·히스토리
- RollingUpdate — 무중단 교체,
maxSurge/maxUnavailable로 속도·가용성 조절 - readiness — 트래픽 게이트, liveness — 재시작 트리거
- Pod 직접 관리보다 Deployment + manifest가 운영 표준
다음에 다룰 것
- Service와 Ingress
- ClusterIP, LoadBalancer, L7 라우팅, TLS 종료
해당 내용은 Kubernetes Documentation (kubernetes.io) 의 내용을 기반으로 합니다.
'플랫폼, 데브옵스와 클라우드' 카테고리의 다른 글
| ConfigMap과 Secret (0) | 2026.06.25 |
|---|---|
| Service와 Ingress (0) | 2026.06.24 |
| Kubernetes 개요 (0) | 2026.06.22 |
| 컨테이너 런타임과 보안 (0) | 2026.06.21 |
| Docker 기초 (0) | 2026.06.20 |