DevOps 31/08/2026 8 phút

Dựng namespace riêng rồi tưởng đã có tường lửa — nhưng pod ở 'dev' vẫn gọi thẳng được cơ sở dữ liệu ở 'prod', chỉ cần đoán đúng tên

Namespace chia không gian TÊN, không chia không gian MẠNG — mặc định mọi pod gọi được mọi pod xuyên namespace. Đo cách dựng ranh giới thật bằng NetworkPolicy: chặn hết rồi mở dần theo nhãn, và cái bẫy VÀ-so-với-HOẶC chỉ khác một dấu gạch đầu dòng nhưng nới rộng quyền một cách im lặng. NetworkPolicy thực thi ở tầng CNI nên chặn cả khi gọi thẳng podIP, nhưng chính CNI phải hỗ trợ — plugin không hỗ trợ thì chính sách của bạn chỉ là văn bản, không lỗi, không cảnh báo.

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 7 phút

Tôi cấp một ServiceAccount đúng quyền 'chỉ đọc' Secret — rồi đọc ra ngay SieuBiMat123, và ba quyền nghe vô hại khác hoá ra tương đương quyền quản trị

Cấp quyền từng lớp cho một ServiceAccount rồi đo chính xác nó mở ra được gì. Role bó rất chặt (đúng động từ, đúng tài nguyên, đúng namespace), nhưng 'chỉ đọc' Secret là đọc được mọi mật khẩu vì base64 không phải mã hoá. Ba quyền nghe vô hại trong một bản YAML — create pods, get secrets, create rolebindings — đều là đường leo thang lên quyền toàn cụm. Và kubectl auth can-i là cách duy nhất kiểm quyền thực tế thay vì đọc YAML rồi đoán.

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 8 phút

Ba lỗi mạng hoàn toàn khác nhau trong Kubernetes cho ra đúng một thông báo và đúng một thời gian — và một lệnh duy nhất phân biệt được cả ba

Nhãn sai, cổng sai, pod chưa sẵn sàng — ba nguyên nhân khác hẳn nhau nhưng đều ra ConnectionRefused ~0 ms, và DNS thì phân giải tốt ở cả ba nên nslookup chẳng chứng minh gì. Đo cách một bảng endpointslices tách được ba bệnh cùng triệu chứng, và vì sao khác biệt Refused-ngay-lập-tức so với Timeout-đúng-hạn-chờ (3004 ms khi bật NetworkPolicy) là phép chia đôi tốt nhất khi lần lỗi mạng.

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.