จดๆจาก DevClub#6 eBPF @AWC

สำหรับงานนี้ผมเห็นว่าอยู่ใกล้ๆ เลยวาร์ปจากวงเวียนใหญ่มาแถว BTS ช่องนนทรี ครับ แวะมาฟังเรื่อง eBPF เห็นหลายคนเค้าแชร์กันช่วงนี้ครับ สำหรับสถานที่จัดงาน AWC ตึก Empire ครับ วิวสวย และหรูมากครับ

ก่อนเริ่มงานพี่ปั๊บ มีเกริ่นนำ eBPF มันเกิดจาก Linux มีข้อจำกัด kernel แค่คนที่จะปรับแต่ค่าได้ต้องเทพมากๆ ถ้าต้องปรับเปิด issue ขอไป แต่บางทีรอนานมาก จึงมาเปิด Project eBPF มาช่วยปรับพวกนี้ให้ง่ายและสะดวกขึ้น

Programmatic on Linux Kernel with eBPF

eBPF มัน programming ของ Infrastructure มีภาษาให้เขียน และ Runtime ด้วย แบบพวก JavaScript / Lua แต่มันจะเพื่อคุม Kernel นะ มองเหมือน Framework เราสามารถใส่อะไรลงไป ก่อนที่จะเกิด SystemCall ขึ้นมา

เจ้า eBPF เปิดช่องให้ให้ปรับอะไรใน Linux Kernel เล็กน้อยๆก่อน เพราะถ้ารอ Release จริงๆ มันนานอ เนื่องจากกระบวนการพัฒนา OS ทำกัน 2-3 ปีเลย โดยที่ตัว eBPF มีมาเป็น 10 ปีแล้ว ตั้งแต่ปี 2014 มีผู้ก่อตั้งกลุ่มแรก Meta, Google, Isovalent, Microsoft, Netflix อ๋อ และหลังๆ มี CrowdStrike เข้ามาแจมด้วยนะ

- ความแตกต่างของ eBPF กับ Programing แบบภาษาอื่นๆ
  • eBPF (Specific Purpose) ถ้าพลาดแบบ CrowdStrike มันจะยุ่งกับที่ Kernel เลย มันมีความเสี่ยงต้อง Vertified และมี Guard จะได้ป้องกันเคส เช่น Loop Hell
  • Programing ทำงานๆทั่วๆไป เช่น เอา WebAssembly มาทำงานด้าน AI หรือจะทำเว็บ บราๆ
- Where eBPF used

eBPF ถูกเอาไปใช้งานหลายส่วน อาท เช่น Application / Observability / Network / Security โดยหลายทีมีเอา Adapt หรือ ทำเป็น Product

  • Facebook เอา eBPF มาใช่ทำ L4 Load Balancer Katran
  • ตอนนี้ Cloud 3 เจ้าใหญ่ / Cloud จีน เอาไปใช้เป็นเบื่องหลังนะ พวก Cilium
  • แบบเล็กก็มีใน Android เอาไปใช้นะ system/etc/bpf ตัว netd (network daemon)

Isovalent คนเริ่ม eBPF และมีเอาไปรวมใช้ใน LGTM Stack ด้วยนะ ให้ Observability ง่ายดีด้วยนะ

- Getting Start eBPF

มี Keyword ที่เราต้องรู้ก่อน

  • Userspace ส่วนที่ Appilcation เราทำงานอยู่ แล้วค่อยส่งความต้องการ (SystemCall) ไปยังตัว KernelSpace
  • Kernelspace ส่วนของระบบที่จัดการกับพวก Resource HW ต่างๆ
  • BPF - package filtering
  • eBPF - extend BPF เดิมให้ Programable โดยเวลาที่เขียนคุม ต้องเป็น ภาษา C แบบ restricted มีมาตรฐานคุมชัดเจน จะได้ลดความผิดพลาดได้ และให้ Clang / LLVM Compile ออกมาเป็น ByteCode
  • Tracepoint ตาม SystemCall kernel events เช่น ascheduling or network
  • xdp - package filtering
  • lsm - Linux Security module
  • eBPF Helper พวก Function พื้นฐาน ปกติที่เราเขียน programming printf ใน eBPF จะมีตัว bpf_trace_printk() มาให้ หรือ ตัวอื่นๆ เช่น bpf_perf_event_output()
  • Uprobe - inspect / modify the behavior of the userspace
  • Kprobe - inspect / modify the behavior of the kernel
  • Perf Event - tracking performance ต่าง ๆ ระบบ Kernel / HW
  • eBPF Map เอาผลที่ได้จากตัว eBPF VM ส่งกลับ userspace
- How eBPF work
  1. Source Code - เขียนด้วย restricted C
  2. compile bytecode
  3. eBPF Verified - ตรวจสอบด้วย ว่าไม่ทำให้ HW ตาย เช่น Loop Hell / Pointer
  4. eBPF VM - เอา bytecode มา Run
  5. eBPF map - ส่งผลกลับไป userspace
- ถ้าจะลอง

ส่วนที่เขียน Code ใน Demo คุณโจ้จะใช้ตัว bcc python bcc/docs/reference_guide.md at master · iovisor/bcc · GitHub

เห็น Code ครั้งแรกภาพ เขียน C กำหนดเป็น String ใน Python จากรูปก็ตัวแปร program ฟังมาตอนนี้อารมณ์แบบเราเขียน script groovy เป็น String ให้ java มันเอาไป Run มันจะอารมณ์แบบทำ Jenkin แต่เป้าหมายคนละแบบ eBPF จะไปตัว Kernel นั้นเอง

eBPF ใน KubeCon2024 -> EBPF-Enabled Distributed Tracing ช่วย Track ทำ span ของ Kernel ได้ จะได้ optimize ได้ ได้ยินว่าพวก Cloud จีนเริ่มทำกันแล้ว และตัว Linux สายที่ขอ pull เส้นใหญ่ๆมาจากทางฝั่งจีนแล้วนะ

ส่วนอื่นๆ ดูได้จากใน resource เลย

Resource: Slide

Grafana Beyla

มาฟังเพราะอันนี้แหละ แค่สงสัยว่ามี LGTM แล้ว ตัวนี้มันจะต่างจากเดิมยังไง

  • Traditional Lib Telemetry พวก OpenTelemetry + LGTM แต่ที่ลองจริงๆ อาจจะมี Custom Code เติมด้วย แบบพวก Tracing / Log
  • Grafana Beyla เอา eBPF มาช่วย ตรงนี้จะช่วยลดการเขียน Code ลงไปได้ มันจะลด Effort ในส่วนนี้เอา eBPF ไปส่องจาก Linux Kernel เอามาช่วยทำ Auto Instrumentation (Log / Trace / Metric) และเอาใส่ LGTM เหมือนเดิม

Grafana Beyla Deployment Type

  • K8S - DaemonSet จับทุก process เลย แต่จะกิน resource มาก ถ้ามีข้อมูล หรือ Event เยอะๆ
  • K8S - Sidecar จับบาง Process

บน K8S ต้อง service account + cluster role เพื่อให้มันอ่าน metadata ของ k8s ได้มันดูตั้งแต่ namespace port service pod … แต่ต้องเลือกมันเยอะ พวกการ Config ดูจาก Resource ได้เลย

  • Container ไปรันพวก Docker / Podman
  • ลงเพียว

beyla มีให้ metric ให้ได้เลยนะ พวก rate error ของ http / gRPC ง่ายดี แต่มีจุดที่ท้าทาย เรื่อง Doc และการ Custom ทำได้ยากของมาใหม่ ถ้าลองบน K8S อาจจะมีปัญหาดูข้อมูลข้าม Cluster อยู่

beyla มันแก้ปัญหาจุกจิก เราจะได้รู้ว่าจริงๆ ความล่าช้า ประเด็นมันเกิดจากตัว App / Infra หรือ Network เอาข้อมูลมา Visualize ได้เลบ

Pattern การ Deploy Grafana Beyla จะเอามาใช้คู่กับ Grafana Alloy คล้ายกับตัว Otel Collect เอามา Filter ทำ Data Pipeline ก่อนส่ง เข้า LGTM ต่อ

ถ้าลองมี Sample เป็น docker-compose ด้วย รับลอง Simulate ด้วย K6

ถ้าอยากรู้เต็มๆลองไปใน Blog ของ Speaker ได้เลยครับ / Slide

Cilium: eBPF-based Networking, Security, and Observability

Cilium เป็น OpenSource ที่ทำให้เห็นความเจ๋งของ eBPF ตอนนี้เป็น network plugin (CNI) ของ Kube ด้วยนะ เมื่อก่อน Fluentd / Calico ตอนนี้เป็น Open Source ที่เติบโตไวเป็นอันดับต้นๆ รองจาก K8S / OpenTelemetry ตัวมีนเองทำงานได้หลายได้ เช่น

  • Networking
    - Cluster Mesh / L4 Loaf Balancer / Egress Gateway / Gateway API (อนาคตน่าจะมาแทน ingress) / Service Mesh เป็นต้น
    - ทำ QOS ได้ ใช้ตัว kubernetes.io/ingress-bandwidth: "50M"
    - TCP BRR - Protocol Google พัฒนาขึ้น เพื่อเพิ่มประสิทธิภาพการใช้งาน Network ถ้าต้องการเปิดใช้ตามรูปเลยครับ
  • Observability - ใช้คู่กับ Hubble เพื่อส่งออก Metric
  • Security - เช่น IPSEC Encrpytion ทำ Tunnel ระหว่าง pod ใน cluster / ระหว่าง cluster
- Why is Matter

มันใช้ eBPF ไง จากภาพเห็นแนวทางจากอดีต มาตอนนี้ จากเดิมพวก Network มันต้องวิ่งไปถาม IPTable ถ้ามี Service เยอะๆมาจะช้าลง (เยอะระดับแบบหลักพัน / หมื่นขึ้นไป) มันจะช่วย latency ได้ เร็วขึ้นโดยไม่ได้ปรับ App

จนตอนนี้เจ้าอื่นๆอย่าง Istio มี Ambient mode ข้างหลังมันใช้ eBPF นี่แหละ

- Sample Use-Case (Demo)
  • Cluster Mesh - เชื่อมต่อ Kube หลาย clusters เข้าด้วยกัน ทำให้เข้าถึง service ข้าม cluster ได้ เช่น service ใน cluster A ให้ pod ใน cluster B เรียกใช้งานได้ บน Cloud รวม Cluster ในหลาย AZ เข้าด้วยกัน
  • แก้ปัญหา Partially Microservice Failure ทีนี้ดีกับฝั่ง App ไม่ต้องแก้ endpoint ใหม่ โดยเรากำหนด Affinity ให้เชื่อ Cluster หลักก่อนได้ หรือ จะกระจาย Traffic ไปให้ แต่ละ Cluster ใน AZ อย่างละเท่าไหร่เป็นต้น

Resource: Slide + VDO Demo

Kubernetes Security with eBPF

Game Changer ในช่วง 2-3 ปีนี้ OpenTelemetry และ eBPF

- Kubernetes is just Linux
อ่านเต็มๆได้ใน Blog ของ Speaker ครับ
-Security Practice for Kubernetes

ภาพนี้ครบและ มี Check List ให้ให้ตรวจของทุก Layer และ ของผมถ้า Sofware House จะดูส่วน Appcation Container + Observability 

-Security validation tools in Kubernetes
-Apply Using eBPF to Secure Linux & Kubernetes

ผมทำเป็น 2 Column แทนจะ ตัว Linux Base และตัว Kubernetes มา Addons อีกที

Linux  
-Visibility and monitoring
-Network Security
-Container Security จัดการพวก Cgroup 
-Intrusion Detection & Prevention
-Policy enforcement
-Incident response & forensics
Kubernetes  
-Network Policy Enforcement
-Security Observability
-Runtime Security Monitoring
-Intrusion Detection Systems (IDP)
-Cgroup & Namespace Isolation 
-Service Mesh

และแน่นอน เราไม่ได้ไปติดตั้งลงทุก Cluster ทุก Pod เองแน่ๆ มันมี Agent มาช่วย โดยมี Tools ที่เด่นๆ

นอกจากด้าน Security eBPF ยังเอาไปใช้ใน Tools อื่น เช่น bpftrace / hubble เป็นต้น นอกจากนี้ตัว eBPF ยังเป็นเบื้องหลังที่ช่วย Cloudfare ด้วยในการ Detect DDos ครั้งใหญ่ครับ

อันนี้เป็นอีกอันที่ชอบ eBPF เราใช้มัน แต่มันยาก ผมว่ายากเหมือนกันนะ และมุมผม ยังไม่เห็นภาพเท่าไหร่ เพราะเราเองก็เป็น Dev ด้วย มันต้องเข้าใจกระบวนการของ OS ด้วย แต่ของผมมีคำถามเหมือนกันนะ ว่าจุดไหนที่เราควรใช้ เพราะกลัวว่าเดี๋ยว eBPF กลายเป็นค้อนเอาไปจัดการทุกปัญหา

resource: slide

Update 2024-08-31: Speaker มี Key takeaways : Kubernetes Security with eBPF สรุปครับ

Resource ทั้งหมด: GitHub - jumpbox-academy/learn-ebpf: Learning eBPF Event 2024

Reference


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.