インターフェイスeth1に到着するマルチキャストトラフィックをeth1に転送しようとしていますip link add br0 type bridge
。
ip route add 226.3.2.1 dev docker0
他の場所では、単純な(他のマシン)でこれを行いました。
私は今いくつか試してみましたが、pimdなどのマルチキャストルーターも使用しました。ただし、トラフィックをリダイレクトまたは転送することはできません。テスト設定でこのコマンドを使用すると、マルチキャストトラフィックは引き続き表示されますが、ip route add
マルチキャストtcpdump
受信スクリプト(eth1)では表示されません。
状況に応じて、マルチキャストトラフィックをブリッジに転送したいと思います。これを何らかの方法でmultus-cniを介してkubernetesコンテナに含めます。
インターフェイス(eth1は226.3.2.1でマルチキャストトラフィックを受信します):
2324: eth0@if2325: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:c0:a8:80:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.128.2/20 brd 192.168.143.255 scope global eth0
valid_lft forever preferred_lft forever
21: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
link/ether be:ec:42:84:8c:35 brd ff:ff:ff:ff:ff:ff
2340: eth1@if2341: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:c0:a8:90:05 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.144.5/20 brd 192.168.159.255 scope global eth1
valid_lft forever preferred_lft forever
eth1 226.3.2.1のtcpdump
15:07:52.288989 IP (tos 0x0, ttl 3, id 22735, offset 0, flags [DF], proto UDP (17), length 34)
192.168.144.1.37394 > 226.3.2.1.9000: [bad udp cksum 0x34ce -> 0xd209!] UDP, length 6
15:07:52.435168 IP (tos 0x0, ttl 3, id 22745, offset 0, flags [DF], proto UDP (17), length 34)
192.168.144.1.37394 > 226.3.2.1.9000: [bad udp cksum 0x34ce -> 0xd209!] UDP, length 6
15:07:52.620215 IP (tos 0x0, ttl 3, id 22758, offset 0, flags [DF], proto UDP (17), length 34)
192.168.144.1.37394 > 226.3.2.1.9000: [bad udp cksum 0x34ce -> 0xd209!] UDP, length 6
15:07:52.747806 IP (tos 0x0, ttl 3, id 22783, offset 0, flags [DF], proto UDP (17), length 34)
192.168.144.1.37394 > 226.3.2.1.9000: [bad udp cksum 0x34ce -> 0xd209!] UDP, length 6
IPアドレス
21: br0
link 33:33:00:00:00:01
link 01:00:5e:00:00:6a
link 33:33:00:00:00:6a
link 01:00:5e:00:00:01
link 01:00:5e:03:02:01
inet 226.3.2.1
inet 224.0.0.1
inet 224.0.0.106
inet6 ff02::6a
inet6 ff02::1
inet6 ff01::1
2324: eth0
link 33:33:00:00:00:01
link 01:00:5e:00:00:01
inet 224.0.0.1
inet6 ff02::1
inet6 ff01::1
2340: eth1
link 33:33:00:00:00:01
link 01:00:5e:00:00:01
link 01:00:5e:03:02:01
inet 226.3.2.1
inet 224.0.0.1
inet6 ff02::1
inet6 ff01::1
IPルーティングなしでbr0にバインドされたサーバーとeth1にバインドされたクライアントを使用してローカルでiperfを実行すると、br0のサーバーはトラフィックを受信します。 (iperf -c 226.3.2.1%eth1 -u -T 32 -t 3 -i 1
そしてiperf -s -u -B 226.3.2.1%br0 -i 1
)
また、iperf -c 226.3.2.1%eth1 -u -T 32 -t 3 -i 1
サーバーとiperf -s -u -B 226.3.2.1%eth1 -i 1
コンテナ内でiperfを実行するとトラフィックが受信されます(ここでeth1は別のインターフェイスです)。
問題はeth1-> br0でどのように渡しますか?
編集する:
いいですね。もっと詳細を提供したいと思います。 multitus-cniを使用して、複数のネットワークインターフェイスをコンテナに接続します。コンテナ内のこの追加インターフェイスはeth1と呼ばれ、ホストのbr0に接続されます(cniブリッジプラグインを介して)。
現在動作していることの1つは、ホストのeth1インターフェイスでiperfクライアントを実行し、コンテナのeth1でiperfクライアントを実行するとトラフィックが表示されることです。
問題はホストのeth1-> br0部分です。このマルチキャストトラフィックは転送されないため、br0インターフェイスに接続できません。転送が成功すると、コンテナ内でアクセスできるかどうかはわかりません。
現在のネットワークインターフェイスにバインドし、226.3.2.1マルチキャストグループに参加する小さなPythonスクリプトを実行すると、ホストのeth1にバインドされたトラフィックのみが表示されます。 br0を使用すると、何も表示されません。
UDPパケットのTTLは3ですが、必要に応じて増やすことができます。
答え1
そのため、テスト環境を完全にリセットし、すべてを消去した後に動作し始めました。
- ブリッジインターフェイスを追加しました。
ip link add br0 type bridge
# The ip addr add step is optional but otherwise
# pimd will not recognize the interface as present.
ip addr add 10.10.0.1/16 brd + dev br0
ip link set up br0
- pimd設定の編集/etc/pimd.conf以下を追加します。
phyint eth1 enable ttl-threshold 1
phyint br0 enable ttl-threshold 1
- PIMDの起動
pimd --disable-vifs -l debug
- Kubernetesクラスタへのmultus-cniのインストール
- ブリッジされたネットワーク接続の作成
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: udp-multicast-conf
namespace: kube-system
spec:
config: '{
"cniVersion": "1.0.0",
"type": "bridge",
"bridge": "br0",
"ipMasq": true,
"isGateway": true,
"hairpinMode": true,
"ipam": {
"type": "host-local",
"subnet": "10.10.0.0/16"
}
}'
k8s.v1.cni.cncf.io/networks: kube-system/udp-multicast-conf@eth1
コメントを追加してブリッジをポッドに接続します。
ノート
br0の末尾にあるデバイスが特定のマルチキャストグループに参加すると、pimdはeth1トラフィックのみをbr0インターフェイスにルーティングします。マルチネットワークインターフェイスの場合は、右側のマルチキャストグループに参加する必要があります。デフォルトの実装では、デフォルトのIPパスを使用してデフォルトでnicに接続します。
参照: C/Python -> IP_ADD_MEMBERSHIP