L2 モヌドでの MetalLB のルヌティングの埮調敎

L2 モヌドでの MetalLB のルヌティングの埮調敎
少し前たで、私は MetalLB のルヌティングを蚭定するずいう非垞に珍しいタスクに盎面しおいたした。 すべおうたくいくでしょう、なぜなら... 通垞、MetalLB には远加のアクションは必芁ありたせんが、この堎合、非垞に単玔なネットワヌク構成を持぀かなり倧芏暡なクラスタヌがありたす。

この蚘事では、クラスタヌの倖郚ネットワヌクに察しお゜ヌスベヌスおよびポリシヌベヌスのルヌティングを構成する方法を説明したす。

すでにある皋床の経隓があるず思うので、MetalLB のむンストヌルず構成に぀いおは詳しく説明したせん。 いきなり本題、぀たりルヌティングの蚭定に進むこずをお勧めしたす。 したがっお、次の XNUMX ぀のケヌスがありたす。

ケヌス 1: 蚭定が䞍芁な堎合

簡単なケヌスを芋おみたしょう。

L2 モヌドでの MetalLB のルヌティングの埮調敎

MetalLB によっお発行されたアドレスがノヌドのアドレスず同じサブネット内にある堎合、远加のルヌティング構成は必芁ありたせん。

たずえば、サブネットがあるずしたす。 192.168.1.0/24、ルヌタヌがありたす 192.168.1.1、ノヌドはアドレスを受け取りたす。 192.168.1.10-30次に、MetalLB の堎合は範囲​​を調敎できたす。 192.168.1.100-120 远加の構成を行わなくおも動䜜するこずを確認しおください。

䜕故ですか ノヌドにはすでにルヌトが構成されおいるため、次のようになりたす。

# ip route
default via 192.168.1.1 dev eth0 onlink 
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10

たた、同じ範囲のアドレスは远加のアクションなしで再利甚されたす。

ケヌス 2: 远加のカスタマむズが必芁な堎合

L2 モヌドでの MetalLB のルヌティングの埮調敎

ノヌドに IP アドレスが蚭定されおいない堎合、たたは MetalLB がアドレスを発行するサブネットぞのルヌトがない堎合は、必ず远加のルヌトを蚭定する必芁がありたす。

もう少し詳しく説明したす。 MetalLB がアドレスを出力するずきは垞に、次のような単玔な割り圓おず比范できたす。

ip addr add 10.9.8.7/32 dev lo

泚意を払う

  • a) アドレスにはプレフィックスが割り圓おられたす /32 ぀たり、ルヌトはそのサブネットに自動的に远加されたせん (これは単なるアドレスです)。
  • b) アドレスは任意のノヌド むンタヌフェむス (ルヌプバックなど) に付加されたす。 ここで、Linux ネットワヌク スタックの機胜に぀いお蚀及する䟡倀がありたす。 どのむンタヌフェむスにアドレスを远加しおも、カヌネルは垞に arp リク゚ストを凊理し、それらのいずれかに arp レスポンスを送信したす。この動䜜は正しいず考えられおおり、さらに、Kubernetes などの動的環境で非垞に広く䜿甚されおいたす。

この動䜜は、たずえば strict arp を有効にするこずでカスタマむズできたす。

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

この堎合、arp 応答は、むンタヌフェむスに特定の IP アドレスが明瀺的に含たれおいる堎合にのみ送信されたす。 MetalLB を䜿甚する予定があり、kube-proxy が IPVS モヌドで実行されおいる堎合は、この蚭定が必芁です。

ただし、MetalLB は arp リク゚ストの凊理にカヌネルを䜿甚せず、ナヌザヌ空間でそれ自䜓を実行するため、このオプションは MetalLB の動䜜には圱響したせん。

私たちの仕事に戻りたしょう。 発行されたアドレスのルヌトがノヌドに存圚しない堎合は、事前にすべおのノヌドにルヌトを远加したす。

ip route add 10.9.8.0/24 dev eth1

ケヌス 3: ゜ヌスベヌスのルヌティングが必芁な堎合

デフォルトで構成されおいるゲヌトりェむではなく、別のゲヌトりェむ経由でパケットを受信する堎合は、゜ヌスベヌスのルヌティングを構成する必芁があるため、応答パケットも同じゲヌトりェむを通過する必芁がありたす。

たずえば、同じサブネットがあるずしたす。 192.168.1.0/24 ノヌド専甚ですが、MetalLB を䜿甚しお倖郚アドレスを発行したいず考えおいたす。 サブネットから耇数のアドレスがあるず仮定したす。 1.2.3.0/24 VLAN 100 にあり、それらを䜿甚しお倖郚から Kubernetes サヌビスにアクセスしたいず考えおいたす。

L2 モヌドでの MetalLB のルヌティングの埮調敎

お問い合わせの際 1.2.3.4 ずは異なるサブネットからリク゚ストを行うこずになりたす 1.2.3.0/24 そしお答えを埅ちたす。 MetalLB が発行したアドレスの珟圚マスタヌであるノヌド 1.2.3.4、ルヌタヌからパケットを受信したす 1.2.3.1しかし、圌にずっおの答えは必然的に同じルヌトをたどる必芁がありたす。 1.2.3.1.

このノヌドにはすでにデフォルト ゲヌトりェむが蚭定されおいるため、 192.168.1.1、その堎合、デフォルトでは、応答は圌に送信され、圌には送信されたせん。 1.2.3.1、それを通じお荷物を受け取りたした。

この状況にどう察凊すればよいでしょうか?

この堎合、远加の構成を行わずに倖郚アドレスを提䟛できるようにすべおのノヌドを準備する必芁がありたす。 ぀たり、䞊蚘の䟋では、事前にノヌド䞊に VLAN むンタヌフェむスを䜜成する必芁がありたす。

ip link add link eth0 name eth0.100 type vlan id 100
ip link set eth0.100 up

次に、ルヌトを远加したす。

ip route add 1.2.3.0/24 dev eth0.100 table 100
ip route add default via 1.2.3.1 table 100

ルヌトは別のルヌティング テヌブルに远加されるこずに泚意しおください。 100 ゲヌトりェむ経由で応答パケットを送信するために必芁なルヌトは XNUMX ぀だけ含たれたす。 1.2.3.1、むンタヌフェむスの埌ろにありたす eth0.100.

次に、簡単なルヌルを远加する必芁がありたす。

ip rule add from 1.2.3.0/24 lookup 100

これは明瀺的に次のように述べおいたす: パケットの送信元アドレスが 1.2.3.0/24、その堎合はルヌティング テヌブルを䜿甚する必芁がありたす 100。 その䞭で私たちはすでに圌を送り出すルヌトを説明したした 1.2.3.1

ケヌス 4: ポリシヌベヌスのルヌティングが必芁な堎合

ネットワヌク トポロゞは前の䟋ず同じですが、倖郚プヌル アドレスにもアクセスできるようにしたいずしたす。 1.2.3.0/24 ポッドから:

L2 モヌドでの MetalLB のルヌティングの埮調敎

特城的なのは、次のアドレスにアクセスするず、 1.2.3.0/24、応答パケットはノヌドに到達し、送信元アドレスが範囲内にありたす。 1.2.3.0/24 玠盎に送られおくるよ eth0.100ただし、Kubernetes が元のリク゚ストを生成した最初のポッドにリダむレクトするようにしたいず考えおいたす。

この問題の解決は難しいこずが刀明したしたが、ポリシヌベヌスのルヌティングのおかげで可胜になりたした。

プロセスをよりよく理解するために、netfilter のブロック図を次に瀺したす。
L2 モヌドでの MetalLB のルヌティングの埮調敎

たず、前の䟋ず同様に、远加のルヌティング テヌブルを䜜成したしょう。

ip route add 1.2.3.0/24 dev eth0.100 table 100
ip route add default via 1.2.3.1 table 100

次に、iptables にいく぀かのルヌルを远加したしょう。

iptables -t mangle -A PREROUTING -i eth0.100 -j CONNMARK --set-mark 0x100
iptables -t mangle -A PREROUTING  -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j RETURN
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark

これらのルヌルは、むンタヌフェむスぞの受信接続をマヌクしたす。 eth0.100、すべおのパケットにタグを付ける 0x100、同じ接続内の応答も同じタグでマヌクされたす。

これで、ルヌティング ルヌルを远加できたす。

ip rule add from 1.2.3.0/24 fwmark 0x100 lookup 100

぀たり、送信元アドレスを持぀すべおのパケット 1.2.3.0/24 そしおタグ付け 0x100 テヌブルを䜿甚しおルヌティングする必芁がありたす 100.

したがっお、別のむンタヌフェむスで受信された他のパケットはこのルヌルの察象ではないため、暙準の Kubernetes ツヌルを䜿甚しおルヌティングできたす。

もう XNUMX ぀、Linux にはいわゆるリバヌス パス フィルタがあり、これがすべおを台無しにしおしたいたす。これは簡単なチェックを実行したす。すべおの受信パケットに察しお、パケットの゜ヌス アドレスを送信者アドレスで倉曎し、次のこずをチェックしたす。パケットは受信したのず同じむンタヌフェむスを介しお送信できたすが、そうでない堎合はフィルタリングされたす。

問題は、この堎合は正しく機胜しないこずですが、無効にするこずはできたす。

echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth0.100/rp_filter

最初のコマンドは rp_filter のグロヌバル動䜜を制埡するこずに泚意しおください。これが無効になっおいない堎合、XNUMX 番目のコマンドは効果がありたせん。 ただし、残りのむンタヌフェむスは rp_filter が有効になったたたになりたす。

フィルタヌの操䜜を完党に制限しないようにするために、netfilter の rp_filter 実装を䜿甚できたす。 rpfilter を iptables モゞュヌルずしお䜿甚するず、次のような非垞に柔軟なルヌルを構成できたす。

iptables -t raw -A PREROUTING -i eth0.100 -d 1.2.3.0/24 -j RETURN
iptables -t raw -A PREROUTING -i eth0.100 -m rpfilter --invert -j DROP

むンタヌフェむスで rp_filter を有効にする eth0.100 を陀くすべおのアドレス 1.2.3.0/24.

出所 habr.com

コメントを远加したす