Giao diện
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).
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?).
- Tên Pod luôn theo thứ tự:
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-0phải Ready thìweb-1mới được start.web-1phải Ready thìweb-2mới được start.
- Scale Down: Ngược lại, giết từ n -> 0 (Shutdown
web-2xong mới giếtweb-1).
Persistent Storage:
- Mỗi Pod sẽ gắn với một PVC riêng biệt. Nếu Pod
web-0chế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).
- Mỗi Pod sẽ gắn với một PVC riêng biệt. Nếu Pod
yaml
kind: StatefulSet
metadata:
name: redis
spec:
serviceName: "redis"
replicas: 3
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:alpine2. 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.
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.
- Bạn không khai báo
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).
- Khi bạn mua thêm 1 server mới (Join Node) vào Cluster:
yaml
kind: DaemonSet
metadata:
name: fluentd
spec:
selector:
matchLabels:
name: fluentd
template:
metadata:
labels:
name: fluentd
spec:
containers:
- name: fluentd
image: fluentd:latest3. Deployment vs StatefulSet vs DaemonSet
| Feature | Deployment | StatefulSet | DaemonSet |
|---|---|---|---|
| Identity | Random (app-x7z1) | Cố định (app-0) | Random |
| Replica | User định nghĩa (n) | User định nghĩa (n) | 1 per Node |
| Strategy | Parallel (Nhanh) | Ordered (Tuần tự) | Parallel |
| Storage | Chia sẻ (Shared) | Độc lập (Per Pod) | N/A |
| Best for | Web, API, Worker | DB, Kafka | Logs, 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.