Blog
Thoughts on engineering, design, and building great products.
CustomResourceDefinition: Thêm Kiểu Của Riêng Bạn
Part XII chuyển từ dùng Kubernetes sang mở rộng nó. Bài đầu là CustomResourceDefinition — khai một kiểu object mới, và API server lập tức phục vụ nó như resource gốc: kubectl get được, validate theo schema, lưu trong etcd. Ta dựng một CRD Widget có ràng buộc kiểu và miền giá trị, tạo custom resource hợp lệ, xem hai cái sai bị từ chối, rồi cập nhật status qua subresource riêng.
Secret, Lối Vòng và Hardening
Part XI khép lại ở Secret và những lỗ hổng còn sót. Ta đọc thẳng etcd để xác nhận Secret được mã hóa at-rest từ Bài 5, rồi dựng một lối vòng thật: một ServiceAccount không có quyền đọc Secret vẫn moi được giá trị bằng cách tạo một pod mount Secret đó và đọc log. Cuối bài là bảng các bước siết cụm tự dựng — cái nào đã làm trong series, cái nào còn thiếu.
Seccomp, AppArmor và Capabilities
Bài 54 bắt pod khai runAsNonRoot, drop ALL capabilities, seccomp RuntimeDefault — nhưng đó mới là chính sách ở mức Kubernetes. Bài này xuống tầng kernel xem chúng làm gì thật: đọc /proc/self/status của hai pod, một mặc định một đã siết, so từng dòng CapEff, Seccomp, NoNewPrivs, AppArmor. Rồi chứng minh bằng tay rằng drop một capability chặn được thao tác cụ thể — chown bị từ chối ngay cả khi container vẫn chạy bằng root.
Pod Security Standards và Admission
RBAC quyết ai được tạo pod, nhưng không xét pod đó xin gì. Một pod chạy privileged hay mượn hostNetwork là cửa thoát ra node. Pod Security Admission chặn ngay từ lúc tạo: gắn một nhãn lên namespace, API server đo pod theo ba mức privileged/baseline/restricted và từ chối pod vi phạm. Bài này bật restricted lên một namespace, xem pod thường bị đá ra với danh sách lỗi, viết một pod tuân thủ cho chạy được, rồi thử chế độ warn chỉ cảnh báo.
ServiceAccount và Bound Token
Bài 51–52 dùng ServiceAccount mà chưa mổ nó. Bài này đi vào cơ chế: mỗi namespace có một SA default, kubelet tự tiêm vào pod một token ngắn hạn qua projected volume, và token đó bound vào đúng pod lẫn node. Để chứng minh là bound thật, ta lấy token trong một pod đang chạy, gọi API thành công, rồi xóa pod — token cũ lập tức thành 401. Kèm cách tắt auto-mount và đọc các claim trong JWT.
RBAC: Biến Danh Tính Thành Quyền
Bài 51 dừng ở chỗ API server biết bạn là ai. RBAC trả lời câu còn lại: bạn được làm gì. Bài này dựng một ServiceAccount chỉ đọc được pod trong một namespace, kiểm chứng bằng kubectl auth can-i lẫn token thật — thấy nó list pod được nhưng đọc secret hay tạo pod thì bị 403. Rồi xem cách một RoleBinding trỏ vào ClusterRole có sẵn để cấp quyền gói gọn trong một namespace, và vì sao ClusterRole view cố tình không cho đọc secret.
Authentication và Đường Vào API Server
Mỗi lệnh kubectl là một request HTTPS tới API server, và trước khi chạm được dữ liệu nó phải qua ba chặng: authentication, authorization, admission. Bài này mở Part XI bằng chặng đầu — API server nhận ra bạn là ai. Ta soi ba cách cụm tự dựng chứng thực một request: client certificate (cái admin.kubeconfig đang dùng), token của ServiceAccount, và request ẩn danh — bằng kubectl auth whoami và lệnh thật trên cụm.