Slide 1

Slide 1 text

eBPF-based Container Networking on Linux John Lin Site Reliability Engineer, LINE Taiwan @ COSCUP 2022

Slide 2

Slide 2 text

Slides Download h"ps:/ /'nyurl.com/ebpf-linux COSCUP 2022 2

Slide 3

Slide 3 text

Agenda • Looking Back on SDN & CNI • So2ware-defined Networking & Container Network Interface • Introduc

Slide 4

Slide 4 text

SDN & CNI • Linux Kernel Networking • Netfilter, Rou-ng, Traffic Control (TC) • Kernel Modules of Networking • Open vSwitch (OvS) • Kernel-Bypass Networking • DPDK • Early Point of Kernel Networking (XDP) • XDP with eBPF COSCUP 2022 4

Slide 5

Slide 5 text

CNI Fundamental Requirements • Kubernetes 對任何網路實現都提出了以下基本要求 (i.e., 任何 CNI Plugin 實作必須⽀援) • Reachability - Pod 可以在沒有 NAT 的情況下與任何其他節點 (Node) 上的其他 Pod 直接通訊 • Connec.vity - 節點 (Node) 上的程式 (e.g., system daemons, kubelet) 可以與該節點上的所有 Pod 通訊 • 次要⽀援⽬標 • IP 地址管理 (IPAM) • 來源地址轉換 (SNAT) • 端⼝映射 (Port mappings) • 頻寬管理 (QoS) COSCUP 2022 5

Slide 6

Slide 6 text

The Networking Subsystem Overview COSCUP 2022 6

Slide 7

Slide 7 text

Linux Kernel Networking COSCUP 2022 7

Slide 8

Slide 8 text

Linux Kernel Networking • 典型CNI⽤例: Flannel, Calico • 常⾒操縱 datapath 作法 (透過 Kernel Networking Tools) • ip-netns: 容器網路管理 • iptables (netfilter): 做 SNAT/ipMasq1, DNAT • iproute2: 配置路由表 Linux bridge 創建及 Default gateway 2設定,及串接 netns 3管理 • ARP 代理,創建 IPIP/VXLAN tunnel 3 plugins/plugins/main/bridge/bridge.go#L336 2 plugins/plugins/main/bridge/bridge.go#L388 1 plugins/pkg/ip/ipmasq_linux.go#L24-L26 COSCUP 2022 8

Slide 9

Slide 9 text

Linux Kernel Networking • Pros: • 開箱即⽤ • 簡單易⽤,定位排查問題相對容易 (tcpdump) • Cons: • 慢 • 受限於 Kernel network stack 所提供之 功能,進階 datapath 操縱不容易達成 COSCUP 2022 9

Slide 10

Slide 10 text

Kernel Modules for Networking COSCUP 2022 10

Slide 11

Slide 11 text

Kernel Modules for Networking • 典型 CNI ⽤例: OVN-Kubernetes, Kube-OVN, WeaveNet • ⼜稱 Open vSwitch datapath 其依賴 openvswitch.ko; 根據其特性⼜分為 ovs-kernel, ovs-dpdk • 須⾃⾏編譯 Kernel module 後掛載,⽬前⼤多數 Linux 發⾏版已 內建(Kernel 4.6+),但仍可以找最新的穩定版本編譯替換 • 常⾒操縱 datapath 作法 • OFPP_NORMAL 維持交換器傳統的 L2/L3 功能做轉發 • 使⽤ OVN 或⾃⾏開發 SDN controller 透過 OpenFlow Protocol 下發 flows 進 Open vSwitch • OVN 作為 SDN Controller 提供非常豐富進階網路路由功能 • Distributed virtual routers, logical switches, Network ACLs, DHCP, DNS Server COSCUP 2022 11

Slide 12

Slide 12 text

Kernel Modules for Networking 以 Open vSwitch 為例 • Pros: • ⽤⼾可透過程式化(Programmable)的控制器 (Controller),與 vSwitch 交互完全⾃訂義路由 • Cons: • Kernel modules 需另外編譯,安全性需要注意 • 對於更進階的 datapath 操作需修改 Kernel modules 開發難度⾼ • 對比於 Kernel networking ⽅式 forwarding/rou@ng 彈性許多 COSCUP 2022 12

Slide 13

Slide 13 text

Kernel-Bypass Networking COSCUP 2022 13

Slide 14

Slide 14 text

Kernel-Bypass Networking • 典型 CNI ⽤例: userspace-cni-network-plugin • User-space networking, datapath 常⾒依賴 DPDK • 對應 Kernel networking 的另⼀種在 User-space 網路選項 • DPDK 技術可以讓進到主機的封包,直接跳過 Linux Kernel, 送到 User-space 的 App. 做處理 (i.e., 是⼀種有效地將封包送入⽤⼾空間的機制) • Bypass Kernel 所以將失去以下功能必須重新實作 • Linux 原⽣網路設定 (iproute2, ifconfig)、debuging, troubleshooGng ⼯具 (tcpdump) • Packet processing, Packet handling: ARP, bridging • IP Stack (TCP/IP, rouGng, filGng) COSCUP 2022 14

Slide 15

Slide 15 text

Kernel-Bypass Networking 常⾒操縱 datapath 作法: 相較於純 DPDK 更常⾒的作法是搭配 Open vSwitch(ovs-dpdk) 或 VPP(vpp-dpdk) ⼀起使⽤,兩 種都是可以在 User-space 做 forwarding/rou>ng 的⼯ 具 • ovs-dpdk: 讓 SDN Controller/OVN 決定封包轉發/ 處理的邏輯 • vpp-dpdk: VPP 4提供 packets processing, switch/ router 等功能 4 Vector Packet Processing COSCUP 2022 15

Slide 16

Slide 16 text

Kernel-Bypass Networking 以 DPDK 為例 • Pros: • 性能:快 System Call, Context switch (user to kernel), copy data from (user to kernel/kernel to user) 等花費更低 • 價值:彈性⾼ packet processing, packet handling, protocol ⽀援豐富 • Cons: • 開發困難:僅提供網路 Dataplan 開發⼯具,對使⽤者要求具 備備專業網路及硬體知識 • 部署複雜:獨佔設備的特性,硬體及軟體部署難度⾼ • 獨佔裝置:需搭配特定的硬體網卡及驅動程式 COSCUP 2022 16

Slide 17

Slide 17 text

Early Point of Kernel Networking (XDP) COSCUP 2022 17

Slide 18

Slide 18 text

Early Point of Kernel Networking (XDP) • 典型 CNI ⽤例: Cilium, Calico eBPF Dataplane • 透過 eBPF 技術,提早對進去 networking stack 前的封包做 處理,也可以對 Kernel 動態注入影響原來 Kernel networking 所提供的功能 • 常⾒操縱 datapath 作法 (注入點) • XDP (eXpress Data Path): DSR (Direct Server Return), SNAT, DNAT • tc ingress/egress hook: DSR, SNAT, DNAT • cgroup socket hook: ACLs • socket map: Socket redirects, SOCKMAP • socket opKon hook: Socket level LB, DNAT COSCUP 2022 18

Slide 19

Slide 19 text

Early Point of Kernel Networking (XDP) • 典型 CNI ⽤例: Cilium, Calico eBPF Dataplane • 透過 eBPF 技術,提早對進去 networking stack 前的封包做 處理,也可以對 Kernel 動態注入影響原來 Kernel networking 所提供的功能 • 常⾒操縱 datapath 作法 (注入點) • XDP (eXpress Data Path): DSR (Direct Server Return), SNAT, DNAT • tc ingress/egress hook: DSR, SNAT, DNAT • cgroup socket hook: ACLs • socket map: Socket redirects, SOCKMAP • socket opKon hook: Socket level LB, DNAT COSCUP 2022 19

Slide 20

Slide 20 text

Early Point of Kernel Networking (XDP) • XDP (eXpress Data Path) 的特型 • 是被設計為⾼性能、可程式化 (Programmability) • 不是 Kernel bypass、不是⽤來取代 TCP/IP stack、 某些條件下不需要專⽤硬體 • XDP Ac?ons • XDP_ABORTED • XDP_DROP • XDP_PASS • XDP_TX • XDP_REDIRECT COSCUP 2022 20

Slide 21

Slide 21 text

Early Point of Kernel Networking (XDP) • Pros: • Kernel 安全性⾼:由 eBPF verifier 做確保 • 開發難度較低:相較於 Kernel modules, Kernel bypass 開發難度低 • Datapath 保有適當的彈性,透過載入 BPF 變 更 • Cons: • 只能通過 BPF Helper 函數呼叫,不能引⽤所 有 Kernel 函數 COSCUP 2022 21

Slide 22

Slide 22 text

Recap • Linux Kernel Networking • Kernel Modules of Networking • Kernel-Bypass Networking • Early Point of Kernel Networking (XDP) COSCUP 2022 22

Slide 23

Slide 23 text

Quotes If the tradi+onal kernel network stack is a freeway, kernel bypass is a proposal to build an infrastructure of high speed trains and XDP is a proposal for adding carpool lanes to the freeway. — Tom Herbert, Alexei Starovoitov5 5 eXpress Data Path (XDP) COSCUP 2022 23

Slide 24

Slide 24 text

Introduc)on to eBPF • eBPF 技術涵蓋4⼤範疇 • 安全功能 • 網路功能 • 追蹤 (Tracing)、性能分析 (Profiling) • 可觀測性 (Observability)、監控 (Monitoring) • Linux Kernel ⼀直都是實現監控、可觀測性、網路、安全功能最理想的地⽅ • 不過很多情況下並非容易的事,因為這些⼯作需要修改 Kernel 源碼或加載 Kernel modules • eBPF 技術提供⼀個機會讓 Kernel 可以透過動態注入⽤⼾的程式 (eBPF program) 改變原⽣ Kernel 的⾏ 為 COSCUP 2022 24

Slide 25

Slide 25 text

Classical BPF (cBPF) • Berkeley Packet Filter6 • 特殊⽬的 virtual machine. ⽀援應⽤快速地 從 stream 過濾封包 • network tap: 從網路設備驅動程式收集封 包的副本 • packet filter: 過濾器決定是否應該接受⼀ 個封包 • 廣泛使⽤在 tcpdump 6 The BSD Packet Filter: A New Architecture for User-level Packet Capture, 1992 COSCUP 2022 25

Slide 26

Slide 26 text

Extended BPF (eBPF) • 原始 BPF 被稱為 classical BPF,隨著 eBPF 推出已被 棄⽤ • 2014/09, 第⼀個 eBPF 補丁集合合併到 Kernel 3.18 7 • 將 eBPF 的解釋器 (interpreter) 從 networking subsystem 拆出來 • BPF Maps: ⽤於在 Kernel 和 user-space 之間共享 數據的通⽤儲存 (generic store); 有29種 types • user-space 透過 syscall 和 eBPF 程式可以同時 存取 BPF Maps 7 BPF syscall, maps, verifier, samples, 2014/06; The BPF system call API, version 14, 2014/09 COSCUP 2022 26

Slide 27

Slide 27 text

eBPF Load and Verify8 1. Compile: eBPF 相比於 cBPF 最有⽤的演變之⼀是基於 clang 和 LLVM 提供的編譯後端,能從 C 源碼編譯成 eBPF bytecode • clang 和 LLVM 為 eBPF 開發⽣態不可或缺的⼯具 2. Load: 透過 Loader 使⽤ syscall, bpf() 將 bytecode 載入 Kernel 3. Verify: Kernel 使⽤ Verify 保證執⾏的 bytecode 安全 性、避免 Kernel 發⽣錯誤 4. 等待觸發執⾏: 在 Kernel 對應的事件(Event)觸發時,執 ⾏該 eBPF bytecode,並且可以通過 BPF Map 與 User- space 程式交互 8 Kernel v3.18, kernel/bpf/syscall.c COSCUP 2022 27

Slide 28

Slide 28 text

eBPF Development 典型的開發及載入 BPF 流程 1. 使⽤ C 開發 BPF 程式,並使⽤ LLVM 編譯成 ELF bytecode 2. User-space 透過 BPF ELF Loader (e.g., iproute2) 解析 ELF 後,通過 bpf(), syscall 將解析後的 BPF Program 注入 Kernel 3. Verifier 驗證 BPF 指令,然後對其進⾏即時編 譯(JIT),返回程式的⼀個 file descriptor 4. 利⽤ file descriptor aHach 到 Kernel networking subsystem 開發⼯具選擇 • C: libbpf/libbpf; Lives in the kernel repo • Python: iovisor/bcc; Focused on tracing and profiling; Heavy run>me • Go: iovisor/gobpf; Go bindings for the bcc framework; uses CGo • Go: cilium/ebpf; Pure Go eBPF Library; maintained by Cloudflare and Cilium • Go: dropbox/goebpf; Support less eBPF features; Simple and easy to use COSCUP 2022 28

Slide 29

Slide 29 text

eBPF Development XDP/BPF program xdp_drop.c #include #include SEC("xdp_drop") int xdp_drop(struct xdp_md *ctx) { return XDP_DROP; } char __license[] SEC("license") = "GPL"; # Compile clang -target bpf -Wall -O2 -c xdp_drop.c -o xdp_drop.o # Attach xdp/bpf program ip link set dev eth0 xdp obj xdp_drop.o # Detach xdp/bpf program ip link set dev eth0 xdp off COSCUP 2022 29

Slide 30

Slide 30 text

eBPF Program Types • Program Types Introduc4on • Socket Filter Programs • XDP Programs • Traffic Classifer (tc) Programs • Cgroup Socket Programs • Socket Op4on Programs • Socket Map Programs COSCUP 2022 30

Slide 31

Slide 31 text

eBPF Program Types Intro. • 截⾄ Kernel 5.10 約有31種 BPF Program Types • 對於所有 BPF Program Types9 有2⼤分類 • Tracing • Networking • 本次分享將會著重在 Networking 領域 9 Kernel 5.10; linux/include/uapi/linux/bpf.h#L170 COSCUP 2022 31

Slide 32

Slide 32 text

Socket Filter Intro. • Socket Filter Programs; BPF_PROG_TYPE_SOCKET_FILTER • 最早出現在 Kernel 裡⾯的 BPF program type • Socket Filter 不允許修改封包內容, 亦不允許變更封包地址,僅作可觀測性 (Observability) ⽤途 • 使⽤場景 • 流量過濾及複製(對原始流量只讀) • 可觀測性:流量統計 COSCUP 2022 32

Slide 33

Slide 33 text

Bo#om half of the Network Stack • Networking Subsystem 下半部分 • XDP/BPF hooks • tc/BPF hooks COSCUP 2022 33

Slide 34

Slide 34 text

XDP/BPF Intro. • XDP Programs; BPF_PROG_TYPE_XDP • Na.ve XDP (Driver): 預設原⽣模式 • Offload XDP (Hardware): BPF program offload 在網卡上 • Generic XDP (Network Stack): 4.12+, virtual interface, 通⽤模式(即使驅動不⽀援仍可使⽤) • 使⽤場景: 流量清洗、DDoS防禦10、緩解11、 L4負載均衡12 12 Facebook L4 LB: Katran 11 Cloudflare: L4Drop: XDP DDoS Mi6ga6ons 10 Cloudflare: How to drop 10 million packets per second COSCUP 2022 34

Slide 35

Slide 35 text

XDP/BPF Example Program xdp_pass.c #include #include SEC("xdp") int xdp_dummy_prog(struct xdp_md *ctx) { return XDP_PASS; } char _license[] SEC("license") = "GPL"; # Compile clang -target bpf -Wall -O2 -c xdp_pass.c -o xdp_pass.o # Attach xdp/bpf program ip link set dev eth0 xdp obj xdp_pass.o # Detach xdp/bpf program ip link set dev eth0 xdp off COSCUP 2022 35

Slide 36

Slide 36 text

tc/BPF Intro. • tc: qdisc(排隊規則), class(類別), filter(過濾器) • 傳統 filter + ac/on 模式的限制: 匹配+執⾏動作 • Traffic Classifier Programs; BPF_PROG_TYPE_SCHED_CLS • Kernel 4.1 tc 指令⽀援 eBPF,可以直接將 BPF 程式作 為 tc classifier (filter) • Kernel 4.4 iproute2 引入 direct-action,classifier 的返回將直接視為 ac/on 的返回 • Kernel 4.5 添加了⼀個新的 qdisc Class clsact • clsact 能夠以 direct-action 模式 aEach eBPF 程式 • clsact 可以在 ingress/egress 上以 direct- action 模式 aEach eBPF 程式 COSCUP 2022 36

Slide 37

Slide 37 text

tc/BPF Example Program tc_process.c #include #include #include #include int classifier(struct __sk_buff *skb) { void *data_end = (void *)(unsigned long long)skb->data_end; void *data = (void *)(unsigned long long)skb->data; struct ethhdr *eth = data; if (data + sizeof(struct ethhdr) > data_end) return TC_ACT_SHOT; if (eth->h_proto == ___constant_swab16(ETH_P_IP)) // Packet processing is not implemented in this sample. return process_packet(skb); else return TC_ACT_OK; } # Create a qdisc class clsact tc qdisc add dev eth0 clsact # Attach tc/bpf program tc filter add dev eth0 ingress bpf direct-action obj tc_process.o # Detach tc/bpf program tc qdisc del dev eth0 clsact COSCUP 2022 37

Slide 38

Slide 38 text

Difference between tc/BPF & XDP/BPF • XDP/BPF hook 為最早期觸發點(創建skb 之前),性能最⾼ • tc/BPF 擁有更好的封包修改能⼒ (input context: sk_buff vs. xdp_buff) • XDP/BPF hook 觸發點只可以在 ingress, tc/BPF hook 觸發點可以在 ingress 及 egress • XDP/BPF 依賴驅動⽀援 tc/BPF 則不依賴 COSCUP 2022 38

Slide 39

Slide 39 text

tc/BPF & XDP/BPF for Container Networking • tc, XDP BPF datapath 常⾒⽤於操作南北向流量(N-S Traffic)在 Cluster Network 上 Service Type: NodePort, ExternalIPs, LoadBalancer • Cilium 1.6 的 kube-proxy 取代 • tc/BPF 實現 SNAT, DNAT 取代 kube-proxy (iptables) Service Type: NodePort • Cilium 1.7 的 Direct Server Return (DSR) • tc/BPF 實現 DSR • 直接回覆外部 Client 不需要額外跳轉 • 保留 Client Source IP • Cilium 1.8 kube-proxy 的取代在 XDP 層實現其包含 DSR, SNAT 功能 • 以 XDP 實現網路性能更⾼ COSCUP 2022 39

Slide 40

Slide 40 text

Top half of the Network Stack • Networking Subsystem 上半部分 • cgroup socket hooks • socket op6on hooks • socket map COSCUP 2022 40

Slide 41

Slide 41 text

Cgroup Socket Intro. • Cgroup Programs; BPF_PROG_TYPE_CGROUP_SKB • 任何封包要從 Kernel 傳遞進去任何⾏程(Process)在相同的 cgroup 會經過這個 filter (i.e., ⽤ cgroup 控制進去 procress 的網路流量) • 與 Socket Filter ⼗分類似但主要差別在 • cgroup 的級別上放⾏或丟棄封包(return 1 for allow, else for DROP) • cgroup 可以控制所有在相同 cgroup 裡的全部⾏程 (Processes) • 使⽤場景 • 可以被加載到 IP/TCP/UDP 的 ingress/egress 處理邏輯上,作為網路安全策略 (Network Policy) 的實現 COSCUP 2022 41

Slide 42

Slide 42 text

Cgroup Socket Program cgroup_socket_blocked.c #include #include #include // Ingress hook - handle incoming packets SEC("cgroup_skb/ingress") int ingress(struct __sk_buff *skb) { return 0; } // Egress hook - handle outgoing packets SEC("cgroup_skb/egress") int egress(struct __sk_buff *skb) { return 0; } char __license[] __section("license") = "GPL"; COSCUP 2022 42

Slide 43

Slide 43 text

Socket Op*on Intro. • Socket Op+on Programs; BPF_PROG_TYPE_SOCK_OPS; SOCK_OPS • Hook 位置在多個地⽅ BPF_SOCK_OPS_*13 • 使⽤場景 • 動態跟蹤監聽 Socket 事件 • 動態修改 socket connec+on op+ons, e.g., tcp connec+on establishment, retransmit, +meout • 在 socket 事件發⽣,變更⽬的地 IP 或 Port 實現, e.g., LB, 透明代理(Cilium Kubernetes Service) • Socket Level LB: Socket redirec+on (需搭配 BPF_PROG_TYPE_SK_SKB) 13 include/uapi/linux/bpf.h COSCUP 2022 43

Slide 44

Slide 44 text

Socket Map Intro. • Socket Map Programs; BPF_PROG_TYPE_SK_SKB • 可以存取 socket maps(SOCKMAP)14 及做 socket redirects • 使⽤場景: Socket Level LB: Socket redirec9on; 1. 創建 socket map (⼀種 BPF Map 的類型); 2. BPF_PROG_TYPE_SOCK_OPS: 攔截所有 socket 事 件,然後從 struct bpf_sock_ops 中讀取 socket 訊息存到 sockmap; 3. BPF_PROG_TYPE_SK_SKB: 攔截 sendmsg() 的 syscall,然後從 sockmap 查詢對端 socket 訊息, 最後透過 bpf_sk_redirect_map() 做重定向 14 SOCKMAP - TCP splicing of the future COSCUP 2022 44

Slide 45

Slide 45 text

Cgroup Socket & Socket Op/on, Map/BPF for Container Networking • Cgroup Socket, Socket Op0on, Socket Map 常⾒⽤於操作東⻄向流量(E-W Traffic)在 Cluster Network 上; Service Type: ClusterIP • Cilium ⼤量使⽤ eBPF 做 Datapath 操縱的代表性 CNI • Cilium 1.6 的 kube-proxy 取代 • Socket Op0on, Map/BPF 實現 DNAT 取代 kube-proxy (iptables) Service Type: ClusterIP • 透明代理 • ⾼性能 Socket 層負載均衡 (traffic 沒經過 netfilter 逕⾏重定向) • Cilium BPF datapath 的核⼼設計理念 • 對於東⻄向流量(E-W Traffic),儘量靠近 Socket 層處理 • 對於南北向流量(N-S Traffic),儘量靠近網卡驅動層處理 COSCUP 2022 45

Slide 46

Slide 46 text

Summary & Future Scope • eBPF 會是接下來在 Kubernetes Networking 上的 game changer • Cilium 為⽬前最出⾊的 eBPF CNI 專案 • Egress Gateway (Cilium 1.12 stable release) • Integrated Ingress Controller (Cilium 1.12) • Envoy 作為 edge proxy 能感知 L7 協定亦能做 L4LB 並具有可觀測性、熔斷、⾃動重試、限流等 功能 • Cilium Service Mesh • Sidecarless model, eBPF acceleraMon & Per-Node Proxy • Reduce Total Cost of Service Mesh & Envoy mulM-tenancy problems COSCUP 2022 46

Slide 47

Slide 47 text

We're Hiring Site Reliability Engineers Taipei | LINE Taiwan | Engineering System | Remote | Full-;me h=ps:/ /careers.linecorp.com/jobs/1330 COSCUP 2022 47

Slide 48

Slide 48 text

Thank You Follow me on Twi+er: @johnlin__ Slides Download: h/ps:/ /2nyurl.com/ebpf-linux COSCUP 2022