Bài viết mới nhất

Tổng 1741 bài
DevOps 31/08/2026 7 phút

Xoá pod db-1 của StatefulSet rồi để nó dựng lại: IP đổi, nhưng tên, PVC và dữ liệu 'du lieu cua db-1' còn nguyên vẹn — đó là cả điểm khác biệt với Deployment

Deployment giả định các bản thay thế được cho nhau; với cơ sở dữ liệu thì không. Đo ba thứ StatefulSet có mà Deployment không: khởi động tuần tự (4,3 / 9,6 / 14,9 giây, chờ bản trước), danh tính ổn định (tên DNS và PVC riêng cho từng bản — xoá pod rồi dựng lại thì chỉ IP đổi, dữ liệu còn), và thu gọn không xoá PVC (an toàn dữ liệu nhưng vẫn trả tiền đĩa). Cùng cái bẫy nguy hiểm nhất: node chết thì StatefulSet CHỜ, vì hai bản cùng tên ghi cùng dữ liệu là hỏng — và --force là lời cam đoan 'bản cũ đã chết' mà nếu sai thì mất dữ liệu.

DevOps 31/08/2026 6 phút

DaemonSet hứa 'một bản trên mỗi node' — nhưng cụm 4 node của tôi chỉ có 3 bản, vì chữ 'mỗi' luôn kèm một điều kiện ẩn

DaemonSet chạy đúng một bản trên mỗi node — nghe đơn giản, nhưng 'mỗi node' có một điều kiện ẩn: node control plane bị bỏ qua vì có vết, nên cụm 4 node ra 3 bản. Thêm một dòng toleration là đủ 4. Đo tiếp: DaemonSet phản ứng với thay đổi tập node trong 0,1 giây (theo dõi qua watch) so với gần 6 phút khi node CHẾT — vì độ trễ nằm ở việc kết luận node đã chết, không phải ở việc phản ứng. Và vì sao DaemonSet không có replicas: số bản là hệ quả của số node, nó co giãn theo hạ tầng chứ không theo tải.

DevOps 31/08/2026 7 phút

Sửa ConfigMap thì tệp gắn cập nhật sau 65 giây, còn biến môi trường thì không bao giờ đổi — cùng một giá trị, hai cách giao, hai số phận

Cấu hình vào pod bằng bốn cách và chúng hành xử khác hẳn khi bạn sửa. Đo: đổi ConfigMap thì tệp gắn cập nhật sau 65 giây (qua một cú hoán đổi liên kết mềm nguyên tử), còn biến môi trường KHÔNG BAO GIỜ đổi vì nó bị đóng băng lúc container khởi động — đó là bản chất của biến môi trường ở mức HĐH, không phải giới hạn Kubernetes. Và base64 của Secret không phải mã hoá: ai đọc được là đọc được mật khẩu, khác biệt thật chỉ là RBAC tách riêng và gắn qua tmpfs không chạm đĩa.

DevOps 31/08/2026 8 phút

Cùng một máy, cùng một phép thử: kindnet đạt 87,4 Gbit/s giữa hai node, Calico chỉ 45,6 — và cả 48% chênh lệch nằm gọn trong một dòng bảng định tuyến

CNI quyết định pod nhận IP thế nào và gói tin đi giữa các node ra sao. Dựng hai cụm giống hệt, đổi mỗi plugin mạng: kindnet định tuyến thuần đạt 87,4 Gbit/s liên node, Calico với đường hầm IPIP chỉ 45,6 — chậm 48%, vì mỗi gói bị bọc thêm một lớp IP header (dev tunl0). Qua Service chỉ tốn thêm 1,7%: cái đắt là đóng gói chứ không phải chuyển địa chỉ. Con số tuyệt đối cao bất thường vì đo trong một máy với MTU 65535, nhưng TỈ LỆ giữ nguyên vì nguyên nhân là phí trên mỗi gói, không phải tốc độ dây.

DevOps 31/08/2026 7 phút

Đặt activeDeadlineSeconds=15 nhưng Job bị cắt sau 46 giây — và tôi suýt viết sai thành quy luật vì chỉ đo một điểm

Deployment giữ thứ chạy mãi, Job chạy một lần rồi thôi. Đo ba cách Job hỏng: thử lại với độ lùi gấp đôi (10/20/40 giây, backoffLimit mặc định 6 mất ~20 phút), activeDeadlineSeconds cộng thêm đúng 31 giây cố định (không phải nhân — đo một điểm thấy như gấp 3,1 lần, đo ba điểm mới lộ ra là hằng số). Và cái bẫy mặc định của CronJob: concurrencyPolicy Allow cho các lượt chồng lên nhau, nên một job chạy lâu hơn chu kỳ lịch sẽ tự nhân bản tới khi hết tài nguyên mà không có gì cảnh báo.

DevOps 31/08/2026 8 phút

Pod báo CrashLoopBackOff nhưng container chưa từng chạy một giây nào — cột STATUS của Kubernetes đang mô tả việc nó đang làm, không phải việc đã hỏng

Dựng bảy sự cố thật rồi đo xem công cụ nào nói thật. CrashLoopBackOff che hai nguyên nhân hoàn toàn khác nhau — ứng dụng chết (đọc logs) và lệnh khởi động không tồn tại (logs rỗng, exit 128, phải đọc events). ContainerCreating nghe như đang tiến triển nhưng đứng đó vĩnh viễn vì thiếu Secret. Quy tắc dùng ngay: nhật ký rỗng mà restarts>0 thì container không crash, nó không khởi động nổi — và bảng mã thoát 128/137/143 nói container chết thế nào.