我們在伺服器上使用 ConnectX-5 100GbE 乙太網路卡,該卡透過 Mellanox 交換器相互連接。我們在 Kubernetes 叢集上使用 weavenet cni 插件。當我們使用以下命令進行一些測試時iperf使用以下命令工具,我們可以在主機中獲得 100Gbps 的連線速度。
# server host
host1 $ iperf -s -P8
# client host
host2 $ iperf -c <host_ip> -P8
Result: 98.8 Gbps transfer speed
此外,當我們在同一台主機上使用兩個 docker 容器使用相同的工具和指令進行一些測試時,我們也會得到相同的結果。
# server host
host1$ docker run -it -p 5001:5001 ubuntu:latest-with-iperf iperf -s -P8
# client host
host2 $ docker run -it -p 5001:5001 ubuntu:latest-with-iperf iperf -c <host_ip> -P8
Result: 98.8 Gbps transfer speed
但是,當我們在相同的主機(host1、host2)中使用相同的映像建立兩個不同的部署並透過服務ip(我們使用以下yaml 建立了一個k8s 服務)進行相同的測試時,它將流量重定向到我們得到的伺服器Pod唯一的2Gbps。我們也使用 pod 的叢集 ip 和服務的叢集域進行相同的測試,但結果是相同的。
kubectl create deployment iperf-server --image=ubuntu:latest-with-iperf # after that we add affinity(host1) and container port sections to the yaml
kubectl create deployment iperf-client --image=ubuntu:latest-with-iperf # after that we add affinity(host2) and container port sections to the yaml
kind: Service
apiVersion: v1
metadata:
name: iperf-server
namespace: default
spec:
ports:
- name: iperf
protocol: TCP
port: 5001
targetPort: 5001
selector:
name: iperf-server
clusterIP: 10.104.10.230
type: ClusterIP
sessionAffinity: None
太長了;我們測試的場景:
- 主機1(ubuntu 20.04,已安裝mellanox驅動程式)<-------->主機2(ubuntu 20.04,已安裝mellanox驅動程式)= 98.8 Gbps
- 主機 1 上的容器 1 <--------> 主機 2 上的容器 2 = 98.8 Gbps
- Pod1-on-host1 <--------> Pod2-on-host2(使用叢集 ip)= 2Gbps
- Pod1-on-host1 <--------> Pod2-on-host2(使用服務叢集 ip)= 2Gbps
- Pod1-on-host1 <--------> Pod2-on-host2(使用服務叢集網域)= 2Gbps
我們需要獲得 100Gbps 的 Pod 到 Pod 通訊速度。那麼什麼可能導致這個問題呢?
更新1:
- 當我在 iperf 測試期間檢查 pod 內的 htop 時,有 112 個 cpu 核心,並且沒有一個與 CPU 發生衝突。
- 當我將
hostNetwork: true
金鑰新增至部署 Pod 時,頻寬可以達到 100Gbps。
答案1
我們透過停用 weavenet 上的加密來解決這個問題。但重新啟動伺服器就成功了。感謝這個文章。