Giao diện
Running Stateful Workloads: VolumeClaimTemplates
Nếu PersistentVolumeClaim (PVC) là "tờ phiếu mua hàng" lẻ tẻ, thì volumeClaimTemplates chính là "cỗ máy in phiếu" tự động, đặc quyền riêng của StatefulSet. Đây là chìa khóa để chạy Database trên Kubernetes.
1. The Deployment Problem
Tại sao chúng ta không dùng Deployment để chạy Database (ví dụ: MongoDB Cluster)?
Giả sử bạn có 1 Deployment replicas: 3 và định nghĩa 1 PVC trong volumes.
- Kịch bản: Cả 3 Pod (
pod-a,pod-b,pod-c) sẽ cùng tranh nhau mount vào MỘT PVC duy nhất (Shared Storage). - Hậu quả:
- Race Condition: 3 ông cùng ghi vào 1 file database -> Corrupt data.
- Locking: Hầu hết Database (MySQL, Postgres) dùng cơ chế "File Lock", pod đầu tiên start sẽ lock file, 2 pod sau sẽ crash vì không lock được.
👉 Kết luận: Deployment chỉ phù hợp cho Stateless App (chia sẻ file config read-only). Không dùng cho Distributed Data.
2. The StatefulSet Solution
StatefulSet sinh ra để giải quyết bài toán này bằng trường volumeClaimTemplates.
How it works (Cơ chế in phiếu)
Thay vì bạn tạo thủ công 3 cái PVC, bạn chỉ cần định nghĩa 1 cái Template.
yaml
spec:
volumeClaimTemplates: # 👈 The Magic Field
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "standard"
resources:
requests:
storage: 1GiKhi StatefulSet khởi tạo 3 Replicas (web-0, web-1, web-2), K8s sẽ tự động tạo ra 3 PVC riêng biệt dựa trên template này:
- Pod
web-0-> gắn với PVCdata-web-0. - Pod
web-1-> gắn với PVCdata-web-1. - Pod
web-2-> gắn với PVCdata-web-2.
👉 Kết quả: Mỗi Pod có một "ổ cứng" riêng tư. Không ai tranh giành của ai.
3. Data Persistence Policy (Chính sách sinh tồn)
Một hành vi mặc định cực kỳ quan trọng của StatefulSet mà bạn cần biết:
Khi bạn xóa StatefulSet (Scale down = 0), các Pod sẽ bị xóa, NHƯNG các PVC (và dữ liệu) sẽ KHÔNG bị xóa tự động.
- Lý do: K8s quan niệm "Dữ liệu quý hơn vàng". Thà tốn tiền lưu trữ rác còn hơn lỡ tay xóa nhầm data của khách hàng.
- Khôi phục: Nếu bạn tạo lại StatefulSet (cùng tên), các Pod mới (
web-0...) sẽ tự động tìm và gắn lại đúng vào các PVC cũ (data-web-0...). Dữ liệu được bảo toàn nguyên vẹn 100%.
ReclaimPolicy
Nếu bạn thực sự muốn xóa sạch? Bạn phải xóa tay từng PVC hoặc chỉnh ReclaimPolicy của StorageClass (Không khuyến khích cho Production).
4. HPN Best Practice: To DB or Not to DB?
Câu hỏi triệu đô: "Có nên chạy Database trên Kubernetes không?"
⛔ Quan điểm 1: DON'T DO IT
Nếu team của bạn không có Dedicated DBRE (Database Reliability Engineer), đừng dại dột.
- Lý do: Vận hành DB trên K8s rất phức tạp (Backup, Restore, Failover, Rebalancing, Upgrades).
- Lời khuyên: Hãy dùng Managed Services (AWS RDS, Google Cloud SQL). Hãy để Cloud Provider lo phần khó nhất.
✅ Quan điểm 2: IF YOU MUST
Nếu bạn bắt buộc phải chạy (vì compliance, on-premise, hoặc cost), hãy tuân thủ:
- StatefulSet + Headless Service: Bắt buộc.
- Local Persistent Volumes: Sử dụng ổ cứng NVMe gắn trực tiếp vào Node để đạt IOPS cao nhất (tránh độ trễ của Network Storage).
- Operators: Sử dụng các K8s Operators chuyên nghiệp (VD: Postgres Operator by Zalando, Strimzi Kafka Operator) thay vì tự viết YAML thủ công. Các Operator này chứa đựng "trí tuệ" của chuyên gia để xử lý Failover tự động.
Next Step: Module 6: Security Essentials