Blog
Thoughts on engineering, design, and building great products.
Finalizer, ownerReferences và garbage collection
Mỗi lần xóa Deployment ở các bài trước, pod và ReplicaSet biến mất theo — ta gọi đó là garbage collection mà chưa mổ xẻ. Bài này đào cơ chế: ownerReferences nối object cha-con, garbage collector tự dọn con khi cha mất (nền, foreground, hay để mồ côi), và finalizer chặn xóa tới khi việc dọn dẹp xong. Test thật cả ba — kể cả một object kẹt ở Terminating vì finalizer.
Label, selector, namespace và annotation
Ta đã gõ -l app=web hàng chục lần mà chưa dừng lại hỏi nó hoạt động ra sao. Bài này mở Part V bằng bộ công cụ tổ chức và truy vấn đối tượng: label để gắn nhãn và chọn (equality lẫn set-based), annotation để đính metadata không-định-danh, namespace để cô lập, và field selector để lọc theo trường có sẵn. Test thật từng kiểu selector trên một rổ pod gắn nhãn.
Job, CronJob và TTL
Mọi controller tới giờ đều chạy mãi — Deployment, StatefulSet, DaemonSet giữ pod sống bất tận. Job đảo ngược: nó chạy một tác vụ tới khi xong rồi dừng, đúng cho migration, backup, batch. Bài này khép Part IV với Job (completions, parallelism, backoffLimit), CronJob chạy theo lịch cron, và TTL tự dọn Job đã xong — test thật từng cái trên cluster, kể cả bắt CronJob nổ đúng mốc phút.
DaemonSet: một pod trên mỗi node
Deployment quản N bản sao đặt đâu cũng được; StatefulSet quản N pod có danh tính. DaemonSet là mô hình thứ ba và khác hẳn: không đếm bản sao mà bảo đảm đúng một pod trên mỗi node — thêm node thì thêm pod, bớt node thì pod biến mất. Đây là khuôn cho agent log, CNI, node exporter. Bài này đào cách DaemonSet ghim pod vào từng node, vì sao pod của nó chạy được cả trên node chưa sẵn sàng, và cách giới hạn nó vào một nhóm node — test thật trên hai worker.
StatefulSet: danh tính ổn định và thứ tự
Deployment coi mọi pod như đàn cá vô danh — thay con nào cũng được. Nhưng database, message queue, etcd thì không: mỗi node cần một danh tính cố định và dữ liệu riêng. StatefulSet sinh ra cho đúng nhu cầu đó. Bài này đào bốn bảo đảm của nó — tên ổn định, DNS riêng từng pod qua headless service, tạo và xóa theo thứ tự — kiểm chứng từng cái trên cluster thật, và để dành phần volume cho phần Storage.
Deployment: rollout và rollback
Tới giờ ta toàn tạo Pod trần. Production thì không ai làm vậy — pod được giao cho Deployment quản, và Deployment không quản pod trực tiếp mà qua một lớp giữa: ReplicaSet. Bài này mở Part IV bằng cách đào đúng cơ chế đó: đổi image sinh ra ReplicaSet mới, rolling update nâng cái mới lên hạ cái cũ xuống, ReplicaSet cũ được giữ ở 0 để rollback một lệnh. Test thật từng bước trên cluster, soi cả chuỗi sở hữu Pod → ReplicaSet → Deployment.
Disruption và PodDisruptionBudget
Pod biến mất theo hai kiểu rất khác nhau: không tự nguyện (node chết, hết RAM — không ai ngăn được) và tự nguyện (rút node đi bảo trì, nâng cấp — chủ động). PodDisruptionBudget chỉ canh đúng kiểu thứ hai: nó bảo cluster đừng rút quá nhiều bản sao cùng lúc. Bài này phân biệt hai kiểu disruption rồi kiểm chứng PDB bằng Eviction API thật — thấy tận mắt cú evict bị chặn bằng HTTP 429.