StatefulSet, DaemonSet, Job, CronJob

Kubernetes의 다양한 워크로드 리소스 완벽 가이드


Kubernetes의 다양한 워크로드 리소스 완벽 가이드

목표: 상황에 맞는 워크로드 타입을 선택하고 구성할 수 있는 수준


🗃️ StatefulSet

Deployment vs StatefulSet

graph LR
    subgraph "Deployment"
        D1["web-5d4f8b7c9-x2z4"]
        D2["web-5d4f8b7c9-a1b2"]
        D3["web-5d4f8b7c9-c3d4"]
    end
    
    subgraph "StatefulSet"
        S1["mysql-0"]
        S2["mysql-1"]
        S3["mysql-2"]
    end
    
    style S1 fill:#f9f
    style S2 fill:#f9f
    style S3 fill:#f9f
특징DeploymentStatefulSet
이름무작위순차적 (0, 1, 2…)
생성/삭제동시순차적
볼륨공유 가능각 Pod 독립
네트워크동적 IP고정 DNS (헤드리스 서비스)

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

헤드리스 서비스

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  selector:
    app: mysql
  ports:
  - port: 3306
  clusterIP: None  # 헤드리스

DNS 이름:

  • mysql-0.mysql.default.svc.cluster.local
  • mysql-1.mysql.default.svc.cluster.local

👥 DaemonSet

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

graph TB
    subgraph "Node 1"
        D1["📊 node-exporter"]
    end
    
    subgraph "Node 2"
        D2["📊 node-exporter"]
    end
    
    subgraph "Node 3"
        D3["📊 node-exporter"]
    end
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

사용처:

  • 모니터링 에이전트 (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

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-04-Deployment-관리 — 기본 워크로드
  • 02-06-PV-PVC-StorageClass — 스토리지
  • 02-11-Pod-실패-원인-분석 — 트러블슈팅

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