플랫폼, 데브옵스와 클라우드

Pod와 Deployment

meellon 2026. 6. 23. 07:00

학습 목표

Pod가 K8s 스케줄·네트워크·볼륨의 최소 단위임을 설명할 수 있다.

DeploymentReplicaSet을 통해 복제 수롤링 업데이트를 관리함을 설명할 수 있다.

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)
  • restartPolicyAlways(기본), OnFailure, Never
  • 컨테이너 crash 시 kubelet이 정책에 따라 재시작
  • kubectl get podsSTATUS, 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