eBPF란? 쿠버네티스와 DevOps 엔지니어를 위한 실용 가이드
Source: Dev.to
**eBPF (extended Berkeley Packet Filter)**는 커널 소스 코드를 수정하거나 기존 커널 모듈을 로드하지 않고도 Linux 커널 내부에서 샌드박스된 프로그램을 실행할 수 있게 해줍니다. 원래는 패킷 필터링을 위해 설계되었지만, 현재는 관측성, 네트워킹, 보안을 위해 프로덕션 인프라 전반에서 사용되는 범용 인‑커널 가상 머신으로 진화했습니다.
Kubernetes와 DevOps 엔지니어에게 eBPF가 중요한 이유는 다음과 같은 핵심 도구들을 구동하기 때문입니다:
- Cilium – 주요 클라우드 제공업체에서 사용하는 CNI 플러그인
- Falco와 Tetragon – 런타임 보안
- Pixie – 자동 계측 관측성
eBPF가 내부에서 작동하는 원리
전통적으로 Linux 커널에 기능을 추가한다는 것은 다음 중 하나를 의미했습니다:
- 커널 소스 수정 (느리며, 실제 운영 환경에 적용하기 비현실적)
- 커널 모듈 작성 (전체 권한으로 실행되며, 버그가 있으면 시스템을 크래시시킬 수 있음)
eBPF는 세 번째 옵션을 제공합니다: 커널이 실행 전에 안전성을 검증하는 작은 프로그램을 작성합니다. 이 프로그램은 샌드박스에서 실행되어 커널을 크래시시킬 수 없으며, JIT 컴파일을 통해 거의 네이티브에 가까운 성능을 달성합니다.
eBPF 파이프라인
| 단계 | 설명 |
|---|---|
| 프로그램 작성 | C의 제한된 서브셋을 사용하고 LLVM/Clang으로 eBPF 바이트코드로 컴파일합니다. bpftrace와 같은 고수준 도구를 사용하면 더 간단한 스크립트 언어를 사용할 수 있습니다. |
| 로드 및 검증 | eBPF 검증기는 바이트코드를 정적으로 분석합니다 (종료 보장, 범위 초과 메모리 접근 금지, 비특권 연산 금지). |
| JIT 컴파일 | 검증된 바이트코드를 네이티브 머신 명령어(x86_64, ARM64)로 변환하여 최대 성능을 제공합니다. |
| 후크 포인트에 연결 | 프로그램을 실행될 특정 커널 후크에 바인딩합니다. |
| 맵을 통한 통신 | 커널과 사용자 공간 모두에서 접근 가능한 키‑값 데이터 구조를 사용합니다. |
Hook Points: Where eBPF Programs Run
- kprobes / kretprobes – 커널 함수에 붙일 수 있음 (stable ABI에 포함되지 않음; 버전마다 변경될 수 있음).
- tracepoints – 안정적인 계측 지점; 프로덕션 사용에 권장.
- XDP (eXpress Data Path) – 네트워크 수신 경로에서 가장 초기 지점; 초당 수백만 패킷을 처리. DDoS 완화 및 로드 밸런싱에 사용.
- TC (Traffic Control) – 인그레스 및 이그레스 네트워크 트래픽; Cilium이 K8s 네트워크 정책에 사용.
- uprobes – 컴파일된 바이너리(Go, C, Rust)의 사용자‑공간 함수를 수정 없이 추적.
- LSM (Linux Security Module) – 보안‑관련 결정 지점; Tetragon이 사용.
eBPF vs. 전통적인 커널 모듈
| 항목 | eBPF | 커널 모듈 |
|---|---|---|
| 안전성 | 실행 전에 검증되며, 커널을 크래시시킬 수 없습니다. | 버그가 커널 패닉을 일으킬 수 있습니다. |
| 이식성 | CO‑RE(Compile Once, Run Everywhere) 덕분에 동일한 프로그램을 다양한 커널 버전에서 실행할 수 있습니다. | 보통 특정 커널 버전에 종속됩니다. |
| 재부팅 필요성 | 런타임에 동적으로 로드/언로드합니다. | 새 코드를 로드하려면 일반적으로 재부팅이 필요합니다. |
| 성능 | JIT 컴파일되어 네이티브 코드로 변환되며, 오버헤드가 최소입니다. | 비슷하지만 안전 보장이 없습니다. |
| 반복 속도 | 작성, 로드, 테스트, 언로드를 몇 초 안에 수행합니다. | 개발 및 테스트 주기가 더 깁니다. |
실용적인 eBPF: bpftrace 예제
bpftrace는 eBPF용 고수준 트레이싱 언어입니다. 아래는 최신 Linux 시스템에서 바로 실행할 수 있는 예제들입니다.
파일 열기 추적
# Trace all openat() syscalls and print the filename
bpftrace -e '
tracepoint:syscalls:sys_enter_openat {
printf("%s %s\n", comm, str(args.filename));
}'
프로세스별 시스템 콜 카운트 (5초 윈도우)
# Count syscalls per process over 5 seconds
bpftrace -e '
tracepoint:raw_syscalls:sys_enter {
@[comm] = count();
}
interval:s:5 { exit(); }'
읽기 크기 히스토그램
# Distribution of read() sizes
bpftrace -e '
tracepoint:syscalls:sys_enter_read {
@bytes = hist(args.count);
}'
새 TCP 연결 추적
# Trace new TCP connections
bpftrace -e '
kprobe:tcp_connect {
printf("%s -> %s\n", comm,
ntop(((struct sock*)arg0)->__sk_common.skc_daddr));
}'
Kubernetes에서 eBPF: 중요한 도구들
Cilium (네트워킹 + 서비스 메시)
Cilium은 TC 훅에 연결된 eBPF 프로그램으로 iptables 기반 Kubernetes 네트워킹을 대체합니다.
- iptables 규칙 없음 – 네트워크 정책이 eBPF에 의해 직접 적용되어 iptables 체인의 O(n) 확장 문제를 피합니다.
- 사이드카 없는 서비스 메시 – Envoy 사이드카 대신 커널 수준 eBPF 프로그램을 통해 mTLS, L7 정책, 관측성을 제공합니다.
- Hubble – 클러스터 전체에 걸친 네트워크 흐름 가시성을 제공합니다.
Tetragon (런타임 보안)
Tetragon은 eBPF를 활용해 커널 수준에서 보안 정책을 적용합니다. 주요 기능은 다음과 같습니다.
- 워크로드별 특정 시스템 콜을 모니터링하고 차단합니다.
- 침해를 나타내는 파일 접근 패턴을 탐지합니다.
- 전체 부모‑자식 관계를 포함한 프로세스 실행 트리를 추적합니다.
- Cilium과 독립적으로 L3/L4/L7 네트워크 정책을 적용합니다.
Falco (위협 탐지)
Falco는 eBPF를 이용해 커널 시스템 콜을 감시하고 비정상 행동을 탐지합니다. 규칙 엔진을 통해 다음과 같은 정책을 정의할 수 있습니다.
- “컨테이너가 쉘을 실행하면 경고.”
- “프로세스가
/etc/shadow를 열면 경고.”
Pixie (자동 계측 관측)
Pixie는 eBPF uprobes와 kprobes를 사용해 자동으로 다음을 캡처합니다.
- 전체 HTTP/gRPC 요청 및 응답 본문.
- 데이터베이스 쿼리 (MySQL, PostgreSQL, Cassandra, Redis).
- DNS 요청 및 응답.
- CPU와 메모리 프로파일링 데이터.
코드 변경이나 사이드카 컨테이너 없이 모든 작업을 수행합니다.
2026년 eBPF 현황
- BPF Arena & user‑space 메모리 매핑 – 커널과 사용자 공간 간 복잡한 데이터 공유를 가능하게 합니다.
- kfuncs – eBPF가 커널 기능에 접근할 수 있는 범위를 확대하여 기능이 풍부한 프로그램을 더 쉽게 작성할 수 있게 합니다.
- BPF 토큰 및 위임 – 컨테이너와 서버리스 런타임을 위한 세밀한 권한 모델을 제공합니다.
- 향상된 CO‑RE 툴링 – 커널 버전별 재컴파일 필요성을 더욱 줄여줍니다.
- 클라우드 네이티브 생태계에서의 광범위한 채택 – 주요 Kubernetes 배포판 및 서비스 메쉬 제품에 통합되었습니다.
모든 명령은 필요한 권한(보통 sudo)이 있으며 시스템에 bpftrace가 설치되어 있다고 가정합니다.
eBPF for Windows – Microsoft에서 제공, eBPF 모델을 크로스‑플랫폼으로 가져옵니다.
- eBPF Foundation (Linux Foundation) 은(는) 공급업체 중립성을 보장합니다.
Kubernetes에서 eBPF 시작하기
- Cilium을 CNI로 시작하세요. GKE, EKS, AKS 모두 지원합니다.
- 네트워크 흐름 가시성을 위해 Hubble을 추가하세요.
- 보안 모니터링을 위해 Tetragon 또는 Falco를 배포하세요.
- 임시 디버깅을 위해 bpftrace를 탐색하세요 (특권 pod로 실행).
- 커널 호환성 확인 – 대부분의 기능은 Linux 4.15+가 필요하며, 5.x 및 6.x 시리즈에서 크게 개선되었습니다.
eBPF는 Linux와 Kubernetes에서 가시성, 네트워킹, 보안이 작동하는 방식을 근본적으로 바꾸었습니다. 개념적인 수준이라도 이를 이해하는 것은 K8s 인프라를 운영하는 모든 사람에게 필수적이 되고 있습니다.
관련 읽기
- 컨테이너 이미지 스캔: Clair vs Trivy vs Grype
- 컨테이너 탈출 취약점
- Kubernetes 업그레이드 체크리스트
- 프로덕션 환경에서 Docker vs Kubernetes
원본은 ReleaseRun에 게시되었습니다.
