私たちはサーバー上で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
また、同じホスト上の 2 つの 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)に同じイメージで2つの異なるデプロイメントを作成し、トラフィックをサーバーポッドにリダイレクトするサービスIP(次のyamlを使用してk8sサービスを作成しました)を介して同じテストを実行すると、次のようになります。2Gbpsポッドのクラスター 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
TLDR; テストしたシナリオ:
- ホスト1(ubuntu 20.04、mellanox ドライバーがインストール済み) <--------> ホスト2(ubuntu 20.04、mellanox ドライバーがインストール済み) = 98.8 Gbps
- コンテナ1-on-host1 <--------> コンテナ2-on-host2 = 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 の速度を実現する必要があります。この問題の原因は何でしょうか?
アップデート1:
- iperf テスト中にポッド内の htop を確認すると、112 個の CPU コアがあり、いずれも CPU に問題はありません。
hostNetwork: true
デプロイメントにキーを追加すると、ポッドは最大 100Gbps の帯域幅に到達できます。
答え1
weavenet の暗号化を無効にすることでこの問題を解決しました。しかし、サーバーを再起動するとうまくいきました。ありがとうございます記事。