Cilium系列-6-從地址偽裝從IPtables切換為eBPF

系列文章

前言

將 Kubernetes 的 CNI 從其他組件切換為 Cilium, 已經(jīng)可以有效地提升網(wǎng)絡(luò)的性能. 但是通過對(duì) Cilium 不同模式的切換/功能的啟用, 可以進(jìn)一步提升 Cilium 的網(wǎng)絡(luò)性能. 具體調(diào)優(yōu)項(xiàng)包括不限于:

  • 啟用本地路由(Native Routing)
  • 完全替換 KubeProxy
  • IP 地址偽裝(Masquerading)切換為基于 eBPF 的模式
  • Kubernetes NodePort 實(shí)現(xiàn)在 DSR(Direct Server Return) 模式下運(yùn)行
  • 繞過 iptables 連接跟蹤(Bypass iptables Connection Tracking)
  • 主機(jī)路由(Host Routing)切換為給予 BPF 的模式 (需要 Linux Kernel >= 5.10)
  • 啟用 IPv6 BIG TCP (需要 Linux Kernel >= 5.19)
  • 禁用 Hubble(但是不建議, 可觀察性比一點(diǎn)點(diǎn)的性能提升更重要)
  • 修改 MTU 為巨型幀(jumbo frames) (需要網(wǎng)絡(luò)條件允許)
  • 啟用帶寬管理器(Bandwidth Manager) (需要 Kernel >= 5.1)
  • 啟用 Pod 的 BBR 擁塞控制 (需要 Kernel >= 5.18)
  • 啟用 XDP 加速 (需要 支持本地 XDP 驅(qū)動(dòng)程序)
  • (高級(jí)用戶可選)調(diào)整 eBPF Map Size
  • Linux Kernel 優(yōu)化和升級(jí)
    • CONFIG_PREEMPT_NONE=y
  • 其他:
    • tuned network-* profiles, 如: tuned-adm profile network-latencynetwork-throughput
    • CPU 調(diào)為性能模式
    • 停止 irqbalance猾普,將網(wǎng)卡中斷引腳指向特定 CPU

在網(wǎng)絡(luò)/網(wǎng)卡設(shè)備/OS等條件滿足的情況下, 我們盡可能多地啟用這些調(diào)優(yōu)選項(xiàng), 相關(guān)優(yōu)化項(xiàng)會(huì)在后續(xù)文章逐一更新. 敬請(qǐng)期待.

今天我們來啟用 Cilium eBPF IP 地址偽裝(Masquerading)模式以提升網(wǎng)絡(luò)效率.

測試環(huán)境

  • Cilium 1.13.4
  • K3s v1.26.6+k3s1
  • OS
    • 3臺(tái) Ubuntu 23.04 VM, Kernel 6.2, x86

IP 地址偽裝(Masquerading)

Pod 使用的 IPv4 地址通常是從 RFC1918 專用地址塊中分配的,因此不可公開路由缔御。Cilium 會(huì)自動(dòng)將離開群集的所有流量的源 IP 地址偽裝成 node 的 IPv4 地址抬闷,因?yàn)?node 的 IP 地址已經(jīng)可以在網(wǎng)絡(luò)上路由妇蛀。如下圖:

Masquerading

對(duì)于 IPv6 地址耕突,只有在使用 iptables 執(zhí)行模式時(shí)才會(huì)進(jìn)行偽裝。

如果要禁用該選項(xiàng):

  • 對(duì)于離開主機(jī)的 IPv4 流量评架,可使用選項(xiàng) enable-ipv4-masquerade:false眷茁,
  • 對(duì)于 IPv6 流量,可使用選項(xiàng) enable-ipv6-masquerade:false纵诞。

配置

設(shè)置可路由 CIDR

默認(rèn)行為是排除本地節(jié)點(diǎn) IP 分配 CIDR 范圍內(nèi)的任何目的地上祈。如果 pod IP 可通過更廣泛的網(wǎng)絡(luò)進(jìn)行路由,則可使用選項(xiàng):ipv4-native-routing-cidr: 10.0.0.0/8(或 IPv6 地址的 ipv6-native-routing-cidr: fd00::/100)指定該網(wǎng)絡(luò)浙芙,在這種情況下登刺,該 CIDR 范圍內(nèi)的所有目的地都不會(huì)被偽裝。

設(shè)置偽裝接口

請(qǐng)參閱下文配置偽裝接口嗡呼。

基于 eBPF 的 IP 地址偽裝模式

如果沒有明確指定, 默認(rèn)使用基于 IPTables 的 IP 地址偽裝模式. 這是傳統(tǒng)的實(shí)現(xiàn)方式纸俭,可以在所有內(nèi)核版本上運(yùn)行。默認(rèn)配置檢查如下:

$ kubectl -n kube-system exec ds/cilium -- cilium status | grep Masquerading
Masquerading:            IPTables [IPv4: Enabled, IPv6: Disabled]

而基于 eBPF 的實(shí)現(xiàn)是最有效的實(shí)現(xiàn)南窗。它需要 Linux 內(nèi)核 4.19揍很,并可通過 bpf.masquerade=true helm 選項(xiàng)啟用。

當(dāng)前的實(shí)現(xiàn)依賴于 BPF NodePort 功能万伤。未來將移除該依賴關(guān)系(GitHub 問題 13732)窒悔。

具體命令為:

helm upgrade cilium cilium/cilium \
   --namespace kube-system \
   --reuse-values \
   --set bpf.masquerade=true

偽裝只能在運(yùn)行 eBPF 偽裝程序的網(wǎng)卡設(shè)備上進(jìn)行。這意味著敌买,如果輸出網(wǎng)卡設(shè)備運(yùn)行了該程序简珠,從 pod 發(fā)送到外部地址的數(shù)據(jù)包將被偽裝(偽裝到輸出網(wǎng)卡設(shè)備的 IPv4 地址)。如果未指定虹钮,程序?qū)⒆詣?dòng)連接到 BPF NodePort 網(wǎng)卡設(shè)備檢測機(jī)制選擇的網(wǎng)卡設(shè)備上聋庵。要手動(dòng)更改荐操,請(qǐng)使用devices helm 選項(xiàng)。使用 cilium status 來確定程序運(yùn)行在哪些網(wǎng)卡設(shè)備上:

$ kubectl -n kube-system exec ds/cilium -- cilium status | grep Masquerading
Masquerading:            BPF   [eth0]   10.0.0.0/22 [IPv4: Enabled, IPv6: Disabled]

如上輸出, IPv6: Disabled, 這是因?yàn)榛?eBPF 的偽裝目前不支持 IPv6 流量珍策。

從上面的輸出來看托启,程序正在 eth0 網(wǎng)卡設(shè)備上運(yùn)行。

基于 eBPF 的偽裝可偽裝以下 IPv4 L4 協(xié)議的數(shù)據(jù)包:

  • TCP
  • UDP
  • ICMP(僅 Echo request 和 Echo reply)

默認(rèn)情況下攘宙,除了發(fā)往其他集群節(jié)點(diǎn)的數(shù)據(jù)包外屯耸,所有從 pod 發(fā)往 ipv4-native-routing-cidr 范圍之外 IP 地址的數(shù)據(jù)包都會(huì)被偽裝。排除的 CIDR 顯示在上述 cilium status10.0.0.0/22)輸出中蹭劈。

為實(shí)現(xiàn)更精細(xì)的控制疗绣,Cilium 在 eBPF 中實(shí)現(xiàn)了 ip-masq-agent,可通過 ipMasqAgent.enabled=true helm 選項(xiàng)啟用铺韧。

基于 eBPF 的 ip-masq-agent 支持在配置文件中設(shè)置 nonMasqueradeCIDRsmasqLinkLocal 選項(xiàng)多矮。從 pod 發(fā)送到屬于 nonMasqueradeCIDRs 中任何 CIDR 的目的地的數(shù)據(jù)包都不會(huì)被偽裝。如果配置文件為空哈打,agent 將提供以下非偽裝 CIDR:

  • 10.0.0.0/8
  • 172.16.0.0/12
  • 192.168.0.0/16
  • 100.64.0.0/10
  • 192.0.0.0/24
  • 192.0.2.0/24
  • 192.88.99.0/24
  • 198.18.0.0/15
  • 198.51.100.0/24
  • 203.0.113.0/24
  • 240.0.0.0/4

??Note

關(guān)于使用 ip-masq-agent 的配置, 本次暫不進(jìn)行演示, 感興趣的小伙伴可以自行嘗試.

此外塔逃,如果 masqLinkLocal 未設(shè)置或設(shè)置為 false,則 169.254.0.0/16 會(huì)被附加到非屏蔽 CIDR 列表中料仗。

Agent 使用 Fsnotify 跟蹤配置文件的更新

下面的示例展示了如何通過 ConfigMap 配置 agent 并進(jìn)行驗(yàn)證:

apiVersion: v1
  kind: ConfigMap
  metadata:
    name: ip-masq-agent
  data:
    config: |
      nonMasqueradeCIDRs:
      - 10.0.0.0/8
      - 172.16.0.0/12
      - 192.168.0.0/16
      masqLinkLocal: true
$ kubectl create -n kube-system -f https://raw.githubusercontent.com/cilium/cilium/1.13.4/examples/kubernetes-ip-masq-agent/rfc1918.yaml

$ # Wait ~60s until the ConfigMap is propagated into the configuration file

$ kubectl -n kube-system exec ds/cilium -- cilium bpf ipmasq list
IP PREFIX/ADDRESS
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16

或者湾盗,在通過 Helm 安裝 Cilium 時(shí),可以通過 --set ipMasqAgent.config.nonMasqueradeCIDRs='{10.0.0.0/8,172.16.0.0/12,192.168.0.0/16}'--set ipMasqAgent.config.masqLinkLocal=false 來配置上述 ip-masq-agent立轧。

總結(jié)

本文我們將地址偽裝從 IPTables 切換為基于 eBPF 的模式. 相比 IPTables 模式, 基于 eBPF 的實(shí)現(xiàn)是最有效的實(shí)現(xiàn)格粪。

至此, 性能調(diào)優(yōu)已完成:

  • ?? 啟用本地路由(Native Routing)
  • ?? 完全替換 KubeProxy
  • ?? IP 地址偽裝(Masquerading)切換為基于 eBPF 的模式
  • Kubernetes NodePort 實(shí)現(xiàn)在 DSR(Direct Server Return) 模式下運(yùn)行
  • 繞過 iptables 連接跟蹤(Bypass iptables Connection Tracking)
  • 主機(jī)路由(Host Routing)切換為給予 BPF 的模式 (需要 Linux Kernel >= 5.10)
  • 啟用 IPv6 BIG TCP (需要 Linux Kernel >= 5.19)
  • 修改 MTU 為巨型幀(jumbo frames) (需要網(wǎng)絡(luò)條件允許)
  • 啟用帶寬管理器(Bandwidth Manager) (需要 Kernel >= 5.1)
  • 啟用 Pod 的 BBR 擁塞控制 (需要 Kernel >= 5.18)
  • 啟用 XDP 加速 (需要 支持本地 XDP 驅(qū)動(dòng)程序)

???參考文檔

三人行, 必有我?guī)? 知識(shí)共享, 天下為公. 本文由東風(fēng)微鳴技術(shù)博客 EWhisper.cn 編寫.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市氛改,隨后出現(xiàn)的幾起案子帐萎,更是在濱河造成了極大的恐慌,老刑警劉巖胜卤,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疆导,死亡現(xiàn)場離奇詭異,居然都是意外死亡瑰艘,警方通過查閱死者的電腦和手機(jī)是鬼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來紫新,“玉大人均蜜,你說我怎么就攤上這事∶⒙剩” “怎么了囤耳?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我充择,道長德玫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任椎麦,我火速辦了婚禮宰僧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘观挎。我一直安慰自己琴儿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布嘁捷。 她就那樣靜靜地躺著造成,像睡著了一般。 火紅的嫁衣襯著肌膚如雪雄嚣。 梳的紋絲不亂的頭發(fā)上晒屎,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音缓升,去河邊找鬼鼓鲁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛仔沿,可吹牛的內(nèi)容都是我干的坐桩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼封锉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了膘螟?” 一聲冷哼從身側(cè)響起成福,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎荆残,沒想到半個(gè)月后奴艾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡内斯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年蕴潦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俘闯。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡潭苞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出真朗,到底是詐尸還是另有隱情此疹,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蝗碎,受9級(jí)特大地震影響湖笨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蹦骑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一慈省、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧眠菇,春花似錦辫呻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缕坎,卻和暖如春怖侦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谜叹。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來泰國打工匾寝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荷腊。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓艳悔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親女仰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子猜年,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

推薦閱讀更多精彩內(nèi)容