私の住宅プロバイダが同じ/ 24サブネット上で複数のパブリックIPv4アドレスをルーティングするスイッチに物理的に接続された専用サーバークラスタがあります。ただし、そのサブネットの外部では、約14個のパブリックIPv4アドレスしか使用できません。 IPv4
私の目標は、複数のワーカーノードにわたって特定のIP(たとえば207.120.238.23(実際には私のIPではない)、ゲートウェイが207.120.238.1)のパブリックIPトラフィックを処理できるようにkubernetesクラスタにMetalLBを設定することです。 。したがって、WAN NIC がそれぞれ存在する多くの VM があり、すべて単一のパブリック IP にトラフィック負荷を分散します。
私のk8sクラスタVMには複数のネットワークインターフェイスがあります。 1つ目はLAN通信用のenX0で、次にISPインターネットアップリンクが接続されている各ハイパーバイザーの物理インターフェースにマップされたWANインターフェース(enX2)があります。
これを行う理由は、高価なパブリックIPv4アドレスを節約するためです。各k8sワーカーノードに静的パブリックIPv4アドレスを割り当てる必要がなくなり、そのIPv4にロードバランシングされたMetalLBトラフィックを提供するだけです。
これを達成するために、意図的にenX2にIPを割り当てることなく単にインポートしました。ここに私の/etc/network/interfacesスニペットがあります。
auto enX2
iface enX2 inet manual
up ip link set dev $IFACE up
down ip link set dev $IFACE down
次に、対応する 207.120.238.23 の着信トラフィックを処理するように MetalLB を設定しました。
これで動作しますが、着信トラフィックにのみ適用されます。 MetalLBがインターネットでトラフィックを処理するポート80または443に接続しようとすると、パケットはパブリックネットワークインターフェイスに到達し、このパブリックWANインターフェイスを使用するk8s-workersのスピーカーデーモンの1つがそれを処理します。
しかし、応答を再送信することはできません。-本当に方法がわからないからです。 LAN インターフェイス enX0 とまったく異なる発信パブリック IPv4 を使用するデフォルトのデフォルトゲートウェイを使用してパケットを再送信しようとします。
私は簡単だと思いました。ソースルーティングを使用し、207.120.238.1 enX2を介してデフォルトパスを使用するように指示するカスタムルートテーブルを使用して、207.120.238.23に送信されたすべてのパケットを処理するカスタムルールを設定します。
しかし、これも動作しません。インターフェイスに IP がない場合、カーネルはルート生成を許可しないようです。
# ip route add default via 207.120.238.1 dev enX2 table wan-route
Error: Nexthop has invalid gateway.
解決策はありますか?できますか?同じサブネット内のすべての k8s ワーカーノードに静的パブリック IPv4 を追加することは機能しますが、コストがかかり、IPv4 は、これらのルーティングが実際に可能であることをカーネルに確信させる以外に、他の目的には使用されません。
更新:「onlink」を使用するとうまくいくようです。これで、正しいゲートウェイを含むルートテーブルwan-routeにデフォルトルートが正常に作成されましたが、tcpdumpを使用するとenX2に到着したパケットを表示できますが、応答はenX0を介して送信されます。
私が設定したルールは次のとおりです。
# ip rule
0: from all lookup local
32763: from all fwmark 0x1 lookup wan-route
32764: from 207.120.238.23 lookup wan-route
32765: from 207.120.238.23/24 lookup wan-route
32766: from all lookup main
32767: from all lookup default
また、以下を使用してファイアウォールタグを作成しました。
iptables -t mangle -A PREROUTING -i enX2 -j MARK --set-mark 1
enX2を使用してenX2からのパケットに応答を送信する必要がありますが、それらの何も機能せず、enX0を介して応答を送信します。
答え1
私のクラスタでも同じことをしたので、net.ipv4.conf.eth220.rp_filter=0
これらのインターフェイスを設定し、sysctl
次にnetplan
戻りパスのアドレスを指定する必要がありました。
eth220:
match:
macaddress: 52:54:00:5d:29:01
routes:
- on-link: false
scope: link
to: 172.20.0.0/16
set-name: eth220