Chuyển đến nội dung chính

Bài 9: StatefulSet — khi nào mới thật sự cần

Nó cho bạn danh tính, đúng ba thứ. Không nhân bản, không bầu leader, không sao lưu.

Xem bản video

Một câu đã thành phản xạ

"Có cơ sở dữ liệu thì phải dùng StatefulSet." Tôi cũng từng tin thế, và đã dựng vài cái mà lẽ ra chỉ cần Deployment. Sự thật là StatefulSet giải một bài toán rất hẹp, và cái tên của nó hứa nhiều hơn cái nó làm.

Nó cho bạn đúng ba thứ

tên ổn địnhweb-0, web-1, web-2 — chết đi dựng lại vẫn đúng tên đó
DNS riêng từng podgọi thẳng được, nhờ một Service kiểu headless
đĩa riêng theo tênđĩa luôn quay lại đúng pod mang tên đó

Gộp lại thành một chữ: danh tính. Chấm hết.

Cái nó KHÔNG làm

  • ✕ nhân bản dữ liệu
  • ✕ bầu leader
  • ✕ sao lưu
  • ✕ chuyển đổi dự phòng khi một bản chết

Toàn bộ những việc khó ấy vẫn là việc của ứng dụng bên trong. Kubernetes chỉ đảm bảo pod số 0 luôn là pod số 0 và luôn tìm lại được ổ đĩa của nó.

Cần và không cần

Cần khi ứng dụng thật sự dựa vào danh tính: cụm cơ sở dữ liệu mà các bản phải biết tên nhau để đồng bộ, hoặc hệ đồng thuận kiểu etcd/Kafka/ZooKeeper nơi mỗi bản là một thành viên có số hiệu.

Không cần khi: chỉ có một bản duy nhất, các bản không cần biết nhau, hoặc dữ liệu để hết ở ngoài cụm. Một bản duy nhất có đĩa riêng? Deployment với một PVC là đủ, và đơn giản hơn nhiều.

Thứ tự — con dao hai lưỡi

tạo0 → 1 → 2, pod trước sẵn sàng thì pod sau mới được tạo
xoá2 → 1 → 0
cập nhật2 → 1 → 0, từ số cao nhất xuống

Lưỡi thứ nhất: pod 0 kẹt không lên nổi thì cả cụm đứng im chờ nó. Lưỡi thứ hai: trường partition cho thả bản mới từng phần kiểu canary, không cần công cụ gì thêm.

Cái bẫy đáng nhớ

Xoá StatefulSet thì mặc định các ổ đĩa không bị xoá theo. Thu nhỏ số bản cũng vậy: pod biến mất nhưng PVC vẫn nằm đó.

  • Mặt được: xoá nhầm vẫn còn dữ liệu để gắn lại
  • Mặt trái: hoá đơn cứ tăng vì đám đĩa mồ côi không ai dọn

Có một trường cấu hình để đổi hành vi này — nhưng nghĩ kỹ trước khi bật.

Nói thẳng một chuyện thực tế

Định chạy cơ sở dữ liệu thật trên Kubernetes? Đừng tự viết StatefulSet từ đầu. Dùng Operator do chính đội làm ra cơ sở dữ liệu đó viết — nó lo giúp những phần StatefulSet không lo: sao lưu, nâng cấp phiên bản, chuyển đổi dự phòng, bầu leader. Hoặc thẳng thắn hơn: dùng dịch vụ quản lý và dành sức cho phần ứng dụng của mình.

Bảng quyết định

Tình huốngChọn
một bản, có đĩa riêngDeployment + một PVC
nhiều bản, không cần biết nhauDeployment
nhiều bản, phải biết tên nhauStatefulSet
database thật — cần sao lưu, chuyển đổi dự phòngOperator, hoặc dịch vụ quản lý

Đừng chọn StatefulSet chỉ vì trong đầu có chữ "trạng thái".