Upgrade to Pro — share decks privately, control downloads, hide ads and more …

eBPF와 함께 이해하는 Cilium 네트워킹

Hayoung Lee
December 15, 2022

eBPF와 함께 이해하는 Cilium 네트워킹

2022년 12월 Kubernetes Korea Group Meet up 에서 발표한 자료입니다.

발표 내용 소개
> eBPF 는 커널 영역에서 사용자가 정의한 코드를 쉽고 안전하게 실행하는 기술로 네트워킹과 트레이싱에 많이 사용되고 있습니다. Kubernetes의 대표적인 네트워크 플러그인 중 하나인 Cilium은 eBPF를 기반으로 구현되었으며, 또 다른 플러그인인 Calico도 eBPF를 지원하기 시작했습니다. 이번 세션에서는 eBPF가 무엇인지 정확하게 이해하고, Cilium 의 네트워킹에서 eBPF 프로그램이 어떻게 사용되는지 알아보겠습니다.

저자 및 배경 소개
> 저는 네이버 클로바에서 백앤드 엔지니어로 일하고 있는 이하영입니다. 개발자로 일을 시작한지는 이제 막 2년이 넘었고, 사내에서 Kubernetes를 활발히 활용하지만 네트워크 플러그인으로 Cilium을 사용하지는 않아서 관련 스터디를 시작하게 되었습니다. 미약하지만 저처럼 공부를 시작하신 분들을 위해 스터디 결과물을 공유하고자 합니다.

https://hadaney.tistory.com/

Hayoung Lee

December 15, 2022
Tweet

Other Decks in Programming

Transcript

  1. 다룰 내용 eBPF - eBPF 란? - eBPF 프로그램 주입

    방식 - BCC 기반 eBPF 프로그래밍 eBPF 기반 Cilium 네트워킹 - Cilium 이란? - Cilium 에서 eBPF 의 역할
  2. eBPF 로 뭘 해볼 수 있을까? • 누군가 나 모르게

    내 컴퓨터에 디렉토리를 만들 때마다 알려줬으면 좋겠다. eBPF 란?
  3. eBPF 로 뭘 해볼 수 있을까? • 누군가 나 모르게

    내 컴퓨터에 디렉토리를 만들 때마다 알려줬으면 좋겠다. • 우리 시스템을 자꾸 멈추게 만드는 프로세스를 찾고 말겠어. eBPF 란?
  4. eBPF 로 뭘 해볼 수 있을까? • 누군가 나 모르게

    내 컴퓨터에 디렉토리를 만들 때마다 알려줬으면 좋겠다. • 우리 시스템을 자꾸 멈추게 만드는 프로세스를 찾고 말겠어. • 내가 GCP의 Compute Engine에 접속하면 어떤 셋팅들을 하게 되는지 알고 싶어. eBPF 란?
  5. eBPF 로 뭘 해볼 수 있을까? • 누군가 나 모르게

    내 컴퓨터에 디렉토리를 만들 때마다 알려줬으면 좋겠다. • 우리 시스템을 자꾸 멈추게 만드는 프로세스를 찾고 말겠어. • 내가 GCP의 Compute Engine에 접속하면 어떤 셋팅들을 하게 되는지 알고 싶어. ➡ 어떤 이벤트가 발생했을 때 eBPF 란?
  6. eBPF 로 뭘 해볼 수 있을까? • 누군가 나 모르게

    내 컴퓨터에 디렉토리를 만들 때마다 알려줬으면 좋겠다. • 우리 시스템을 자꾸 멈추게 만드는 프로세스를 찾고 말겠어. • 내가 GCP의 Compute Engine에 접속하면 어떤 셋팅들을 하게 되는지 알고 싶어. ➡ 원하는 동작을 수행한다 eBPF 란?
  7. eBPF 로 뭘 해볼 수 있을까? • 누군가 나 모르게

    내 컴퓨터에 디렉토리를 만들 때마다 알려줬으면 좋겠다. • 우리 시스템을 자꾸 멈추게 만드는 프로세스를 찾고 말겠어. • 내가 GCP의 Compute Engine에 접속하면 어떤 셋팅들을 하게 되는지 알고 싶어. ➡ 어떤 이벤트가 발생했을 때, 원하는 동작을 수행한다. eBPF 란?
  8. eBPF 로 뭘 해볼 수 있을까? • 누군가 나 모르게

    내 컴퓨터에 디렉토리를 만들 때마다 알려줬으면 좋겠다. • 우리 시스템을 자꾸 멈추게 만드는 프로세스를 찾고 말겠어. • 내가 GCP의 Compute Engine에 접속하면 어떤 셋팅들을 하게 되는지 알고 싶어. eBPF Hook 프로세스가 Hook point를 지나면 eBPF 프로그램이 실행된다. eBPF 란?
  9. eBPF 로 뭘 해볼 수 있을까? • 누군가 나 모르게

    내 컴퓨터에 디렉토리를 만들 때마다 알려줬으면 좋겠다. • 우리 시스템을 자꾸 멈추게 만드는 프로세스를 찾고 말겠어. • 내가 GCP의 Compute Engine에 접속하면 어떤 셋팅들을 하게 되는지 알고 싶어. eBPF Map eBPF 프로그램은 실행 상태나 결과를 Map 에 기록할 수 있다. 기록된 데이터들은 user space 에도 공유될 수 있다. eBPF 란?
  10. • 누군가 나 모르게 내 컴퓨터에 디렉토리를 만들 때마다 알려줬으면

    좋겠다 ➡ eBPF 프로그램이 어떻게 실행되는지 알아보자! eBPF 란?
  11. user process system events (eBPF hook) eBPF Maps user space

    kernel space eBPF Program 내 컴퓨터에 디렉토리를 만들 때마다 알려줘! eBPF 란?
  12. system events (eBPF hook) eBPF Maps eBPF Program user process

    user space kernel space 🥸 디렉토리 생성 eBPF 란?
  13. eBPF Maps eBPF Program system events (eBPF hook) user process

    user space kernel space 🥸 디렉토리 생성 mkdir 감지 eBPF 란?
  14. eBPF Maps user process 🥸 디렉토리 생성 system events (eBPF

    hook) user space kernel space eBPF Program eBPF 프로그램 동작 ✔ mkdir 감지 JIT Compiler eBPF 란?
  15. system events (eBPF hook) user process 🥸 디렉토리 생성 mkdir

    감지 eBPF Maps user space kernel space eBPF Program * 범인 🥸 기록 * eBPF 란?
  16. system events (eBPF hook) user process 🥸 디렉토리 생성 mkdir

    감지 eBPF Maps user space kernel space eBPF Program * 범인 🥸 기록 * eBPF 란?
  17. • eBPF는 특정한 이벤트가 트리거될 때, 원하는 동작을 실행할 수

    있는 기술이다. • 프로세스가 특정한 eBPF Hook 지점을 지날 때, eBPF 프로그램이 동작한다. NOTE eBPF 란?
  18. • eBPF는 특정한 이벤트가 트리거될 때, 원하는 동작을 실행할 수

    있는 기술이다. • 프로세스가 특정한 eBPF Hook 지점을 지날 때, eBPF 프로그램이 동작한다. • eBPF Map에 실행 상태나 결과를 기록하고, 그 값을 user space에 공유할 수 있다. NOTE eBPF 란?
  19. eBPF Maps kernel space eBPF Program 내 컴퓨터에 디렉토리를 만들

    때마다 알려줘! 어떻게 eBPF 프로그램을 kernel space 에 주입할까? eBPF 프로그램 주입 방식
  20. eBPF Program kernel space user space C, Java, Python 등

    다른 프로그래밍 언어들처럼 코드를 작성하고 Linux Kernel 에 로드하면 되는 걸까? eBPF Program eBPF 프로그램 주입 방식
  21. eBPF Program kernel space user space Linux Kernel 에서는 bytecode

    로 쓰여진 eBPF 프로그램만 로드할 수 있다 eBPF Program eBPF 프로그램 주입 방식
  22. eBPF Program user space 1. C 소스 코드로 eBPF 프로그램을

    작성 #include <linux/bpf.h> #include <bpf/bpf_helpers.h> SEC(“xdp_drop”) int xdp_drop_prog(struct xdp_md *ctx) { return XDP_DROP; } c source eBPF 프로그램 주입 방식
  23. eBPF Program eBPF bytecode kernel space user space c source

    2. 작성한 eBPF 프로그램을 compiler 로 eBPF bytecode 로 변환 Clang/LLVM compiler eBPF 프로그램 주입 방식
  24. eBPF bytecode kernel space user space Verification Load in-kernel VM

    3. bytecode 로 변환된 eBPF 프로그램을 로드 eBPF 프로그램 주입 방식
  25. in-kernel VM eBPF bytecode kernel space user space Verification Load

    eBPF bytecode는 generic eBPF library 를 통해 커널에 로드될 수 있다. eBPF 프로그램 주입 방식
  26. in-kernel VM eBPF bytecode kernel space user space Verification Load

    Go Library libbpf C/C++ Library eBPF bytecode는 generic eBPF library 를 통해 커널에 로드될 수 있다. eBPF 프로그램 주입 방식
  27. eBPF bytecode user space Load 3. bytecode 로 변환된 eBPF

    프로그램을 로드 Verification in-kernel VM verifier 가 eBPF 프로그램 실행을 검토 kernel space eBPF 프로그램 주입 방식
  28. eBPF bytecode user space Load 3. bytecode 로 변환된 eBPF

    프로그램을 로드 Verification in-kernel VM verifier 가 eBPF 프로그램 실행을 검토 • 충분한 privilege 가 있는지 • 시스템과 충돌하거나 손상을 주지는 않는지 • 무한 루프에 빠지지 않고 정상 종료되는지 kernel space eBPF 프로그램 주입 방식
  29. user space kernel space Verification eBPF Program verification 을 통과하면

    준비 완료! approved eBPF 프로그램 주입 방식
  30. eBPF Program eBPF bytecode kernel space user space Verification in-kernel

    VM c source Clang/LLVM compiler approved eBPF Program 여기까지가 eBPF 프로그램을 Linux Kernel 에 로드하는 방법입니다. Load eBPF 프로그램 주입 방식
  31. kernel space user space approved eBPF Program 앞에서 배운 것을

    새겨볼 겸, 이어서 주입된 eBPF 프로그램이 어떻게 동작하는지 확인해봅시다 eBPF 프로그램 주입 방식
  32. kernel space user space eBPF Program eBPF hook user process

    user process 가 특정한 이벤트를 수행 eBPF 프로그램 주입 방식
  33. user space user process kernel space approved eBPF Program eBPF

    hook JIT Compiler in-kernel VM eBPF hook 이 이벤트를 트리거해서 eBPF 프로그램을 실행 eBPF 프로그램 주입 방식
  34. kernel space user space eBPF Map user process eBPF Program

    결과나 상태를 eBPF Map 에 기록하고, user space 에서 Map 의 정보를 확인할 수 있다. eBPF 프로그램 주입 방식
  35. • C 언어로 eBPF 프로그램을 작성하고 Clang/LLVM 컴파일러로 bytecode로 변환한다.

    • verifier는 로드된 eBPF 프로그램이 kernel 에서 실행하기에 안전한지 검증한다. NOTE eBPF 프로그램 주입 방식
  36. • C 언어로 eBPF 프로그램을 작성하고 Clang/LLVM 컴파일러로 bytecode로 변환한다.

    • verifier는 로드된 eBPF 프로그램이 kernel 에서 실행하기에 안전한지 검증한다. • 성공적으로 주입된 eBPF 프로그램은 정의된 eBPF Hook에 걸렸을 때 동작된다. ( JIT Compiler ) NOTE eBPF 프로그램 주입 방식
  37. 우리는 지금까지 • eBPF 가 무엇이며 • eBPF 프로그램이 동작하는

    방식과 • eBPF 프로그램을 커널에 주입하는 방법 에 대해 알아보았습니다. BCC 기반 eBPF 프로그래밍
  38. eBPF Program eBPF bytecode kernel space user space Verification Load

    c source Clang/LLVM compiler approved eBPF Program eBPF 프로그램을 커널에 주입하는 방법으로 돌아가보자 BCC 기반 eBPF 프로그래밍
  39. in-kernel VM eBPF bytecode kernel space user space Verification Load

    Go Library libbpf C/C++ Library eBPF Program c source Clang/LLVM compiler generic eBPF library 를 통해 eBPF bytecode를 가져와 커널에 로드할 수 있다. eBPF 프로그램 주입 방식
  40. in-kernel VM eBPF bytecode kernel space user space Verification Load

    Go Library libbpf C/C++ Library eBPF Program c source Clang/LLVM compiler generic eBPF library 를 통해 eBPF bytecode를 가져와 커널에 로드할 수 있다. 1 2 3 eBPF 프로그램 주입 방식
  41. 그러나 eBPF 프로그램을 커널에 로드하기까지 과정이 번거롭다. ➢ C 소스코드

    기반의 eBPF 프로그램 작성 ➢ compiler 를 통해 bytecode 로 변환 ➢ Verifier를 거쳐서 kernel space에 로드 BCC 기반 eBPF 프로그래밍
  42. 그러나 eBPF 프로그램을 커널에 로드하기까지 과정이 번거롭다. 으으 어렵다! 좀

    더 쉽게 할 수 없을까? ➢ C 소스코드 기반의 eBPF 프로그램 작성 ➢ compiler 를 통해 bytecode 로 변환 ➢ Verifier를 거쳐서 kernel space에 로드 BCC 기반 eBPF 프로그래밍
  43. in-kernel VM eBPF bytecode kernel space user space Verification Load

    Go Library libbpf C/C++ Library eBPF Program c source Clang/LLVM compiler generic eBPF library 를 통해 eBPF 프로그램을 개발하고 관리하는 건 번거롭지만 1 3 2 BCC 기반 eBPF 프로그래밍
  44. in-kernel VM kernel space user space Verification Load eBPF Program

    python 1 BCC framework로 eBPF 프로그램을 개발하면 훨씬 간편하다. BCC (BPF Compiler Collection) BCC 기반 eBPF 프로그래밍
  45. in-kernel VM kernel space user space Verification Load eBPF Program

    python BCC BCC framework로 eBPF 프로그램을 개발하면 훨씬 간편하다. Python 코드로 eBPF 프로그램을 작성하고, BCC 로 실행하면 된다! BCC 기반 eBPF 프로그래밍
  46. in-kernel VM kernel space user space Verification Load eBPF Program

    python BCC BCC framework로 eBPF 프로그램을 개발하면 훨씬 간편하다. Python 코드로 eBPF 프로그램을 작성하고, BCC 로 실행하면 된다! Let’s GO ! BCC 기반 eBPF 프로그래밍
  47. 새로운 디렉토리를 생성할 때마다 eBPF 프로그램이 hello_world 를 출력하도록 만들어보자.

    실습 환경: google cloud - ubuntu 20.04 x86/64 1. install python 2. install BCC framework sudo apt-get update sudo apt-get install bpfcc-tools linux-headers-$(uname -r) ( Ubuntu 20.04 ship with Python 3 pre-installed ) BCC 기반 eBPF 프로그래밍
  48. BCC 는 기본적인 Tracing Tool 들을 제공합니다. 그 중 하나인

    bashreadline 을 통해 BCC 가 정상적으로 설치됐는지 확인해봅시다. 3. verify BCC and eBPF are working sudo /usr/sbin/bashreadline-bpfcc * bashreadline-bpfcc: bashreadline traces the return of the readline() function using uprobes, to show the bash commands that were entered interactively, system wide. BCC 기반 eBPF 프로그래밍
  49. BCC 기반 eBPF 프로그래밍 BCC Tools ▶ ./funccount -p 1442

    /home/ubuntu/contentions:* Tracing 15 functions for "/home/ubuntu/contentions:*"... Hit Ctrl-C to end. ^C FUNC COUNT main 1 _start 1 primes_thread 2 insert_result 87186 is_prime 1252772 특정 패턴에 맞는 function, tracepoints, USDT prob 들의 호출 횟수를 트레이싱한다.
  50. BCC 기반 eBPF 프로그래밍 BCC Tools ▶ ./oomkill Tracing oom_kill_process()...

    Ctrl-C to end. 21:03:39 Triggered by PID 3297 ("ntpd"), OOM kill of PID 22516 ("perl"), 3850642 pages, loadavg: 0.99 0.39 0.30 3/282 22724 21:03:48 Triggered by PID 22517 ("perl"), OOM kill of PID 22517 ("perl"), 3850642 pages, loadavg: 0.99 0.41 0.30 2/282 22932 Linux out-of-memory (OOM) killer 를 트레이싱하여 OOM Kill 발생 시마다 관련 프로세스에 대한 기본 정보들을 보여준다.
  51. BCC 기반 eBPF 프로그래밍 BCC Tools ▶ ./tcpaccept PID COMM

    IP RADDR RPORT LADDR LPORT 907 sshd 4 192.168.56.1 32324 192.168.56.102 22 907 sshd 4 127.0.0.1 39866 127.0.0.1 22 5389 perl 6 1234:ab12:2040:5020:2299:0:5:0 52352 1234:ab12:2040:5020:2299:0:5:0 7001 TCP socket 연결을 허용한 kernel function 들을 추적해 보여준다.
  52. from bcc import BPF from bcc.utils import printb BPF_SOURCE_CODE =

    r""" TRACEPOINT_PROBE(syscalls, sys_enter_mkdir) { bpf_trace_printk("hello world"); return 0; } """ BPF(text=BPF_SOURCE_CODE).trace_print() 새로운 디렉토리를 생성할 때마다 eBPF 프로그램이 hello_world 를 출력하도록 만들어보자. BCC 기반 eBPF 프로그래밍
  53. from bcc import BPF from bcc.utils import printb BPF_SOURCE_CODE =

    r""" TRACEPOINT_PROBE(syscalls, sys_enter_mkdir) { bpf_trace_printk("hello world"); return 0; } """ BPF(text=BPF_SOURCE_CODE).trace_print() TRACEPOINT_PROBE(category, event) cat /sys/kernel/debug/tracing/events/syscalls/sys_enter_mkdir/format 실행될 함수를 등록할 때 kprobe, kretprobe, uprobe, tracepoint, UDST 등의 다양한 도구를 사용한다 새로운 디렉토리를 생성할 때마다 eBPF 프로그램이 hello_world 를 출력하도록 만들어보자. BCC 기반 eBPF 프로그래밍
  54. from bcc import BPF from bcc.utils import printb BPF_SOURCE_CODE =

    r""" TRACEPOINT_PROBE(syscalls, sys_enter_mkdir) { bpf_trace_printk("hello world"); return 0; } """ BPF(text=BPF_SOURCE_CODE).trace_print() 새로운 디렉토리를 생성할 때마다 eBPF 프로그램이 hello_world 를 출력하도록 만들어보자. helper function • BPF 프로그램에서 커널의 정보를 안전하게 가져갈 수 있도록 전용 함수가 제공된다. • 디버깅용 메세지를 출력하거나 BPF Map을 다루거나 시스템 관련 정보를 가져올 수 있다. BCC 기반 eBPF 프로그래밍
  55. BCC 기반 eBPF 프로그래밍 from bcc import BPF from bcc.utils

    import printb BPF_SOURCE_CODE = r""" TRACEPOINT_PROBE(syscalls, sys_enter_mkdir) { bpf_trace_printk("hello world"); return 0; } """ BPF(text=BPF_SOURCE_CODE).trace_print() 새로운 디렉토리를 생성할 때마다 eBPF 프로그램이 hello_world 를 출력하도록 만들어보자. helper function • BPF 프로그램에서 커널의 정보를 안전하게 가져갈 수 있도록 전용 함수가 제공된다. • 디버깅용 메세지를 출력하거나 BPF Map을 다루거나 시스템 관련 정보를 가져올 수 있다.
  56. BCC 기반 eBPF 프로그래밍 from bcc import BPF from bcc.utils

    import printb BPF_SOURCE_CODE = r""" TRACEPOINT_PROBE(syscalls, sys_enter_mkdir) { bpf_trace_printk("hello world"); return 0; } """ BPF(text=BPF_SOURCE_CODE).trace_print() 새로운 디렉토리를 생성할 때마다 eBPF 프로그램이 hello_world 를 출력하도록 만들어보자. helper function • BPF 프로그램에서 커널의 정보를 안전하게 가져갈 수 있도록 전용 함수가 제공된다. • 디버깅용 메세지를 출력하거나 BPF Map을 다루거나 시스템 관련 정보를 가져올 수 있다.
  57. BCC 기반 eBPF 프로그래밍 from bcc import BPF from bcc.utils

    import printb BPF_SOURCE_CODE = r""" TRACEPOINT_PROBE(syscalls, sys_enter_mkdir) { bpf_trace_printk("hello world"); return 0; } """ BPF(text=BPF_SOURCE_CODE).trace_print() 새로운 디렉토리를 생성할 때마다 eBPF 프로그램이 hello_world 를 출력하도록 만들어보자. helper function • BPF 프로그램에서 커널의 정보를 안전하게 가져갈 수 있도록 전용 함수가 제공된다. • 디버깅용 메세지를 출력하거나 BPF Map을 다루거나 시스템 관련 정보를 가져올 수 있다.
  58. from bcc import BPF from bcc.utils import printb BPF_SOURCE_CODE =

    r""" TRACEPOINT_PROBE(syscalls, sys_enter_mkdir) { bpf_trace_printk("hello world"); return 0; } """ BPF(text=BPF_SOURCE_CODE).trace_print() BPF({text=BPF_program | src_file=filename} [, usdt_contexts=[USDT_object, ...]] [, cflags=[arg1, ...]] [, debug=int] ) * USDT({pid=pid | path=path}): Creates an object to instrument User Statically-Defined Tracing (USDT) probes 새로운 디렉토리를 생성할 때마다 eBPF 프로그램이 hello_world 를 출력하도록 만들어보자. BCC 기반 eBPF 프로그래밍
  59. 새로운 디렉토리를 생성할 때마다 eBPF 프로그램이 hello_world 를 출력하도록 만들어보자.

    from bcc import BPF from bcc.utils import printb BPF_SOURCE_CODE = r""" TRACEPOINT_PROBE(syscalls, sys_enter_mkdir) { bpf_trace_printk("hello world"); return 0; } """ BPF(text=BPF_SOURCE_CODE).trace_print() BCC 기반 eBPF 프로그래밍
  60. from bcc import BPF BPF_SOURCE_CODE = r""" int hello_world(void *ctx)

    { bpf_trace_printk("hello world: %s\n"); return 0; } """ bpf = BPF(text=BPF_SOURCE_CODE) mkdir = bpf.get_syscall_fnname("mkdir") bpf.attach_kprobe(event=mkdir, fn_name="hello_world") 지정된 이름 컨벤션에 따르지 않고 함수를 만들어서 kprobe 로 직접 붙여보자 자유롭게 함수명을 짓고 이후 kprobe 로 직접 붙인다 BCC 기반 eBPF 프로그래밍
  61. from bcc import BPF BPF_SOURCE_CODE = r""" int hello_world(void *ctx)

    { bpf_trace_printk("hello world: %s\n"); return 0; } """ bpf = BPF(text=BPF_SOURCE_CODE) mkdir = bpf.get_syscall_fnname("mkdir") bpf.attach_kprobe(event=mkdir, fn_name="hello_world") 지정된 이름 컨벤션에 따르지 않고 함수를 만들어서 kprobe 로 직접 붙여보자 print("%-18s %-16s %-6s %s" % ("TIME(s)", "COMM", "PID", "MESSAGE")) while True: try: (task, pid, cpu, flags, ts, msg) = bpf.trace_fields() except ValueError: continue except KeyboardInterrupt: break print("%-18.9f %-16s %-6d %s" % (ts, task, pid, msg)) 출력 결과 다듬기! BCC 기반 eBPF 프로그래밍
  62. from bcc import BPF BPF_SOURCE_CODE = r""" int hello_world(void *ctx)

    { bpf_trace_printk("hello world: %s\n"); return 0; } """ bpf = BPF(text=BPF_SOURCE_CODE) mkdir = bpf.get_syscall_fnname("mkdir") bpf.attach_kprobe(event=mkdir, fn_name="hello_world") 지정된 이름 컨벤션에 따르지 않고 함수를 만들어서 kprobe 로 직접 붙여보자 print("%-18s %-16s %-6s %s" % ("TIME(s)", "COMM", "PID", "MESSAGE")) while True: try: (task, pid, cpu, flags, ts, msg) = bpf.trace_fields() except ValueError: continue except KeyboardInterrupt: break print("%-18.9f %-16s %-6d %s" % (ts, task, pid, msg)) BCC 기반 eBPF 프로그래밍
  63. • generic eBPF library 를 통해 eBPF bytecode를 가져와 커널에

    로드할 수 있다. ( eBPF Go Library, libbpf C/C++ Library) NOTE BCC 기반 eBPF 프로그래밍
  64. • generic eBPF library 를 통해 eBPF bytecode를 가져와 커널에

    로드할 수 있다. ( eBPF Go Library, libbpf C/C++ Library) • BCC framework 를 이용하면 Python 으로 한번에 eBPF 프로그램을 컴파일하고 커널에 로드할 수 있다. NOTE BCC 기반 eBPF 프로그래밍
  65. • generic eBPF library 를 통해 eBPF bytecode를 가져와 커널에

    로드할 수 있다. ( eBPF Go Library, libbpf C/C++ Library) • BCC framework 를 이용하면 Python 으로 한번에 eBPF 프로그램을 컴파일하고 커널에 로드할 수 있다. • 나는 BCC framework 로 Hello World eBPF 프로그램을 만들 줄 안다. NOTE BCC 기반 eBPF 프로그래밍
  66. eBPF 이점 • 실행이 빠르고 유연하다. (동적으로 커널 내에서 실행)

    • 다양한 hook 지점에 원하는 액션을 쉽게 추가할 수 있다. • 프로그램 실행을 위해 트래픽을 중단하거나 커널을 다시 로드할 필요가 없다. • eBPF map을 통해 kernel space와 user space가 상태나 데이터를 쉽게 공유할 수 있다. BCC 기반 eBPF 프로그래밍
  67. eBPF 이점 • 실행이 빠르고 유연하다. (동적으로 커널 내에서 실행)

    • 다양한 hook 지점에 원하는 액션을 쉽게 추가할 수 있다. • 프로그램 실행을 위해 트래픽을 중단하거나 커널을 다시 로드할 필요가 없다. • eBPF map을 통해 kernel space와 user space가 상태나 데이터를 쉽게 공유할 수 있다. ➡ 일반적으로 개발자가 최적의 성능을 보장하는 방식으로 Linux에서 낮은 수준의 모니터링, 추적 또는 네트워킹 프로그램을 작성할 수 있다. BCC 기반 eBPF 프로그래밍
  68. eBPF 를 기반으로 컨테이너 간 네트워크 연결을 제공하고, 보완 및

    관측하는 소프트웨어 출처 : https://docs.cilium.io/en/v1.12/concepts/overview/ Cilium 이란?
  69. eBPF 를 기반으로 컨테이너 간 네트워크 연결을 제공하고, 보완 및

    관측하는 소프트웨어 출처 : https://docs.cilium.io/en/v1.12/concepts/overview/ Cilium 이란?
  70. eBPF 를 기반으로 컨테이너 간 네트워크 연결을 제공하고, 보완 및

    관측하는 소프트웨어 출처 : https://docs.cilium.io/en/v1.12/concepts/overview/ Cilium 이란?
  71. eBPF 를 기반으로 컨테이너 간 네트워크 연결을 제공하고, 보완 및

    관측하는 소프트웨어 출처 : https://docs.cilium.io/en/v1.12/concepts/overview/ CNI IPAM VXLAN Overlay Network … Cilium 이란?
  72. Cilium 이란? eBPF 를 기반으로 컨테이너 간 네트워크 연결을 제공하고,

    보완 및 관측하는 소프트웨어 Cilium 에서는 eBPF 를 어떻게 활용하고 있을까? 좀 더 구체적으로 직접 알아보자!
  73. • 총 5 개의 node로 구성 : master node 3개,

    worker node 2개 • kube-spray를 통해 클러스터 구축 (기본 설정 유지) • kubernetes v1.25.4 • cilium 1.12.1 Cilium 으로 Kubernetes 클러스터 구축 Cilium 에서 eBPF 의 역할
  74. system call interface sockets TCP UDP Raw Netfilter IPv4 IPv6

    Ethernet Traffic Shaping Network Driver HW bridge OVS BPF socketmap, socketops BPF TC BPF XDP BPF cgroups BPF System calls Linux Network stack 에서 eBPF hook 포인트 Cilium 에서 eBPF 의 역할
  75. eBPF 가 활용되는 Cilium 의 networking object 들을 확인해봅시다. •

    Socket Layer Enforcement • Prefilter (XDP) • Endpoint Policy • Service … Cilium 에서 eBPF 의 역할
  76. eBPF 가 활용되는 Cilium 의 networking object 들을 확인해봅시다. •

    Socket Layer Enforcement • Prefilter (XDP) • Endpoint Policy • Service … : Cilium 의 endpoints 로 들어오는 TCP sockets 들을 모니터링하고 sockmap을 바탕으로 연결을 식별한다. Cilium 에서 eBPF 의 역할
  77. eBPF 가 활용되는 Cilium 의 networking object 들을 확인해봅시다. •

    Socket Layer Enforcement • Prefilter (XDP) • Endpoint Policy • Service … : Cilium 의 endpoints 로 들어오는 TCP sockets 들을 모니터링하고 sockmap을 바탕으로 연결을 식별한다. Cilium 에서 eBPF 의 역할
  78. eBPF 가 활용되는 Cilium 의 networking object 들을 확인해봅시다. •

    Socket Layer Enforcement • Prefilter (XDP) • Endpoint Policy • Service … : XDP BPF 프로그램을 실행하여 매우 빠르게 패킷을 처리할 수 있다. Cilium 에서 eBPF 의 역할
  79. Prefilter (XDP) XDP 는 무엇인가? : BPF 프로그램이 수신된 패킷을

    가장 빠르게 처리할 수 있도록 만들어주는 프레임워크 Cilium 에서 eBPF 의 역할
  80. Prefilter (XDP) XDP 는 무엇인가? : BPF 프로그램이 수신된 패킷을

    가장 빠르게 처리할 수 있도록 만들어주는 프레임워크 ➔ XDP BPF 프로그램은 네트워크 드라이버 초기 단계에 연결 ➔ 패킷이 수신되었을 때 BPF 프로그램 실행을 트리거 Cilium 에서 eBPF 의 역할
  81. eBPF 가 활용되는 Cilium 의 networking object 들을 확인해봅시다. •

    Socket Layer Enforcement • Prefilter (XDP) • Endpoint Policy • Service … : 정의된 정책에 따라 Local Endpoint, Service, L7 rule 등에서 패킷을 드랍하거나 전달한다. Cilium 에서 eBPF 의 역할
  82. Endpoint Policy Cilium 에서 패킷 흐름을 컨트롤하는 주요한 networking object

    로, eBPF Map 에 정의된 policy 나 패킷 정보를 기반으로 패킷을 드롭하거나 전달한다. Cilium 에서 eBPF 의 역할
  83. Endpoint Policy Cilium 에서 패킷 흐름을 컨트롤하는 주요한 networking object

    로, eBPF Map 에 정의된 policy 나 패킷 정보를 기반으로 패킷을 드롭하거나 전달한다. 주입되어 있는 eBPF 프로그램 확인 가능 Cilium 에서 eBPF 의 역할
  84. Endpoint Policy Cilium 에서 패킷 흐름을 컨트롤하는 주요한 networking object

    로, eBPF Map 에 정의된 policy 나 패킷 정보를 기반으로 패킷을 드롭하거나 전달한다. Cilium 에서 eBPF 의 역할
  85. Node test-4 Node test-5 Pod nginx-1 Pod nginx-2 ens4 ens4

    cilium_vxlan cilium_vxlan 각 worker node에 2개의 파드와 서비스 구성하고 nginx-1 에서 nginx-2 로 ping 을 날리면 Cilium 에서 eBPF 의 역할
  86. Node test-4 Node test-5 Pod nginx-1 Pod nginx-2 ens4 ens4

    cilium_vxlan cilium_vxlan bpf program: from-container, to-container bpf program: from-overlay, to-overlay 각 endpoint 에서 동작하는 eBPF 프로그램이 트리거된다. bpf program: from-netdev, to-netdev Cilium 에서 eBPF 의 역할
  87. Node test-4 Node test-5 Pod nginx-1 ens4 ens4 cilium_vxlan cilium_vxlan

    Pod cilium-rgsrh Pod cilium-8k84g Cilium agent 파드에서는 Cilium CLI 로 bpf 맵이나 bpf 프로그램 모니터링이 가능하다. kubectl exec -it -n kube-system cilium-rgsrh -- cilium monitor -vv Pod nginx-2 Cilium 에서 eBPF 의 역할
  88. Pod nginx-2 ens4 cilium_vxlan lxc807da025b1a5@if10 eth0@if11 [health check] kubectl exec

    -it -n kube-system cilium-rgsrh -- cilium monitor -vv Cilium 에서 eBPF 의 역할 Conntrack 생성 탐색 시작
  89. Pod nginx-2 ens4 cilium_vxlan lxc807da025b1a5@if10 eth0@if11 Pod 내부 NIC 에

    eBPF 프로그램 동작 여부 감지 패킷이 전달될 endpoint 로 설정 후 캡슐화 [health check] kubectl exec -it -n kube-system cilium-rgsrh -- cilium monitor -vv Cilium 에서 eBPF 의 역할
  90. Pod nginx-2 ens4 cilium_vxlan lxc807da025b1a5@if10 eth0@if11 overlay 네트워크에서 패킷을 처리하는

    eBPF 프로그램 동작 패킷을 디캡슐화로 풀고, 컨테이너로 전달 [health check] kubectl exec -it -n kube-system cilium-rgsrh -- cilium monitor -vv Cilium 에서 eBPF 의 역할
  91. eBPF 가 활용되는 Cilium 의 networking object 들을 확인해봅시다. •

    Socket Layer Enforcement • Prefilter (XDP) • Network Policy • Service … Cilium 에서 eBPF 의 역할
  92. Service 서비스가 eBPF Map 정보를 바탕으로 수신한 모든 패킷들에 대해

    목적지 IP, Port 가 일치하는지 확인한 후 파드로 전달한다. Cilium 에서 eBPF 의 역할
  93. NIC eth0 XDP TC ingress Connection Tracking mangle PREROUTING nat

    PREROUTING mangle FORWARD filter FORWARD mangle POSTROUTING nat POSTROUTING TC egress eth1 Cilium 를 통해 kube-proxy 없이 Kubernetes 를 설치할 수 있는데.. iptable Cilium 에서 eBPF 의 역할
  94. NIC eth0 XDP TC ingress Connection Tracking mangle PREROUTING nat

    PREROUTING mangle FORWARD filter FORWARD mangle POSTROUTING nat POSTROUTING TC egress eth1 Cilium 를 통해 kube-proxy 없이 Kubernetes 를 설치할 수 있는데.. Cilium + eBPF 프로그램 Cilium 에서 eBPF 의 역할
  95. NIC eth0 XDP TC ingress TC egress eth1 Cilium +

    eBPF 프로그램 Cilium 를 통해 kube-proxy 없이 Kubernetes 를 설치할 수 있는데.. Cilium 에서 eBPF 의 역할
  96. Cilium 에서 eBPF 의 역할 NIC eth0 XDP TC ingress

    TC egress eth1 Cilium + eBPF 프로그램 Cilium 를 통해 kube-proxy 없이 Kubernetes 를 설치할 수 있는데..
  97. • Cilium 에서는 eBPF를 기반으로 컨테이너 간 네트워킹을 제공한다. •

    Cilium 은 Socket, Prefilter, Endpoint Policy, Service 등 다양한 네트워크 오브젝트에 대해서 eBPF 프로그램을 활용한다. NOTE Cilium 에서 eBPF 의 역할
  98. • Cilium 에서는 eBPF를 기반으로 컨테이너 간 네트워킹을 제공한다. •

    Cilium 은 Socket, Prefilter, Endpoint Policy, Service 등 다양한 네트워크 오브젝트에 대해서 eBPF 프로그램을 활용한다. • (kernel 버전에 따라 다르지만) Cilium을 통해 kube-proxy의 역할을 완전히 대체하여 패킷을 처리할 수 있다. NOTE Cilium 에서 eBPF 의 역할