⚙️ ReplicaSet, StatefulSet, DaemonSet 차이점 쉽게 이해하기

쿠버네티스(Kubernetes)는 애플리케이션을 자동으로 관리해주는 똑똑한 시스템이에요.
그중에서도 Pod를 어떻게 배치하고 유지할지를 담당하는 것이 바로 컨트롤러(controller)입니다.

이번 글에서는 대표적인 세 가지 컨트롤러인 ReplicaSet, StatefulSet, DaemonSet을 비교해보고,
각각의 목적, 사용 시나리오, 동작 방식을 고등학생도 이해할 수 있도록 쉽게 설명해볼게요.


🤖 컨트롤러란?

먼저 컨트롤러가 무엇인지부터 살펴볼게요.

컨트롤러는 “원하는 상태”를 유지하도록 Pod를 자동으로 관리해주는 쿠버네티스의 관리자입니다.

예를 들어, 내가 “항상 3개의 웹서버가 떠 있어야 해!”라고 명령하면,
컨트롤러는 Pod가 하나 꺼지더라도 다시 자동으로 새로 띄워줘요.


🧱 ReplicaSet이란?

✅ 목적: 같은 Pod 여러 개를 유지하기 위한 컨트롤러

✅ 예시 상황

웹 서버를 3개 띄워서 여러 사람이 동시에 들어와도 빠르게 처리하고 싶을 때

🔄 동작 방식

  • 내가 원하는 개수의 Pod(예: 3개)를 설정하면, ReplicaSet이 자동으로 그 수를 유지해줘요.
  • Pod가 하나 꺼지면? → 새로운 Pod를 자동으로 생성!
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: web-replicaset
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx

🏷️ StatefulSet이란?

✅ 목적: 순서와 이름이 중요한 Pod를 다룰 때 사용하는 컨트롤러

✅ 예시 상황

  • 데이터베이스처럼 각 Pod가 고유한 이름을 갖고, 순서대로 켜지고 꺼져야 할 때
  • 예: Kafka, MySQL, MongoDB 클러스터 구성 시

🧠 특징

  • Pod 이름이 myapp-0, myapp-1, myapp-2처럼 고정됨
  • 삭제했다가 다시 만들어도 이름과 데이터 유지됨
  • 순서대로 생성되고 삭제됨 (0 → 1 → 2 순으로 생성, 반대 순으로 삭제)
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: db-stateful
spec:
  serviceName: "db"
  replicas: 3
  selector:
    matchLabels:
      app: db
  template:
    metadata:
      labels:
        app: db
    spec:
      containers:
      - name: mysql
        image: mysql:5.7

🛠️ DaemonSet이란?

✅ 목적: 모든 Node(서버)마다 하나씩 Pod를 띄우고 싶을 때 사용하는 컨트롤러

✅ 예시 상황

  • 모든 서버에서 로그 수집기, 모니터링 에이전트를 실행하고 싶을 때
  • 예: Fluentd, Prometheus Node Exporter

🌍 특징

  • 클러스터에 Node가 5개 있다면? → Pod도 5개!
  • Node가 추가되면? → 자동으로 새로운 Node에도 Pod가 실행됨
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: log-agent
spec:
  selector:
    matchLabels:
      app: logger
  template:
    metadata:
      labels:
        app: logger
    spec:
      containers:
      - name: fluentd
        image: fluent/fluentd

🧾 비교 요약표

항목 ReplicaSet StatefulSet DaemonSet
목적 동일한 Pod를 여러 개 유지 고유한 Pod 이름과 순서 관리 모든 Node마다 Pod 실행
Pod 이름 랜덤 고정 (ex: app-0, app-1) 랜덤
실행 순서 상관없음 순서 보장 모든 Node에서 자동 실행
저장 데이터 저장소 유지 안 함 각 Pod가 자신의 저장소 유지 주로 로그나 모니터링용
예시 용도 웹 서버, API 서버 데이터베이스, 메시지 브로커 로그 수집, 보안 검사, 모니터링

🖼️ 그림으로 이해하기

ReplicaSet 구조

     +---------------------+
     |     ReplicaSet      |
     +---------------------+
          |    |    |
        Pod  Pod  Pod

StatefulSet 구조

     +----------------------+
     |     StatefulSet      |
     +----------------------+
          |     |     |
      Pod-0  Pod-1  Pod-2   (순서 보장, 이름 고정)

DaemonSet 구조

+——–+ +——–+ +——–+ | Node 1 | | Node 2 | | Node 3 | | Pod | | Pod | | Pod | +——–+ +——–+ +——–+


📚 마무리 요약

  • ReplicaSet: 똑같은 Pod 여러 개 유지할 때 (예: 웹 서버)
  • StatefulSet: 순서와 이름이 중요한 경우 (예: 데이터베이스)
  • DaemonSet: 모든 서버마다 Pod를 하나씩 실행하고 싶을 때 (예: 로그 수집기)

🎓 이 세 가지 컨트롤러만 잘 이해해도, 쿠버네티스를 훨씬 쉽게 다룰 수 있어요!


📎 참고자료:

  • https://kubernetes.io/docs/concepts/workloads/controllers/
  • 한국폴리텍대학 강의자료