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.
Vì eBPF
được tích hợp sâu vào Network Stack
ở Kernel 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-proxy
và iptables
.
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 Pod
và Container
. 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 Pod
và Container
.
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 đề:
- Việc cập nhật
iptables
phải tạo lại và cập nhật tất cảRules
trong mộttransaction
duy nhất iptables
hoạt động như một chuỗiRules
dạng danh sách liên kết, nên mọi thao tác đều có độ phức tạp nhất địnhO(n)
iptables
thực hiệnAccess Control
theo danh sách quy tắc tuần tự (cũngO(n)
)- Mỗi khi có
IP
hoặcPort
mới cần khớp với nhau,Rules
phải thêm vào và cập nhật lại chuỗi - Tiêu tốn nhiều
Resource
trên Kubernetes
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 Cluster
có 20,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
.

Cả Cilium và Calico đề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.

Các bài Performance Test về throughput
, CPU usage
và Latency
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.