eBPF 입문: eBPF VM부터 자체 도구 제작까지 (실제 Cilium 클러스터에서 테스트)

발행: (2026년 5월 25일 AM 12:08 GMT+9)
6 분 소요
원문: Dev.to

출처: 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

0 조회
Back to Blog

관련 글

더 보기 »

내 스킬

프로젝트를 위한 AI 지시문을 만들고, 설치하고, 관리하세요 — 코딩이 필요 없습니다. CREATE 이름을 정하고, 카테고리를 선택하고, 원하는 것을 설명하세요 — 마법사가 자동으로 구성합니다.