Việc lựa chọn giữa Deployment và StatefulSet trong Kubernetes sẽ ảnh hưởng đến cách ứng dụng của bạn hoạt động, mở rộng và khôi phục khi gặp sự cố. Cả hai đều là controller để quản lý pod, nhưng phục vụ cho các trường hợp sử dụng khác nhau. Trong hướng dẫn này, bạn sẽ học được các điểm khác biệt chính, xem các ví dụ thực tế và nhận lời khuyên về thời điểm nên sử dụng từng loại.
Yêu cầu kiến thức trước
Bạn cần có:
- Hiểu biết cơ bản về các khái niệm Kubernetes (pods, services, controllers)
- Có quyền truy cập vào một cụm Kubernetes để thử nghiệm thực hành (tùy chọn)
Deployment là gì?
Deployment quản lý các ứng dụng không trạng thái (stateless). Nó đảm bảo rằng một số lượng bản sao (replica) của pod luôn chạy. Deployment rất lý tưởng cho các workload mà mỗi pod có thể thay thế cho nhau, như máy chủ web hoặc backend API.
Đặc điểm chính:
- Các pod giống hệt nhau và có thể thay thế cho nhau
- Hỗ trợ cập nhật cuốn chiếu (rolling update) và rollback
- Dễ dàng mở rộng hoặc thu nhỏ
- Không có danh tính mạng cố định hay lưu trữ lâu dài theo mặc định
Ví dụ:
apiVersion: apps/v1
kind: Deployment
metadata: name: web-deployment
spec: replicas: 3 selector: matchLabels: app: web template: metadata: labels: app: web spec: containers: - name: web image: nginx:1.25
StatefulSet là gì?
StatefulSet quản lý các ứng dụng có trạng thái (stateful) cần danh tính mạng ổn định và lưu trữ lâu dài. Mỗi pod trong StatefulSet có một tên duy nhất và ổn định, và có thể gắn với volume lưu trữ riêng biệt.
Đặc điểm chính:
- Mỗi pod có một danh tính duy nhất, ổn định (ví dụ: app-0, app-1)
- Hỗ trợ triển khai và mở rộng theo thứ tự
- Mỗi pod có thể có volume lưu trữ riêng biệt
- Phù hợp với database, hàng đợi (queue) và các ứng dụng dạng cụm (clustered)
Ví dụ:
apiVersion: apps/v1
kind: StatefulSet
metadata: name: db-statefulset
spec: serviceName: 'db' replicas: 3 selector: matchLabels: app: db template: metadata: labels: app: db spec: containers: - name: db image: postgres:16 volumeMounts: - name: db-data mountPath: /var/lib/postgresql/data volumeClaimTemplates: - metadata: name: db-data spec: accessModes: ['ReadWriteOnce'] resources: requests: storage: 10Gi
So sánh nhanh các điểm khác biệt
Minh họa
Deployment (không trạng thái):
[web-abc123] [web-def456] [web-ghi789]
StatefulSet (có trạng thái):
[db-0] [db-1] [db-2]
Khi nào nên dùng loại nào?
Dùng Deployment cho:
- Máy chủ web
- API không trạng thái
- Background worker
Dùng StatefulSet cho:
- Database (PostgreSQL, MongoDB, v.v.)
- Bộ nhớ đệm phân tán
- Ứng dụng cần danh tính ổn định và lưu trữ lâu dài
Bước tiếp theo
Hãy thử triển khai cả Deployment và StatefulSet trên cụm Kubernetes của bạn để thấy được sự khác biệt thực tế. Hãy khám phá cách hoạt động của cập nhật cuốn chiếu, mở rộng quy mô và khởi động lại pod đối với từng controller.
Khi workload của bạn phát triển, việc hiểu rõ những mô hình này sẽ giúp bạn thiết kế hệ thống ổn định và dễ bảo trì hơn.
Cảm ơn các bạn đã theo dõi!