Deployment vs StatefulSet
1. Giới thiệu
Khi triển khai ứng dụng trên Kubernetes, bạn có thể sử dụng Deployment hoặc StatefulSet để quản lý các Pod. Mặc dù cả hai đều được sử dụng để chạy và quản lý nhiều Pod, nhưng chúng có sự khác biệt quan trọng trong cách duy trì trạng thái và nhận diện các Pod.
2. Deployment là gì?
Deployment trong Kubernetes được sử dụng để triển khai các ứng dụng stateless (không có trạng thái). Khi sử dụng Deployment, Kubernetes đảm bảo rằng số lượng Pod mong muốn luôn chạy trong cluster và có thể dễ dàng cập nhật hoặc rollback.
Đặc điểm của Deployment:
Quản lý Pod theo kiểu stateless.
Các Pod có thể được tạo lại mà không cần giữ lại thông tin cũ.
Sử dụng ReplicaSet để duy trì số lượng bản sao mong muốn.
Phù hợp với các ứng dụng web, API server, microservices không yêu cầu dữ liệu lưu trữ lâu dài.
Ví dụ Deployment:
Giải thích:
Triển khai một Deployment có 3 bản sao của nginx.
Nếu một Pod bị xóa, Kubernetes sẽ tạo lại Pod mới.
3. StatefulSet là gì?
StatefulSet trong Kubernetes được sử dụng để triển khai các ứng dụng stateful (có trạng thái). Nó đảm bảo rằng mỗi Pod có một danh tính cố định và duy trì dữ liệu ngay cả khi Pod bị khởi động lại.
Đặc điểm của StatefulSet:
Dùng cho các ứng dụng stateful như database, Kafka, Elasticsearch, Zookeeper.
Mỗi Pod có một tên duy nhất (ví dụ:
web-0
,web-1
,web-2
).Pod được khởi động và xóa theo thứ tự xác định.
Kết hợp với PersistentVolume (PV) để duy trì dữ liệu lâu dài.
Ví dụ StatefulSet:
Giải thích:
Mỗi Pod có một định danh duy nhất (
web-0
,web-1
,web-2
).Dữ liệu lưu trữ trên Persistent Volume (PV) không bị mất khi Pod khởi động lại.
Pod được khởi động theo thứ tự từ
web-0
đếnweb-2
.
4. Sự khác biệt giữa Deployment và StatefulSet
Loại ứng dụng
Stateless
Stateful
Danh tính Pod
Không cố định
Cố định (pod-0
, pod-1
)
Storage
Không yêu cầu
Kết hợp với PersistentVolume
Cập nhật Rolling Update
Hỗ trợ
Có thể gây gián đoạn
Thứ tự tạo/xóa Pod
Không có thứ tự
Theo thứ tự tăng dần
5. Khi nào sử dụng Deployment và StatefulSet?
Dùng Deployment khi:
Cần triển khai ứng dụng stateless như web server, API.
Không cần lưu trữ dữ liệu lâu dài.
Muốn dễ dàng scale và rollback.
Dùng StatefulSet khi:
Cần triển khai database như MySQL, PostgreSQL, MongoDB.
Cần duy trì trạng thái và dữ liệu giữa các phiên làm việc.
Cần định danh cố định cho từng Pod trong hệ thống.
6. Kết luận
Deployment và StatefulSet là hai cơ chế quan trọng trong Kubernetes, mỗi loại phục vụ một mục đích khác nhau. Việc chọn loại nào tùy thuộc vào yêu cầu của ứng dụng – nếu ứng dụng của bạn không cần lưu trạng thái, hãy dùng Deployment; nếu cần duy trì trạng thái, hãy chọn StatefulSet.
Last updated