DevOps 31/08/2026 7 phút

HPA phóng từ 2 lên 8 bản trong 30 giây, nhưng thu về mất tới 258 giây — bốn phút rưỡi ôm 8 bản ở 0% CPU, và đó là cố ý

HPA tự tăng giảm số bản theo tải — đo cả hai chiều thì chúng chênh nhau 8,6 lần. Mở rộng 30 giây (HPA tính thẳng số bản cần bằng ceil(bản × CPU/mục tiêu), không nhích từng cái), thu gọn 258 giây vì stabilizationWindow mặc định của scaleDown là 300 giây còn scaleUp là 0. Bất đối xứng này có chủ ý: mở rộng chậm thì người dùng khổ, thu gọn chậm chỉ tốn ít tiền vài phút. Thêm hai cái bẫy: thiếu requests.cpu thì HPA im lặng không bao giờ chạy, và co giãn theo bộ nhớ hiếm khi đúng vì JVM/Go không trả RAM.

DevOps 31/08/2026 7 phút

Manifest khai cpu=50m nhưng pod chạy với cpu=410m — VPA sửa con số giữa đường, và kubectl get deployment vẫn thản nhiên hiện số cũ

HPA thêm bản, VPA sửa requests của từng bản. Đo VPA trên cụm thật: khuyến nghị đầu tiên sau ~60 giây (target 410m dùng được, nhưng upperBound 8.856 nhân là vô nghĩa vì chưa đủ lịch sử). Auto mode làm hai việc dễ tưởng là một: bộ admission ghi đè requests lúc tạo pod (manifest 50m → pod 410m, mà get deployment vẫn hiện 50m — vỡ nguồn-sự-thật của GitOps), và bộ updater chỉ giết pod khi requests nằm NGOÀI khoảng tin cậy. Vì sao VPA hay trông như không làm gì, và vì sao VPA với HPA-theo-CPU đá nhau.

DevOps 31/08/2026 7 phút

Tín hiệu 'cụm cần thêm máy' sinh ra sau 0,2 giây, dọn một node hết 14,3 giây — còn khúc giữa tôi không đo được, và tôi nói thẳng điều đó

HPA thêm pod, Cluster Autoscaler thêm NODE khi hết chỗ. Đo hai đầu của vòng lặp trên cụm thật: pod vào Pending sau 0,2 giây, drain một node hết 14,3 giây. Còn khúc giữa — nhà cung cấp đám mây thật sự tạo ra một máy — thì kind không dựng được, nên tôi không có số đo và không mượn số của người khác rồi gọi là phép đo. Bài học rơi ra: hai đầu đều nhanh, toàn bộ thời gian chờ nằm ở khúc bạn không kiểm soát — nên tối ưu thời gian cụm phản ứng thì đừng nhìn Kubernetes, hãy nhìn thời gian khởi động máy và kéo ảnh.

DevOps 31/08/2026 7 phút

Vết NoExecute đuổi sạch pod khỏi node trong 1,3 giây, còn anti-affinity cứng khiến 2 trong 5 bản không bao giờ chạy — bốn cơ chế điều pod, và chỗ ai cũng lẫn

Đo bốn cơ chế điều pod chạy ở đâu trên cụm thật. NoExecute đuổi mọi pod đang chạy trong 1,3 giây (so với node chết mất gần 6 phút). Điểm hay nhầm nhất: toleration chỉ CHO PHÉP pod lên node có vết, nó KHÔNG ép — muốn ép pod lên node GPU phải thêm nodeSelector, vì 'giữ kẻ khác ra' và 'đưa mình vào' là hai việc tách biệt. Và anti-affinity cứng chặn thẳng (3 Running, 2 Pending, số bản bị trần bởi số node) trong khi mềm rải đều mà không bao giờ để pod Pending.

DevOps 31/08/2026 7 phút

Đặt minAvailable=4 cho một deployment 4 bản, và cái node đó không bao giờ rút ra bảo trì được nữa — cùng một lệnh drain: 2,1 giây, hay treo vĩnh viễn

PodDisruptionBudget bảo Kubernetes đừng đuổi quá nhiều bản cùng lúc. Đo bằng cách rút node ba lần: không PDB xong trong 2,1 giây, minAvailable=4 trên 4 bản treo mãi không xong, minAvailable=3 xong trong 6,6 giây. Bài học lớn: minAvailable là con số tuyệt đối nên thành bẫy khi HPA thu gọn số bản ban đêm — cho-phep-duoi tụt về 0 đúng lúc bạn muốn bảo trì; maxUnavailable=1 thì an toàn ở mọi quy mô. Và PDB chỉ chặn việc đuổi TỰ NGUYỆN, nó không phải cơ chế bảo đảm tính sẵn sàng.

DevOps 31/08/2026 7 phút

kubectl báo tạo Deployment thành công, nhưng không một pod nào chạy và màn hình chỉ hiện 0/1 câm lặng — lời từ chối nằm một tầng dưới, chỗ chẳng ai nhìn

ResourceQuota biến namespace thành ranh giới tài nguyên thật. Nhưng nó chặn ở tầng POD chứ không phải tầng Deployment: create deployment báo thành công, get deployment hiện 0/1, và lý do thật giấu trong event của ReplicaSet. Đo bốn loại giới hạn — giới hạn trên object báo lỗi ngay cho người gõ lệnh, giới hạn trên pod báo lỗi ở chỗ ít ai nhìn. Cùng bài học phụ: quota tính theo requests khai báo không theo mức dùng thật, và ai có quyền xoá quota thì quota không giới hạn được họ.