Cilium系列-4-Cilium本地路由

2023-07-25 12:00:40

系列文章

前言

前文中我們提到, cilium install 預設安裝後, Cilium 功能啟用和禁用情況如下:

  1. datapath mode: tunnel: 因為相容性原因,Cilium 會預設啟用 tunnel(基於 vxlan) 的 datapatch 模式,也就是 overlay 網路結構。
  2. KubeProxyReplacement: Disabled Cilium 是沒有完全替換掉 kube-proxy 的,後面我們會出文章介紹如何實現替換。
  3. IPv6 BIG TCP: Disabled 該功能要求 Linux Kernel >= 5.19, 所以在 Kernel 4.19.232 狀態為禁用。
  4. BandwidthManager: Disabled 該功能要求 Linux Kernel >= 5.1, 所以目前是禁用的
  5. Host Routing: Legacy Legacy Host Routing 還是會用到 iptables, 效能較弱;但是 BPF-based host routing 需要 Linux Kernel >= 5.10
  6. Masquerading: IPtables IP 偽裝有幾種方式:基於 eBPF 的,和基於 iptables 的。預設使用基於 iptables, 推薦使用 基於 eBPF 的。
  7. Hubble Relay: disabled 預設 Hubble 也是禁用的。

今天我們嘗試關閉 tunnel 功能, 啟用本地路由(Native-Routing)功能以提升網路效能.

測試環境

  • Cilium 1.13.4
  • K3s v1.26.6+k3s1
  • OS
    • 3臺 Ubuntu 23.04 VM, Kernel 6.2, x86

VXLan 封裝

在未提供任何設定的情況下,Cilium 會自動以這種模式執行,因為這種模式對底層網路基礎設施的要求最低

在這種模式下,所有叢集節點都會使用基於 UDP 的封裝協定 VXLAN 或 Geneve 形成網狀隧道。Cilium 節點之間的所有流量都經過封裝.

這種模式的缺點

MTU 開銷

由於增加了封裝頭,有效載荷可用的 MTU 要低於本地路由(VXLAN 每個網路封包 50 位元組)。這導致特定網路連線的最大吞吐率降低。

本地路由(Native-Routing)

本地路由資料路徑在 tunnel: disabled 時啟用,並啟用本機封包轉發模式。本機封包轉發模式利用 Cilium 執行網路的路由功能,而不是執行封裝。

在本地路由模式下,Cilium 會將所有未定址到其他本地端點的封包委託給 Linux 核心的路由子系統。這意味著,封包的路由將如同本地程序發出封包一樣。因此,連線叢集節點的網路必須能夠路由 PodCIDR。

設定本地路由時,Cilium 會自動在 Linux 核心中啟用 IP 轉發。

網路需求

  • 要執行本地路由模式,連線執行 Cilium 的主機的網路必須能夠轉發使用給 pod 或其他工作負載的地址的 IP 流量。
  • 節點上的 Linux 核心必須知道如何轉發所有執行 Cilium 的節點上 pod 或其他工作負載的封包。這可以通過兩種方式實現:
    • 節點本身不知道如何路由所有 pod IP,但網路上有路由器知道如何到達所有其他 pod。在這種情況下,Linux 節點被設定為包含指向此類路由器的預設路由。這種模式用於雲提供商網路整合。有關詳細資訊,請參閱 Google CloudAWS ENIAzure IPAM
    • 每個節點都知道所有其他節點的所有 pod IP,並在 Linux 核心路由表中插入路由來表示這一點。
      • 如果所有節點共用一個 L2 網路,則可以啟用選項 auto-direct-node-routes: true 來解決這個問題。本次實驗我們使用這種方式啟用本地路由.
      • 否則,必須執行額外的系統元件(如 BGP 守護行程)來分發路由。有關如何使用 kube-router 專案實現這一目標,請參閱指南《使用 Kube-Router 執行 BGP》

實戰: 啟用本地路由

從現在開始, 後續的 cilium 安裝設定越來越複雜, 有很多客製化的設定引數, 所以我們從現在開始使用 Helm Chart 方式安裝 Cilium.