Blog
Thoughts on engineering, design, and building great products.
State: Terraform Lưu Gì, Vì Sao Cần, và Drift
Đào vào file state: vì sao Terraform cần nó thay vì hỏi thẳng AWS mỗi lần, nó lưu chính xác cái gì, và cơ chế refresh so ba chiều giữa cấu hình, state và thực tế. Tự tay tạo drift bằng AWS CLI rồi xem Terraform phát hiện ra sao, khác nhau giữa plan thường và plan -refresh-only.
HCL Từ Trong Ra Ngoài: Block, Kiểu Dữ Liệu, Biểu Thức
Mổ xẻ ngôn ngữ HCL cho ra ngọn ngành: cấu trúc một block gồm gì, các kiểu dữ liệu string/number/bool/list/map/null, biểu thức và hàm, cách nội suy chuỗi. Dùng terraform console để thử trực tiếp, và xem block terraform{} còn khai báo được những gì.
Provider, Resource Đầu Tiên, và Vòng Đời init plan apply destroy
Dựng resource AWS thật đầu tiên: khai báo provider và pin phiên bản, tạo một bucket S3, rồi đi trọn vòng init → plan → apply → destroy. Mỗi lệnh làm gì bên trong, vì sao plan ghi 'known after apply', state lưu cái gì, và vì sao chạy apply lần hai không tạo thêm gì.
Infrastructure as Code, Terraform Là Gì, và Làm Quen CLI
Bài mở đầu series: vì sao quản lý hạ tầng bằng tay sớm muộn cũng vỡ, Infrastructure as Code giải quyết điều gì, Terraform đứng ở đâu trong bức tranh đó. Mổ kiến trúc core và provider, cài Terraform 1.15, và đi một vòng các lệnh CLI chính.
Hubble Bên Trong: Từ Sự Kiện eBPF Tới Luồng Mạng Toàn Cụm
Hubble cho ta xem mọi kết nối trong cụm Kubernetes theo tên pod, service, verdict policy — mà không cài sidecar vào pod nào. Bài này mổ cơ chế: datapath eBPF của Cilium (74 chương trình sched_cls ở Bài 12) gọi bpf_perf_event_output đẩy sự kiện vào một perf ring buffer tên cilium_events; cilium-agent đọc ra (cilium monitor cho thấy sự kiện thô với identity dạng số); rồi Hubble giàu hóa — biến identity 18203 thành kube-system/coredns — bằng cách tra kho identity-nhãn. Ta xem cả ba tầng chạy thật.
Kiểu Tetragon: Từ Quan Sát Đến Cưỡng Chế Bằng bpf_send_signal
Tetragon là công cụ an ninh runtime của hệ Cilium: nó quan sát bằng kprobe/tracepoint (đúng những hook Part II dùng) rồi cưỡng chế ngay trong nhân. Cơ chế cưỡng chế thật của nó là hai helper — bpf_send_signal gửi SIGKILL giết tiến trình, và bpf_override_return ghi đè giá trị trả về syscall. Bài này tự dựng đúng cơ chế đó: một tracepoint exec gọi bpf_send_signal(SIGKILL) để giết một tiến trình ngay khi nó chạy — binary cấm nhận exit 137, binary thường vẫn chạy. Không cần LSM hay reboot.
LSM BPF: Cưỡng Chế An Ninh Ngay Trong Nhân
Tới giờ eBPF của ta chỉ quan sát. LSM BPF thì cưỡng chế: gắn vào các điểm kiểm soát an ninh của nhân (Linux Security Modules) mà SELinux, AppArmor dùng, và một chương trình trả về 0 cho qua hay -EPERM để chặn. Bài này viết một chương trình LSM chặn mở file, và gặp một bài học thật: lần đầu nó nạp và gắn được nhưng không chặn gì — vì bpf chưa nằm trong danh sách LSM hoạt động. Bật bpf bằng tham số boot rồi reboot, cùng chương trình đó chặn thật — cat và python đều nhận Operation not permitted.