Skip to content

Leveraging eBPF in the Kubernetes Networking Model

Published: at 04:10 PM

eBPF là một Extension mới của Linux Kernel cho phép chạy các Programs trong một môi trường với đặc quyền tương tác với các functions của Linux Kernel. Nó giúp mở rộng các feature của Linux Kernel mà không cần “Monkey Patching” hay cài đặt thêm Module từ bên thứ ba.

eBPF được tích hợp sâu vào Network StackKernel Level, nên nó được ứng dụng nhiều trong các Network Application. Điều này bao gồm cả Kubernetes Networking thông qua các extension như Cilium - một giải pháp Kubernetes Networking CNI dựa trên eBPF.

Ở bài viết này, ta sẽ so sánh cách triển khai Kubernetes Networking truyền thống với việc sử dụng iptables và cách triển khai mới với eBPF.

Table of contents

Open Table of contents

The Kubernetes Networking Model using iptables (Mô hình Kubernetes Networking dùng iptables)

Mô hình Kubernetes Networking truyền thống hoạt động dựa trên kube-proxyiptables. Khi Cluster đang hoạt động, kube-proxy trên mỗi Node sẽ theo dõi các events tạo Pod và ghi các Rules vào iptables. Những Rules này sẽ điều hướng traffic đến đúng PodContainer. Bạn có thể xem các Rules này bằng command:

iptables -t nat -nvL

Ví dụ, command sau hiển thị Rules trong iptables cho kube-dns:

$ iptables -t nat -nvL

Chain KUBE-SVC-FXR4M2CWOGAZGGYD (1 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 KUBE-SEP-M6FB4YQ7BMUNVVRR  all  --  *      *       0.0.0.0/0 0.0.0.0/0            /* kube-system/kube-dns-upstream:dns */ statistic mode random probability 0.33333333349 ```

Thực tế, cách tạo và xử lý các Rules trong iptables khá phức tạp, nhưng kết quả cuối cùng vẫn là: với mỗi Service được triển khai trong Kubernetes, sẽ có các quy tắc iptables tương ứng để định tuyến traffic đến đúng PodContainer.

iptables được hỗ trợ rộng rãi và là cách hoạt động mặc định truyền thống của Kubernetes Cluster. Tuy nhiên, nó gặp một số vấn đề:

Tóm lại, trong trường hợp Heavy Traffic hoặc hệ thống có nhiều thay đổi, Performance sẽ bị giảm và trở nên không ổn định khi dùng iptables. Về cơ bản, việc đánh giá Rules một cách tuần tự và việc update tất cả Rules trong một transaction dẫn đến Performance kém ở quy mô lớn. Ví dụ, Huawei phát hiện rằng việc thay thế toàn bộ danh sách Rules iptables cho Cluster20,000 Services có thể mất đến 5 giờ đồng hồ!

The Kubernetes Networking Model using eBPF (Mô hình Kubernetes Networking dùng eBPF)

eBPF (extended Berkeley Packet Filter) là công nghệ xuất phát từ Linux Kernel, có thể chạy các Sandbox Application một cách chính thống trong nhân Kernel. Nó được dùng để mở rộng hiệu quả khả năng của nhân Kernel mà không cần thay đổi mã nguồn Kernel hay sử dụng các module từ nhân.

eBPF được tích hợp trong Kernel tại các Hook Point được định nghĩa từ trước. Khi Kernel hoặc Application đi qua một Hook Point, như System Call hoặc Network Event, bất kỳ Programs eBPF nào được registed sẽ được excution. Nhờ sự tích hợp sâu với Kernel, eBPF rất phù hợp để thay thế iptables trong mạng Kubernetes.

eBPF Hooks in Linux Kernel
eBPF Hooks trong Linux Kernel

Cả CiliumCalico đều triển khai mô hình Kubernete Networking bằng eBPF. Local Agent được install trên mỗi Node sẽ đưa ra các actions với các Event Scheduling của Pod bằng cách intergration với các Hook của eBPF trong Kernel. Kết quả là eBPF thay thế các quy tắc iptables dài dòng và tuần tự khi định tuyến lưu lượng traffic đến Pod bằng cách tiếp cận các phương thức hiệu quả hơn.

eBPF Hooks in Linux Kernel
eBPF thay thế iptables trong mạng Kubernetes

Các bài Performance Test về throughput, CPU usageLatency cho thấy eBPF scales tốt ngay cả với 1 triệu Rules. iptables không scale tốt và ngay cả với số lượng Rules thấp như 1k hoặc 10k cho thấy việc Performance giữa 2 phương pháp có sự khác biệt rất lớn.

Conclusion (Kết Luận)

eBPF đã phát triển với tốc độ chóng mặt trong những năm gần đây, mở khóa những khó khăn mà ta gặp phải khi tương tác với các funtions trong Kernel. Điều này được thực hiện nhờ khả năng develop hiệu quả mà BPF cung cấp tại các Hook Point được tích hợp sâu trong Linux Kernel. Các nhiệm vụ trước đây yêu cầu phát triển customize các functions trong Kernel và cần Compile lại giờ có thể đạt được bằng BPF, khiến nó trở thành sự lựa chọn hàng đầu cho Kubernetes Networking.

Tham khảo tại bài viết này. Cảm ơn vì đã đọc.