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

Tổng 1741 bài
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ọ.

DevOps 31/08/2026 8 phút

Sự kiện cũ nhất trong cụm Kubernetes của tôi chỉ 61 phút tuổi — và 'BackOff x26' không hề nghĩa là pod khởi động lại 26 lần

Sự kiện là nơi Kubernetes tự nói ra vì sao nó làm điều vừa làm — nhưng nó tự xoá sau đúng một giờ (mặc định --event-ttl, trần cứng, không bản sao ở đâu). Đo ba cái bẫy: sự kiện hết hạn là mất sạch khác hẳn nhật ký còn trên đĩa; BackOff x26 nhưng restart thật chỉ 5 vì count đếm số lần kubelet NÓI về một tình trạng chứ không đếm số lần nó xảy ra; và sự kiện sống lâu hơn chính pod đã bị xoá, nên nó là dấu vết duy nhất trả lời 'pod của tôi đâu rồi'.

DevOps 31/08/2026 8 phút

ulimit thề rằng 'unlimited' — nhưng container của tôi chết đứng ở đúng 19.162 tiến trình, và cái trần đó không nằm ở chỗ ulimit nhìn

Container có hai cái trần vô hình mà nó thường chạm trước cả trần RAM. ulimit -u báo unlimited trong khi trần thật là 19.162 (pids.max của cgroup, đúng 15% threads-max) — công cụ cũ tự tin trả lời sai câu hỏi vì nó chỉ thấy cơ chế RLIMIT có từ trước cgroup. Chạm trần thì lỗi tên là EAGAIN 'thử lại sau' nhưng không bao giờ hết, nên phần lớn thư viện thử lại vô hạn và biến một cái trần cứng thành vòng lặp đốt CPU không báo lỗi. Và lời khuyên 'nhớ tăng ulimit -n' đã hết việc vì trình chạy container đặt sẵn một triệu.

DevOps 31/08/2026 8 phút

Cùng một container, kubectl top báo 12 Mi bộ nhớ còn Grafana vẽ 413 Mi — cả hai đều đúng, và biết vì sao thì bảng cảnh báo của bạn hết kêu oan

Bốn con số bộ nhớ cho một container, chênh nhau 34 lần, tất cả đều đúng vì chúng trả lời những câu hỏi khác nhau. memory.current 413 Mi gồm 400 Mi bộ đệm tệp mà kernel vứt trong tích tắc; working_set chỉ 13 Mi mới là phần OOM killer nhìn vào. Đây là nguồn của phần lớn báo động giả 'rò bộ nhớ'. Thêm: kubectl top chậm hơn thực tế 30 giây và lặp lại y hệt mẫu cũ — nó không đo, chỉ đọc lại mẫu gần nhất, nên một đợt tải ngắn hơn 15 giây có thể không lọt vào mẫu nào.

DevOps 31/08/2026 8 phút

Pod distroless không có cả sh lẫn ls, kubectl exec bó tay hoàn toàn — nhưng vẫn đọc được cấu hình và biến môi trường thật của nó qua /proc/1/root

Image càng gọn thì kẻ tấn công càng ít thứ để dùng — và bạn cũng vậy lúc gỡ rối. Khi exec vô dụng với distroless, kubectl debug luồn một ephemeral container vào ĐÚNG pod đang hỏng mà không khởi động lại gì. Đo cái bẫy lớn nhất: thiếu --target thì container gỡ rối nằm không gian PID riêng, không thấy tiến trình nào của ứng dụng (PID 1 là sh của chính nó, không phải /pause của mục tiêu). Có --target rồi thì đọc cả hệ tệp lẫn /proc/1/environ thật của container mục tiêu — thứ exec không bao giờ với tới.

DevOps 31/08/2026 7 phút

Token gắn vào pod Kubernetes in kèm cả tên pod lẫn tên node — pod chết là token vô hiệu ngay lập tức, không đợi hết hạn

Mỗi pod tự xưng danh với API server bằng một token ngắn hạn nằm ở /var/run/secrets, và nó không phải chìa khóa vạn năng: token gắn với đúng pod và đúng node, pod bị xoá thì token chết ngay nên kẻ nhặt được token của pod đã chết chẳng dùng được gì. Đo tiếp: cùng token đó gọi API cho kết quả 200/403 khớp CHÍNH XÁC RBAC — vì token chỉ trả lời 'anh là ai', còn 'anh được làm gì' vẫn do RBAC quyết. Và token dài hạn cho CI thì không gắn pod nào, dùng được ở bất cứ đâu, không thu hồi nổi trừ khi xoá ServiceAccount.