系列文章
前言
將 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-latency
或network-throughput
- CPU 調(diào)為性能模式
- 停止
irqbalance
猾普,將網(wǎng)卡中斷引腳指向特定 CPU
- tuned network-* profiles, 如:
在網(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ò)上路由妇蛀。如下圖:
對(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 status
(10.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è)置 nonMasqueradeCIDRs
和 masqLinkLocal
選項(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 編寫.