eBPF技術(shù)應(yīng)用云原生網(wǎng)絡(luò)實踐系列之基于socket的service | 龍蜥技術(shù)
[導(dǎo)讀]相關(guān)閱讀:《eBPF技術(shù)應(yīng)用云原生網(wǎng)絡(luò)實踐系列之kubernetes網(wǎng)絡(luò)》背景介紹Kubernetes中的網(wǎng)絡(luò)功能,主要包括POD網(wǎng)絡(luò),service網(wǎng)絡(luò)和網(wǎng)絡(luò)策略組成。其中POD網(wǎng)絡(luò)和網(wǎng)絡(luò)策略,都是規(guī)定了模型,沒有提供默認實現(xiàn)。而service網(wǎng)絡(luò)作為Kubernetes的特色...
相關(guān)閱讀:《eBPF技術(shù)應(yīng)用云原生網(wǎng)絡(luò)實踐系列之kubernetes網(wǎng)絡(luò)》
背景介紹
Kubernetes 中的網(wǎng)絡(luò)功能,主要包括 POD 網(wǎng)絡(luò),service 網(wǎng)絡(luò)和網(wǎng)絡(luò)策略組成。其中 POD 網(wǎng)絡(luò)和網(wǎng)絡(luò)策略,都是規(guī)定了模型,沒有提供默認實現(xiàn)。而 service 網(wǎng)絡(luò)作為 Kubernetes 的特色部分,官方版本持續(xù)演進了多種實現(xiàn):
| service 實現(xiàn) | 說明 |
| userspace 代理模式 | kube-proxy 負責 list/watch,規(guī)則設(shè)置,用戶態(tài)轉(zhuǎn)發(fā)。 |
| iptables 代理模式 | kube-proxy 負責 list/watch,規(guī)則設(shè)置。IPtables 相關(guān)內(nèi)核模塊負責轉(zhuǎn)發(fā)。 |
| IPVS 代理模式 | kube-proxy 負責 list/watch,規(guī)則設(shè)置。IPVS 相關(guān)內(nèi)核模塊負責轉(zhuǎn)發(fā)。 |
-
通過 attach 到特定的 cgroup 的文件描述符,可以控制 hook 接口的作用范圍。
-
利用 sock eBPF hook,我們可以在 socket 層面劫持特定的 socket 接口,來完成完成負載均衡邏輯。
- POD-SVC-POD 的轉(zhuǎn)發(fā)行為轉(zhuǎn)換成 POD-POD 的轉(zhuǎn)發(fā)行為。
TCP 工作流程
TCP 由于是有基于連接的,所以實現(xiàn)非常簡明,只需要 hook connect 系統(tǒng)調(diào)用即可,如下所示:connect 系統(tǒng)調(diào)用劫持邏輯:1. 從 connect 調(diào)用上下文中取 dip dport,查找 svc 表。找不到則不處理返回。
- 不需要逐包的 dnat 行為。
- 不需要逐包的查找 svc 的行為。
UDP 工作流程
UDP 由于是無連接的,實現(xiàn)要復(fù)雜一些,如下圖所示:nat_sk 表的定義參見:LB4_REVERSE_NAT_SK_MAP
基于 socket eBPF 實現(xiàn)的 clusterIP,在上述基本轉(zhuǎn)發(fā)原理之外,還有一些特殊的細節(jié)需要考慮,其中一個需要特殊考慮就是 peer address 的問題。和 IPVS之類的實現(xiàn)不同,在 socket eBPF 的 clusterIP 上,client 是和直接和 backend 通信的,中間的 service 被旁路了。回顧一下轉(zhuǎn)發(fā)路徑如下:
總結(jié)
和TC-EBPF/IPVS性能對比
測試環(huán)境:4vcpu 8G mem 的安全容器實例,單 client 單 clusterip 12 backend。socket BPF:基于 socket ebpf 的 service 實現(xiàn)。tc eBPF:基于 cls-bpf 的 service 實現(xiàn),目前已經(jīng)在 ack 服務(wù)中應(yīng)用。IPVS-raw:去掉所有安全組規(guī)則和 veth 之類開銷,只有 IPVS 轉(zhuǎn)發(fā)邏輯的 service 實現(xiàn)。socket BPF 在所有性能指標上,均有不同程度提升。大量并發(fā)的短連接,基本上吞吐提升 15%,時延降低 20%。轉(zhuǎn)發(fā)性能比較(QPS)90%轉(zhuǎn)發(fā)延時比較(ms)繼續(xù)演進
eBPF does to Linux what JavaScript does to HTML.-- Brendan Gregg基于 socket eBPF 實現(xiàn)的 service,大大簡化了負載均衡的邏輯實現(xiàn),充分體現(xiàn)了 eBPF 靈活、小巧的特點。eBPF 的這些特點也很契合云原生場景,目前,該技術(shù)已在阿里云展開實踐,加速了 kubernetes 服務(wù)網(wǎng)絡(luò)。我們會繼續(xù)探索和完善更多的 eBPF 的應(yīng)用案例,比如 IPv6、network policy 等。





