Skip to content

StatefulSet vs DaemonSet

Trong Kubernetes, không phải Workload nào cũng có thể chạy như "gia súc" (Deployments). Có những ứng dụng cần danh tính (Identity), và có những ứng dụng cần phủ sóng toàn cầu (Global Coverage).

💡 The Battlefield Analogy

Để dễ hình dung, hãy tưởng tượng Cluster của bạn là một chiến trường:

  • Deployment: Là Bộ binh (Infantry). Đông đảo, mặc đồng phục giống hệt nhau, chết thì thay người khác vào, không ai quan tâm tên tuổi.
  • StatefulSet: Là Biệt kích / Lính bắn tỉa (Specialists). Mỗi người có tên hiệu riêng (007, John Wick). Họ hoạt động theo kỷ luật nghiêm ngặt, vị trí số 1 phải vào vị trí trước thì số 2 mới được theo sau.
  • DaemonSet: Là Camera an ninh (Security Cameras). Mỗi phòng (Node) phải lắp đúng 1 cái. Xây thêm phòng mới -> Tự động lắp thêm Camera mới.

1. StatefulSet: The "Pets" (Thú cưng)

Khi nào dùng?

Dành cho Stateful Applications - những ứng dụng cần lưu giữ trạng thái hoặc định danh.

  • Databases: PostgreSQL, MySQL, Redis, MongoDB.
  • Distributed Systems: Kafka, Zookeeper, Elasticsearch.

Đặc điểm cốt lõi (Key Differences)

Khác với Deployment tạo ra Pod có tên ngẫu nhiên (web-xh71z, web-9q1b2), StatefulSet tạo ra Pod có Sticky Identity (Danh tính cố định).

  1. Predictable Names (Tên đoán được):

    • Tên Pod luôn theo thứ tự: web-0, web-1, web-2.
    • Dù Pod chết đi sống lại, nó vẫn giữ nguyên cái tên web-0. Đây là điều cốt tử để các Database Cluster nhận diện nhau (Ai là Master? Ai là Slave?).
  2. Ordered Deployment (Kỷ luật thép):

    • Deployment: Start 3 Pods cùng lúc (Parallel).
    • StatefulSet: Start tuần tự từ 0 -> n.
      • web-0 phải Ready thì web-1 mới được start.
      • web-1 phải Ready thì web-2 mới được start.
    • Scale Down: Ngược lại, giết từ n -> 0 (Shutdown web-2 xong mới giết web-1).
  3. Persistent Storage:

    • Mỗi Pod sẽ gắn với một PVC riêng biệt. Nếu Pod web-0 chết và hồi sinh ở Node khác, nó vẫn sẽ tìm lại đúng cái ổ cứng PVC của nó (Dữ liệu không bị mất).
yaml
kind: StatefulSet
metadata:
  name: redis
spec:
  serviceName: "redis"
  replicas: 3
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - name: redis
        image: redis:alpine

2. DaemonSet: The "Global Agents"

Khi nào dùng?

Dành cho các Cluster Services cần chạy trên MỌI Node (hoặc một nhóm Node cụ thể).

  • Log Collectors: Fluentd, Logstash (Thu thập log của tất cả Pod trên Node đó).
  • Monitoring Agents: Prometheus Node Exporter (Đo CPU/RAM của Node).
  • Network Plugins: Calico, Flannel (Quản lý mạng cho Node).

Cơ chế hoạt động

DaemonSet đảm bảo quy tắc: Node nào cũng có phần.

  1. One Pod per Node:

    • Bạn không khai báo replicas. K8s tự đếm số Node và chạy mỗi Node 1 Pod.
    • Nếu Cluster có 100 Node -> Có 100 Pod DaemonSet.
  2. Auto-Scheduling (Tự động mở rộng):

    • Khi bạn mua thêm 1 server mới (Join Node) vào Cluster:
      • Deployment: Không quan tâm (trừ khi Node cũ hết chỗ).
      • DaemonSet: Lập tức tạo ngay 1 Pod mới trên Node vừa vào.
    • Khi xóa Node: Pod DaemonSet trên đó tự hủy (Garbage Collection).
yaml
kind: DaemonSet
metadata:
  name: fluentd
spec:
  selector:
    matchLabels:
      name: fluentd
  template:
    metadata:
      labels:
        name: fluentd
    spec:
      containers:
      - name: fluentd
        image: fluentd:latest

3. Deployment vs StatefulSet vs DaemonSet

FeatureDeploymentStatefulSetDaemonSet
IdentityRandom (app-x7z1)Cố định (app-0)Random
ReplicaUser định nghĩa (n)User định nghĩa (n)1 per Node
StrategyParallel (Nhanh)Ordered (Tuần tự)Parallel
StorageChia sẻ (Shared)Độc lập (Per Pod)N/A
Best forWeb, API, WorkerDB, KafkaLogs, Monitor

⚠️ Critical Thinking

Đừng lạm dụng StatefulSet cho Web App chỉ vì bạn muốn cái tên đẹp (web-0). StatefulSet rất "nặng nề" trong việc quản lý và upgrade. Luôn ưu tiên Deployment nếu ứng dụng của bạn là Stateless.


👉 Next: Understanding Services & Stable IP