티스토리 뷰

Development

🕵🏻 eBPF가 뭘까?

KimDoubleB 2024. 1. 28. 22:51
반응형

Cilium을 공부하며 eBPF를 알게 되었다.
Cilium의 근간이 되므로, Cilium을 학습하기 이전에 간단하게나마 살펴보고자 한다.

이 글은 아래의 글들을 참고하여 작성되었다.


 

eBPF가 뭐야?

eBPF(extended Berkeley Packet Filter)란 운영체제 커널과 같은 권한이 있는 컨텍스트에서 샌드박스가 적용된 프로그램을 실행할 수 있는 기술

  • 프로그램을 변경/추가할 때마다 커널 소스코드를 변경하거나 커널 모듈을 새롭게 빌드/로드 할 필요가 없다.

 

 

왜 eBPF가 생겨났나?

  • OS는 전체 시스템을 감독하고 제어할 수 있는 커널의 권한으로 인해 항상 통합 가시성(Observability), 보안 및 네트워킹 기능을 구현하기에 이상적인 장소였음.
  • 동시에 OS kernel은 중심적인 역할이다보니 보안, 안정성에 대한 높은 요구사항으로 발전하기 어려웠음. 그래서 보통 OS 수준에서의 혁신속도는 OS 외부보다 느렸음.

 

eBPF는 이를 근본적으로 이를 바꿔놓았음.

  • OS에 추가기능을 넣기 위해 런타임 중 eBPF 프로그램을 실행하게 만들 수 있음.
  • OS는 JIT (Just-In-Time) 컴파일러 및 검증 엔진의 도움을 받아 기본적으로 컴파일 된 것처럼 안정성, 실행효율성을 보장함.
  • 이러한 장점들을 통해 차세대 네트워킹, 통합 가시성(Observability), 보안 기능 등 다양한 사용 사례를 포괄하는 eBPF 프로그램들이 나오고 있음.

 

 

BPF와의 관계?

eBPF는 어느순간 딱 만들어진 것이 아님

  • BPF (Berkely Packet Filter)가 1992년에 만들어졌음.
  • 이름 그대로 Packet filter를 통해 Packet을 분석하고 필터링하는데 사용되는 In-kernel Virtual Machine임.
    • 즉, 커널 내에서 가상머신으로서 동작하는 프로그램.
    • 가상의 레지스터와 스택 등을 가지고, 이를 바탕으로 코드를 실행.
  • Virtual Machine이라고 해서 성능이 안좋지는 않음. JIT 컴파일러가 추가되며 성능이 향상되었음.

 

 

BPF에서 뭐가 extended 되었나?

  • eBPF는 말 그대로 확장 BPF라는 것.
  • 기존 BPF를 토대로 레지스터 크기를 늘리거나, eBPF Maps라고 하는 맵 유형을 도입하는 등 변화들을 적용했음.
    • 사진의 왼쪽이 BPF 구조, 오른쪽이 eBPF 구조.

 

 

용어 정리 (BPF? eBPF? cBPF?)

  • eBPF는 앞서 이야기한대로 BPF를 기반으로 만들어졌음.
  • 하지만 eBPF는 본래 Packet을 분석하기 위한 용도를 넘어서 그 이상의 더 다양하고 많은 기능들에 사용되고 있음.
  • 그러면서 여러 프로젝트 문서에서 단순히 BPF라고 불러 헷갈리는 경우가 있는데, 요즘 날에와서는 왠만하면 BPF라고 함은 eBPF를 의미함.
    • 이 문서에서도 다음 문단부터는 BPF라 함은 eBPF를 의미함.
  • 그래서 이를 구분하기 위해 아예 처음에 고안됬던 BPF는 cBPF(classic BPF)라고 부르기도 함.
  • Cilium 문서에서도 이를 이야기하는데, 요즘에 클래식 BPF(cBPF)라고 불리는 기존 BPF 버전은 거의 사용하지 않는다고 함.
    • Linux kernel에서도 eBPF만 실행하며, 로드된 cBPF bytecode는 실행 전 kernel에서 eBPF로 변환됨.

 

 

문서를 보다보면 XDP라는 단어도 많이 등장함.

  • XDP: eXpress Data Path (문서)
    • 고성능 패킷 처리를 가능하게 하는 BPF framework
    • Network driver가 Packet을 수신하는 순간(소프트웨어에서 가능한 가장 빠른 시점) BPF 프로그램을 실행. 이를 통해 패킷이 수신되는 즉시 라우팅 결정을 할 수 있음.
    • Kernel 영역에서 사용하기에 User space에서만 동작하는 다른 Network framework와 다름. Kernel/User space 영역의 경계를 넘을 필요가 없어 성능적으로 우수함.

 

 

어떻게 동작해?

사실 단순하게 생각하면 그냥 "Event에 따라 eBPF 프로그램이 동작하는 구조"라고 보면 됨.

Kernel, Application이 특정 Hook 지점을 통과하면서 eBPF 프로그램이 실행됨.

  • Pre-defined hook에는 System call, Function entry/exit, Kernel trace point, Network event 등이 존재

 

 

Pre-defined hook이 없다면, Kernel Probe(kprobe), User Probe(uprobe)를 생성해 Kernel, Application의 거의 모든 위치에 eBPF 프로그램을 추가할 수 있음.

 

 

eBPF 이해를 위해

처음 eBPF/eBPF 프로그램이라고 하면, 역할에 대한 감이 안옴.

  • OS에서 동작하는 새로운 구조? 구조화된 어떤 프레임워크로 그걸 만드는건가? 새로운 언어로 OS에서 트리거하는거야? 등...

 

그래서 설명할 때 보통 HTML, Javascript를 예로 사용함.

  • Javascript를 사용하면 정적인 HTML 웹사이트 대신 마우스 클릭 같은 이벤트에 따라 실행되는 프로그램을 정의할 수 있음. 또한 이러한 프로그램은 Web browser의 안전한 머신에서 실행됨.
  • eBPF는 Javascript가 HTML에서 하는 일을 한다고 생각하면 됨. 예를 들어, Disk I/O 같은 이벤트에서 실행되는 미니프로그램(eBPF 프로그램)을 만들어 Kernel의 안전한 가상머신에서 실행시킬 수 있음.
    • eBPF가 Javascript 역할 자체라기보단, V8 javascript engine에 가까움. Web browser에 V8이 포함되듯, eBPF도 Linux kernel의 일부.

 

 

어떻게 eBPF 프로그램을 만들어?

개발하는 것도 위에서 말한 Javascript와의 관계와 비슷함.

  • Web browser에서 특정 기능을 동작시키기 위해 v8 bytecode로 작성하지 않음.
    • 왜? Low해서 이해하기 어렵고, 코드 짜는 것도 어려움.
  • 그래서 Javascript 또는 Javascript framework (jQuery, React, Vue 등)을 이용해 개발함.
  • eBPF도 마찬가지. eBPF로 직접 프로그래밍하는 것은 매우 어려움. ebpf를 위한 framework들이 존재함.
  • bcc, bpftrace 같은 framework가 있고, 이들은 kernel code base에 존재하는 것이 아닌 iovisor Linux Foundation project github에 있음.

 

 

즉, eBPF는 직접적으로 사용되지 않고, Cilium, bcc, bpftrace 같은 프로젝트에서 간접적으로 사용됨.

  • eBPF 위 추상화를 제공해서, 프로그램을 직접 작성할 필요 없이 intent 기반 정의(intent based definitions) 지정해 eBPF를 구현할 수 있도록 제공.
  • Development Toolchains 참고

사실 초보자(이용자)는 직접 eBPF 코드를 작성할 필요는 없음. bcc에는 바로 사용할 수 있는 70개 이상의 도구가 포함되어있고, 여러 기능을 지원하는 툴들이 제공되고 있음.

 

 

Kernel 영역? 안전해 이거?

eBPF는 kernel 영역 단에서 호출을 통해 실행되는 만큼 안정성이 매우 중요하다.
성능, 보안 등 이슈가 발생할 수 있는 만큼 eBPF 프로그램에 대한 검증이 필수적이다.

Verification step에서는 아래와 같은 조건들이 충족되는지 확인한다.

  • eBPF 프로그램을 실행하는 프로세스가 필요한 권한을 보유하는지 확인한다. 권한이 있는 프로세스만 eBPF 프로그램을 활용할 수 있다.
  • 시스템과 충돌을 일으키거나 손상을 일으키지 않는지 확인한다.
  • '완료'됨을 보장하는지 확인한다. 즉, 무한루프에 빠지지 않는지 확인한다.
  • 자세한 건 eBPF Safety section을 참고

 

 

전체적인 Loader & Verification Architecture 과정을 보면 다음 사진과 같다.

 

 

eBPF Maps?

  • eBPF 프로그램의 중요한 역할 중 하나는 수집된 정보를 공유하고, 상태를 저장하는 것
  • 이를 위해 eBPF 프로그램은 다양한 데이터 구조에 데이터를 저장하고 검색하기 위해 eBPF Map 개념을 활용할 수 있음.
  • eBPF Map은 System call을 통해 user space 애플리케이션 뿐 아니라 eBPF 프로그램에서도 접근할 수 있음.
  • 다양한 구조를 지원
    • Hash table, array
    • LRU, Ring buffer, Stack trace 등
    • 점점 더 규칙이 추가되고 확장되고 있음

 


좋아, 여기까지만 일단 알아보고 Cilium을 알아보기로 하자.

더 많은 내용은 ebpf Futher Reading을 살펴보자. 좋은 내용이 많다.

320x100
반응형
댓글
반응형
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함