Blog
Thoughts on engineering, design, and building great products.
Metrics Server và HorizontalPodAutoscaler
Part VIII đổi hướng: thay vì giết pod khi quá tải, ta thêm pod. Nhưng muốn autoscale theo CPU thì cluster phải biết pod đang dùng bao nhiêu CPU — mà cụm tự dựng của ta chưa có ai đo. Bài này cài add-on đầu tiên, Metrics Server, vấp đúng một cái bẫy KTHW (control plane không nói chuyện được với pod) rồi sửa nó, rồi dựng HPA và đốt CPU thật để xem nó tự nhân pod từ 1 lên 4.
Node-pressure eviction
Ba bài qua nói về việc xếp pod. Bài này nói về việc đuổi pod — nhưng không phải preemption (scheduler, vì priority) hay OOM kill (kernel, vì vượt limit). Đây là kubelet chủ động giết pod khi node thật sự cạn RAM hoặc disk, theo ngưỡng và thứ tự xếp hạng riêng. Bài này tự tay tạo áp lực bộ nhớ thật trên một worker rồi xem kubelet trục xuất đúng pod ngốn nhất — kèm thông điệp eviction nói rõ vì sao.
Priority và preemption
Node hết chỗ, một pod quan trọng vừa tạo. Nó chịu treo Pending sau đám pod rác, hay được quyền đá một pod kém quan trọng ra để giành chỗ? PriorityClass gán mức ưu tiên; preemption cho pod ưu tiên cao trục xuất pod thấp khi cần. Bài này lấp đầy cluster bằng pod ưu tiên thấp rồi thả một pod ưu tiên cao — xem nó đá nạn nhân ra và chiếm chỗ, đúng cái bước PostFilter mà Bài 34 bảo 'không giúp được'.
Topology spread, pod overhead và scheduling readiness
Anti-affinity cứng nhắc: mỗi node một pod, dư là treo. Topology spread mềm hơn — rải đều theo maxSkew mà vẫn cho nhiều pod mỗi node. Bài này đào ba cơ chế scheduling tinh: topologySpreadConstraints (rải uyển chuyển), pod overhead (tính thêm tài nguyên cho sandbox runtime), và schedulingGates (giữ pod chưa cho xếp lịch). Test thật cả ba trên cluster.
Affinity, taint và toleration
Scheduler tự chọn node, nhưng nhiều khi bạn cần can thiệp: pod này phải ở node SSD, hai bản sao đừng nằm chung một máy, node kia chỉ dành riêng cho một team. Bài này đào ba công cụ điều khiển scheduler từ phía bạn — nodeAffinity (hút pod về node có nhãn), podAntiAffinity (đẩy pod xa nhau), taint/toleration (node đẩy pod ra trừ khi pod chịu được). Test thật cả pod bị treo vì affinity, pod thứ ba không chỗ vì anti-affinity, và pod bị NoExecute đuổi khỏi node đang chạy.
Scheduler và scheduling framework
Mỗi pod ta tạo đều có ai đó âm thầm chọn node cho nó — đó là kube-scheduler, thứ ta đã dựng ở Bài 8 mà chưa nhìn kỹ. Bài này mở Part VII bằng cách đào đúng cách nó chọn: lọc bỏ node không vừa (filter), chấm điểm node còn lại (score), rồi bind. Test thật một pod bị treo vì không node nào đủ chỗ, một pod được chọn node, và xem scoring dồn pod vào node ít tải hơn — không phải chia đều ngây thơ.
LimitRange và ResourceQuota
Khi nhiều team dùng chung một cluster, không gì ngăn team A tạo 10.000 pod hay xin 64Gi RAM cho một container — trừ khi bạn đặt luật. LimitRange đặt mặc định và min/max cho từng pod trong một namespace; ResourceQuota chặn tổng tài nguyên và số object cả namespace được dùng. Bài này khép Part VI bằng cả hai: test thật cú tiêm default, cú vượt max bị 403, và cú tạo pod thứ tư bị quota chặn.