阿裡雲Kubernetes叢集使用IPVlan加速Pod網絡
背景
随着各種類型的應用的容器化,除了無狀态的微服務應用,越來越多像資料庫、機器學習等對網絡性能和延時非常敏感的應用也逐漸跑在了Kubernetes上。對于這種網絡性能和延時特别敏感的應用,阿裡雲Kubernetes叢集的網絡方案Terway在之前提供了Pod獨占ENI(彈性網卡)的網絡模式,讓Pod可以擁有和ECS完全一樣的一張彈性網卡,性能相對ECS完全沒有損失。但ECS可以綁定的彈性網卡數量有限,使用獨占ENI(彈性網卡)的模式的機器隻能運作個位數的Pod數,應用沒辦法部署太密集。 是以Terway在ENI多IP的模式中推出了基于IPVlan的Pod網絡,每個ENI可以供多達10個Pod共享,并且IPVlan的核心技術也能将損耗降到最低,在實際測試中網絡延時可以媲美獨占ENI模式。
原理概要
IPVlan是一種Linux核心的網絡虛拟化技術,從Linux 3.19版本開始支援,通過IPVlan可以将一個網絡接口建立出多個子虛拟接口。這些子虛拟接口可以設定不同的IP位址,父網卡會根據包中的IP位址決定把包轉發到哪個子虛拟網卡。這些子虛拟網卡可以供k8s的每個Pod使用,進而讓多個Pod可以共用一張彈性網卡。而對于Aliyun的ENI(彈性網卡),支援在網卡上額外再配置設定10-20個輔助VPC IP,可以動态配置設定輔助IP用于IPVlan子虛拟網卡配置。

适用場景和要求
由于IPVlan是比較新的核心版本才支援的虛拟化技術,是以有一定的要求和試用場景:
适用場景:
- Pod和Pod直接通信的需求更多時,由于IPVlan通路k8s service需要額外走SNAT,是以pod通路Service的場景性能差一些(具體可參考 https://kernel.taobao.org/2019/11/ipvlan-for-kubernete-net/ )
- 對網絡延時敏感的應用,比如遊戲、資料庫、機器學習等
- 獨占ENI的模式沒辦法滿足規模需求時
- IPVlan模式目前還不支援Kubernetes NetworkPolicy
要求:
- 阿裡雲Kubernetes叢集Terway網絡ENI多IP模式,并且Terway元件更新到最新版本
- 節點使用Aliyun Linux2的作業系統(核心版本4.19,滿足IPVlan模式需求)
使用方法
1. 建立阿裡雲Kubernetes叢集
- 選擇作業系統為AliyunLinux2
- 選擇Terway網絡插件
2. 修改Terway轉發模式為IPVlan
- 建立好叢集後,通過kubectl連接配接到該叢集,然後修改Terway的configmap:
kubectl edit cm eni-config -n kube-system
- 增加轉發模式配置:
- 修改kube-proxy中叢集網段到169.254.1.1/32來強制SNAT Service的流量
kubectl edit cm -n kube-system kube-proxy-worker
(如果有master節點的話)kubectl edit cm -n kube-system kube-proxy-master
修改其中
clusterCIDR
從Pod網段到
169.254.1.1/32
3. 驗證重新開機節點能正常啟動Pod
性能對比
時延
時延采用ping,netperf做了測試。ping測試了普通模式和洪泛模式,netperf測試了tcp_rr, udp_rr兩種模式。結果如下:
其中IPVlan, ENI模式較為接近。政策路由普通ping模式下約有20ns增加,洪泛ping模式7ns增加;udp_rr下降約8%、tcp_rr下降約10%。
帶寬
帶寬測試采用netperf測試了tcp_stream和不同包長下的udp_stream, 結果如下:
其中udp stream模式下ENI,IPVlan較為接近約0.02%以下,政策路由約7%左右。吞吐IPVlan比ENI約有25%下降,政策路由相比ENI約有50%下降。 tcp stream模式下由于gso, gro的加速,吞吐較為接近。
參考文檔:
阿裡雲系統組技術部落格--Kubernetes網絡的IPVlan方案
(感謝阿裡雲系統組貢獻了Kubernetes IPVlan的網絡模式)