eBPF 입문: eBPF VM부터 자체 도구 제작까지 (실제 Cilium 클러스터에서 테스트)
출처: Dev.to
지금 내가 만든 쿠버네티스 클러스터의 한 워커 노드에서 140개의 eBPF 프로그램이 리눅스 커널 안에서 실행되고 있다 — 모든 패킷을 라우팅하고, 디바이스 접근을 제어하며, 메트릭을 수집한다. 커널을 다시 컴파일한 사람은 없고, 모듈을 로드한 사람도 없다.
그 문장이 바로 내가 eBPF From Scratch를 쓴 전체 이유다. 이 무료 22장 시리즈는 “eBPF 가상 머신이 도대체 뭐지?”부터 시작해 C와 libbpf + CO‑RE, 그리고 Go와 cilium/ebpf를 이용해 직접 eBPF 프로그램을 작성하고 로드하는 단계까지 안내한다.
👉 무료로 읽기 (영문): https://kkloudtarus.net/en/blog/series/ebpf-from-scratch
소스 코드: https://github.com/nghiadaulau/ebpf-from-scratch
모든 예제는 실제 하드웨어에서 테스트했다 — 커널 6.17과 Cilium 1.19( kube‑proxy 없이, 수백 개의 BPF 프로그램이 실시간으로 동작)으로 구성된 쿠버네티스 클러스터가 전 과정의 실험실이다. 손으로 그린 도식이 아니라 실제 실행 중인 프로그램을 직접 분석한다.
공식 문서(ebpf.io, kernel.org, libbpf, cilium)를 기반으로 하며, 주장들은 검증된 것이다.
표면적인 내용이 아니라 깊이 파고든다 — 레지스터, 검증기(verifier)의 안전성 증명, JIT, 맵, 그리고 프로그램이 겪는 정확한 라이프사이클까지 다룬다.
영어와 베트남어 두 언어로 제공된다.
빠른 맛보기 — 모든 eBPF 개념을 실제 노드에서 직접 확인할 수 있다
sudo bpftool prog show id 2871
2871: sched_cls name tail_no_service_ipv4 tag fe7bcb57c001d434 gpl
xlated 4920B jited 2778B memlock 8192B map_ids 171,631
btf_id 758
xlated= 검증기가 허용한 뒤의 바이트코드jited= 네이티브 머신 코드map_ids= 상태를 유지하는 방법
슬라이드가 아니라 실제로 실행 중인 eBPF다.
Part I — Foundations
- The eBPF Virtual Machine: 레지스터, 명령어 집합, 바이트코드
- The Verifier: 왜 eBPF가 커널을 크래시 시키지 않는가
- Maps: 메모리와 유저스페이스 간 다리
- Program types and hooks: 어디에 붙이고, 무엇을 보는가
- BTF and CO-RE: 한 번 컴파일하고 모든 커널에서 실행하기
Part II — Tracing
- bpftrace: 한 줄 명령부터 맵, 카운팅, 히스토그램까지
- uprobe, USDT: 호스트에서 파드 검사하기
Part III — Writing real tools
- libbpf + CO-RE: 직접 eBPF 도구 작성하기 (C)
- cilium/ebpf: Go에서 eBPF 로드하기
Part IV — Networking
- XDP: 가장 이른 단계에서 패킷 처리하기 — 방화벽 구현
- tc/sched_cls: 실시간 Cilium 데이터패스 분석
- tc 프로그램 직접 작성:
__sk_buff와 tcx 체인
Part V — Security
- LSM BPF: 커널 내부에서 보안 강제
- seccomp-bpf: 모든 컨테이너의 시스템 콜 필터링
- The Tetragon way:
bpf_send_signal로 관찰에서 강제까지
Part VI — Observability
- CPU profiling with perf_event: 플레임 그래프의 기반
- Off-CPU and scheduler latency
- Inside Hubble: eBPF 이벤트에서 클러스터 전체 네트워크 흐름까지
Part VII — Putting it together
- Case study: Cilium의 eBPF 데이터패스를 통한 패킷 흐름
- Capstone:
connmon작성하기 — 노드 전체 TCP 연결 모니터
이 시리즈는 “Cilium이 eBPF로 그거 한다”는 말을 듣고 실제로 이해하고 직접 구현하고 싶은 백엔드·플랫폼·SRE·보안 담당자를 위한 것이다. 리눅스 커맨드 라인에 익숙해야 하며, 나머지는 모두 기초부터 차근차근 구축한다.
읽어보신 뒤 피드백을 정말 환영한다 — 어떤 부분이 명확했는지, 어떤 부분이 부족했는지 알려 주세요. 그리고 유용했다면 레포지토리에 ⭐ 하나만 눌러 주시면 큰 도움이 된다.
시작하기 → https://kkloudtarus.net/en/blog/series/ebpf-from-scratch