Deployment 관리

Kubernetes 워크로드 리소스의 생성, 업데이트, 롤백 완벽 가이드


Kubernetes 워크로드 리소스의 생성, 업데이트, 롤백 완벽 가이드

목표: 무중단 배포와 롤백을 자신있게 수행할 수 있는 수준


📦 Deployment

기본 구조

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80

주요 명령어

# 생성
kubectl apply -f deployment.yaml

# 상태 확인
kubectl get deployment nginx-deployment
kubectl get pods -l app=nginx

# 상세 정보
kubectl describe deployment nginx-deployment

# 스케일링
kubectl scale deployment nginx-deployment --replicas=5

# 이미지 업데이트
kubectl set image deployment/nginx-deployment nginx=nginx:1.26

# 롤백
kubectl rollout undo deployment/nginx-deployment

# 롤아웃 히스토리
kubectl rollout history deployment/nginx-deployment

# 특정 버전으로 롤백
kubectl rollout undo deployment/nginx-deployment --to-revision=2

# 롤아웃 상태 모니터링
kubectl rollout status deployment/nginx-deployment

롤링 업데이트 전략

spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 25%        # 최대 초과 Pod 수
      maxUnavailable: 25%  # 최대 불가능 Pod 수
전략설명사용처
RollingUpdate점진적 교체 (기본)일반적
Recreate모두 삭제 후 재생성동시 실행 불가

🗃️ StatefulSet

Deployment vs StatefulSet

특징DeploymentStatefulSet
이름무작위 (nginx-5d4f8b7c9-x2z4)순차적 (mysql-0, mysql-1)
볼륨공유 가능각 Pod 독립 (PVC 템플릿)
삭제동시역순 (mysql-1 → mysql-0)
헤드리스 서비스불필요필요 (네트워크 ID 고정)

StatefulSet 예시

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: "mysql"
  replicas: 3
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0
        ports:
        - containerPort: 3306
        volumeMounts:
        - name: data
          mountPath: /var/lib/mysql
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 10Gi
# StatefulSet 확인
kubectl get statefulset mysql
kubectl get pods -l app=mysql
# mysql-0, mysql-1, mysql-2 (순서대로 생성)

# PVC 확인
kubectl get pvc -l app=mysql
# data-mysql-0, data-mysql-1, data-mysql-2

👥 DaemonSet

역할: 모든 (또는 일부) 노드에 Pod 1개씩 실행.

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
spec:
  selector:
    matchLabels:
      app: node-exporter
  template:
    metadata:
      labels:
        app: node-exporter
    spec:
      containers:
      - name: node-exporter
        image: prom/node-exporter:latest
        ports:
        - containerPort: 9100
# DaemonSet 확인
kubectl get daemonset node-exporter

# 모든 노드에 실행 중인지 확인
kubectl get pods -o wide -l app=node-exporter

사용처:

  • 모니터링 에이전트 (node-exporter)
  • 로그 수집기 (fluentd, filebeat)
  • 네트워크 프록시 (CNI)

⏰ Job / CronJob

Job (일회성 작업)

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl:5.34
        command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4
# Job 실행 및 확인
kubectl apply -f job.yaml
kubectl get jobs
kubectl logs job/pi

CronJob (주기적 작업)

apiVersion: batch/v1
kind: CronJob
metadata:
  name: backup
spec:
  schedule: "0 2 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: backup
            image: busybox
            command: ["/bin/sh", "-c", "echo Backup started"]
          restartPolicy: OnFailure
# CronJob 확인
kubectl get cronjobs
kubectl get jobs --watch

📋 워크로드 선택 가이드

워크로드사용처예시
Deployment상태없는 앱웹 서버, API
StatefulSet상태유지 앱DB, 메시지큐
DaemonSet노드당 1개모니터링, 로그
Job일회성 작업데이터 마이그레이션
CronJob주기적 작업백업, 리포트

🔗 관련 노트

  • 01-02-Pod-생명주기 — Pod 상태 관리
  • 01-06-Service-타입 — 서비스 노출
  • 02-06-PV-PVC-StorageClass — 스토리지
  • 02-11-Pod-실패-원인-분석 — 트러블슈팅

마지막 업데이트: 2026-06-01