Tất cả bài viếtCloud

Tối ưu chi phí Kubernetes: 7 kỹ thuật giúp khách hàng Nocalab tiết kiệm 35%

Từ rightsizing dựa trên metrics thực tế đến Karpenter và FinOps culture — những kỹ thuật đã được kiểm chứng trên hàng chục cluster production.

Phạm Quốc Bảo 02/04/2026 13 phút đọc
Tối ưu chi phí Kubernetes: 7 kỹ thuật giúp khách hàng Nocalab tiết kiệm 35%
#Kubernetes#FinOps#Karpenter#Cost Optimization

Có một sự thật khó chịu trong thế giới Kubernetes: hầu hết cluster production đang trả gấp 2–3 lần so với mức cần thiết. Không phải vì engineer kém, mà vì K8s thiết kế để ưu tiên reliability hơn cost — và default settings thường rất hào phóng với CPU/memory.

Trong 18 tháng qua, đội Cloud Lab của Nocalab tham gia tối ưu chi phí cho 14 cluster production với tổng chi tiêu hàng tháng từ 8.000 đến 220.000 USD. Mức tiết kiệm trung bình là 35%, dự án tốt nhất đạt 58% — không hề ảnh hưởng SLA. Bài viết này chia sẻ 7 kỹ thuật cốt lõi và thứ tự ưu tiên áp dụng.

"You can't optimize what you can't measure. Visibility đi trước automation, luôn luôn."

Nguyên tắc nền tảng của FinOps Foundation

Kỹ thuật 1: Rightsizing dựa trên P95 thực tế

Đa số dev đặt requests/limits theo cảm tính — "chắc 1 CPU, 2Gi RAM là đủ". Kết quả: pod được schedule với buffer 200–400% so với nhu cầu thực.

Cách làm đúng: cài Vertical Pod Autoscaler (VPA) ở mode "recommendation only" trong 2 tuần để thu thập dữ liệu. Sau đó dùng tool như Goldilocks hoặc Kubecost để xem khuyến nghị: requests = P95 sử dụng + 20% buffer, limits = 2x requests cho CPU, 1.5x cho memory.

Tác động thực tế: trên cluster 200 pod của một khách hàng fintech, chỉ riêng rightsizing đã giảm 28% node count mà không có pod nào bị OOM trong 3 tháng theo dõi.

Kỹ thuật 2: Bin-packing với Karpenter

Cluster Autoscaler truyền thống chỉ scale node group đã định nghĩa sẵn. Nó không biết "workload này nên chạy trên instance type nào để pack chặt nhất".

Karpenter (open source, do AWS phát triển nhưng giờ đã hỗ trợ Azure và GCP) thay đổi cuộc chơi: nó nhìn vào pending pods, chọn instance type tối ưu trong real-time, và consolidate workload khi node trống. Trong các benchmark của Nocalab, Karpenter giảm 15–25% chi phí compute so với CA mà không cần thay đổi gì ở workload.

Lưu ý quan trọng: Karpenter aggressive trong consolidation, nên cần PodDisruptionBudget cấu hình đúng cho mọi service quan trọng — nếu không sẽ gặp downtime trong những lần consolidate.

Kỹ thuật 3: Spot/Preemptible cho workload chịu được gián đoạn

Spot instance rẻ hơn on-demand 60–90%. Nhưng có thể bị thu hồi với 2 phút thông báo. Quy tắc Nocalab áp dụng:

  • Stateless workload (web servers, workers): 70–80% trên spot, 20–30% on-demand làm baseline.
  • Batch jobs và data pipeline: 100% spot, retry logic xử lý interruption.
  • Stateful workload (database, queue): KHÔNG dùng spot. Tiết kiệm không đáng so với rủi ro.
  • ML training: spot rất phù hợp nếu có checkpointing tốt. Tiết kiệm 70%+ là phổ biến.

Kỹ thuật 4: Tách node pool theo workload class

Anti-pattern phổ biến: một node pool "general purpose" chạy mọi thứ. Vấn đề: workload CPU-heavy và memory-heavy đẩy node về hai trạng thái lãng phí khác nhau.

Best practice: tách 3–4 node pool theo profile — compute-optimized cho service xử lý nhiều, memory-optimized cho cache/database, general-purpose cho web tier, GPU pool riêng cho ML. Kết hợp với taints/tolerations để Karpenter route workload đúng pool.

Kỹ thuật 5: Resource Quota và LimitRange chống over-commit

Khi nhiều team chia sẻ cluster, không có quota nghĩa là team "ồn ào" sẽ ăn hết resource. ResourceQuota giới hạn tổng CPU/memory/storage mà namespace được dùng. LimitRange áp dụng default requests/limits cho mọi pod trong namespace, ngăn dev quên khai báo và tạo "BestEffort" pod (loại pod đầu tiên bị giết khi cluster áp lực).

Cấu hình tối thiểu: mọi namespace production phải có ResourceQuota; LimitRange với default request = 100m CPU / 128Mi RAM, limit = 500m CPU / 512Mi RAM.

Kỹ thuật 6: Reserved Instances và Savings Plans cho baseline

Phần workload chạy 24/7 (control plane, baseline node, database) nên được mua Reserved Instance hoặc Savings Plan. Cam kết 1 năm tiết kiệm 30–40%, 3 năm tiết kiệm 50–60%.

Cách Nocalab tính baseline: xem CloudWatch/Stackdriver 90 ngày qua, lấy P10 của số node mỗi giờ — đó là phần "luôn chạy" có thể commit. Phần biến động dùng on-demand + spot.

Kỹ thuật 7: FinOps culture — chia sẻ chi phí về team

Đây là kỹ thuật quan trọng nhất nhưng ít được nói tới. Nếu team không thấy hoá đơn của mình, họ không có động lực tối ưu. Bạn (DevOps/SRE) sẽ mãi là "người thu dọn".

Cách làm: dùng Kubecost hoặc OpenCost để phân bổ chi phí theo namespace, label (team, product, environment). Gửi báo cáo hàng tuần qua Slack với showback rõ ràng. Đặt cost budget per team với cảnh báo khi vượt 80%.

Một khách hàng của Nocalab áp dụng showback và sau 3 tháng, chi phí giảm 22% mà không cần SRE can thiệp — chính các team tự tối ưu khi thấy con số của mình.

Thứ tự áp dụng và ROI mong đợi

Không nên làm cùng lúc 7 thứ. Lộ trình 90 ngày Nocalab khuyến nghị:

Tuần 1–2: Cài Kubecost + VPA recommendation. Chưa thay đổi gì, chỉ thu thập data và làm baseline.

Tuần 3–6: Rightsizing dựa trên data đã thu. Thiết lập ResourceQuota và LimitRange. Mong đợi: -20% chi phí.

Tuần 7–10: Triển khai Karpenter, tách node pool, đưa stateless workload lên spot. Mong đợi: -10% chi phí thêm.

Tuần 11–12: Mua Savings Plan cho baseline. Triển khai showback dashboard cho team. Mong đợi: -5–10% chi phí thêm + thay đổi văn hoá lâu dài.

Tổng cộng sau 90 ngày: 30–40% tiết kiệm là khả thi, có khả năng chứng minh, không hy sinh reliability.

Kết luận

Tối ưu chi phí Kubernetes không phải dự án một lần — nó là vòng lặp liên tục giữa Engineering và Finance. Kỹ thuật quan trọng, nhưng văn hoá quan trọng hơn. Khi mọi engineer đều hiểu chi phí cloud của tính năng mình build, đó là lúc tổ chức đạt được FinOps maturity thực sự.

Và hãy nhớ: tiền tiết kiệm được không nên "trả lại" cloud. Đầu tư vào hạ tầng tốt hơn — observability, security, developer experience — sẽ trả lại bội phần.