在 Istio 環境模式中使用 eBPF 進行流量重新導向
將應用程式 Pod 流量重新導向至每個節點的 ztunnel 的替代方法。
在 Istio 的新環境模式中,每個 Kubernetes 工作節點上運行的 istio-cni
組件負責將應用程式流量重新導向到該節點上的零信任通道 (ztunnel)。預設情況下,它依賴 iptables 和通用網路虛擬化封裝 (Geneve)覆蓋隧道來實現此重新導向。我們現在已添加對基於 eBPF 的流量重新導向方法的支援。
為什麼選擇 eBPF
雖然效能考量在 Istio 環境模式重新導向的實作中至關重要,但考慮到易於程式設計也很重要,以便能夠實作多功能和客製化的需求。透過 eBPF,您可以利用核心中的額外上下文來繞過複雜的路由,並簡單地將封包傳送到其最終目的地。
此外,eBPF 在核心中為封包啟用更深層的可見性和額外的上下文,與 iptables 相比,可以更有效率且靈活地管理資料流。
運作方式
已將一個附加到流量控制入口和出口掛鉤的 eBPF 程式編譯到 Istio CNI 組件中。當 Pod 移動到或移出環境模式時,istio-cni
將會監看 Pod 事件並將 eBPF 程式附加/分離到其他相關的網路介面。
使用 eBPF 程式(而不是 iptables)消除了封裝任務(對於 Geneve)的需要,允許在核心空間中自訂路由任務。這不僅提高了效能,還提高了路由的額外彈性。
所有進出應用程式 Pod 的流量都將被 eBPF 攔截並重新導向到相應的 ztunnel Pod。在 ztunnel 端,將根據 eBPF 程式內的連線查詢結果執行正確的重新導向。這可以更有效率地控制應用程式和 ztunnel 之間的網路流量。
如何在 Istio 環境模式中啟用 eBPF 重新導向
按照環境網格入門中的說明設定您的叢集,並稍作更改:當您安裝 Istio 時,將 values.cni.ambient.redirectMode
配置參數設定為 ebpf
。
$ istioctl install --set profile=ambient --set values.cni.ambient.redirectMode="ebpf"
檢查 istio-cni
日誌以確認 eBPF 重新導向已開啟
ambient Writing ambient config: {"ztunnelReady":true,"redirectMode":"eBPF"}
效能提升
eBPF 重新導向的延遲和吞吐量 (QPS) 比使用 iptables 略好。以下測試是在 kind
叢集中執行的,其中 Fortio 用戶端將請求傳送到 Fortio 伺服器,兩者都以環境模式執行(已停用 eBPF 除錯記錄),並且在同一個 Kubernetes 工作節點上。
$ fortio load -uniform -t 60s -qps 0 -c <num_connections> http://<fortio-svc-name>:8080
$ fortio load -uniform -t 60s -qps 8000 -c <num_connections> http://<fortio-svc-name>:8080
總結
在流量重新導向方面,eBPF 和 iptables 各有優缺點。eBPF 是一種現代、靈活且功能強大的替代方案,可以更客製化規則建立並提供更好的效能。但是,它確實需要現代的核心版本(對於重新導向案例為 4.20 或更新版本),這在某些系統上可能無法使用。另一方面,iptables 被廣泛使用並且與大多數 Linux 發行版相容,即使是那些具有較舊核心的版本。然而,它缺乏 eBPF 的靈活性和可擴充性,並且可能具有較低的效能。
最終,選擇 eBPF 還是 iptables 來進行流量重新導向將取決於系統的特定需求和要求,以及使用者使用每個工具的專業知識水平。某些使用者可能偏好 iptables 的簡單性和相容性,而其他使用者可能需要 eBPF 的彈性和效能。
仍然有很多工作要做,包括與各種 CNI 外掛程式的整合,並且非常歡迎大家提供貢獻以改進易用性。請在 Istio slack 上的 #ambient 中加入我們。