L2 موڊ ۾ MetalLB لاءِ فائن ٽيوننگ روٽنگ

L2 موڊ ۾ MetalLB لاءِ فائن ٽيوننگ روٽنگ
گهڻو وقت اڳ مون کي MetalLB لاء روٽنگ قائم ڪرڻ جي هڪ تمام غير معمولي ڪم سان منهن ڏيڻو پيو. سڀ ڪجھ ٺيڪ ٿي ويندو، ڇاڪاڻ ته ... عام طور تي MetalLB ڪنهن به اضافي ڪارناما جي ضرورت نه رکندو آھي، پر اسان جي صورت ۾ اسان وٽ ھڪڙو وڏو ڪلستر آھي ھڪڙو تمام سادو نيٽ ورڪ ترتيب سان.

هن آرٽيڪل ۾ آئون توهان کي ٻڌايان ٿو ته توهان جي ڪلستر جي خارجي نيٽ ورڪ لاء ماخذ تي ٻڌل ۽ پاليسي تي ٻڌل روٽنگ کي ڪيئن ترتيب ڏيو.

مان MetalLB کي انسٽال ڪرڻ ۽ ترتيب ڏيڻ بابت تفصيل ۾ نه ويندس، ڇو ته مان سمجهان ٿو ته توهان وٽ اڳ ۾ ئي ڪجهه تجربو آهي. مان سڌو سنئون پوائنٽ ڏانھن وڃڻ جي صلاح ڏيان ٿو، يعني رستو ترتيب ڏيڻ. تنهنڪري اسان وٽ چار ڪيس آهن:

ڪيس 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) پتو ڪنهن به نوڊ انٽرفيس سان ڳنڍيل آهي (مثال طور لوپ بيڪ). اهو هتي قابل ذڪر آهي لينڪس نيٽ ورڪ اسٽيڪ جون خاصيتون. ڪو به فرق نه پوي ته توهان ڪهڙي به انٽرفيس ۾ ايڊريس شامل ڪريو ٿا، ڪرنل هميشه آر پي درخواستن تي عمل ڪندو ۽ انهن مان ڪنهن کي به جواب موڪليندو، اهو رويو صحيح سمجهيو ويندو آهي ۽ ان کان علاوه، ڪبرنيٽس وانگر متحرڪ ماحول ۾ وڏي پيماني تي استعمال ٿيندو آهي.

اهو رويو ترتيب ڏئي سگهجي ٿو، مثال طور سخت آر پي کي فعال ڪندي:

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

انهي صورت ۾، آر پي جواب صرف موڪليا ويندا جيڪڏهن انٽرفيس واضح طور تي هڪ مخصوص IP پتي تي مشتمل آهي. هي سيٽنگ گهربل آهي جيڪڏهن توهان MetalLB استعمال ڪرڻ جو ارادو ڪيو ۽ توهان جو ڪوب-پراڪسي IPVS موڊ ۾ هلندڙ آهي.

بهرحال، MetalLB kernel استعمال نه ڪندو آهي 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 اهو صرف ٻن رستن تي مشتمل هوندو جيڪو گيٽ وي ذريعي جوابي پيڪيٽ موڪلڻ لاءِ ضروري هوندو 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، پر اسان چاهيون ٿا ته ڪبرنيٽس ان کي اسان جي پهرين پوڊ ڏانهن ريڊائريڪٽ ڪري، جنهن اصل درخواست ٺاهي.

هن مسئلي کي حل ڪرڻ ڏکيو ٿي ويو، پر اهو ممڪن ٿيو ته پاليسي تي ٻڌل رستن جي مهرباني:

پروسيس کي بهتر سمجهڻ لاءِ، هتي هڪ نيٽ فلٽر بلاڪ ڊاگرام آهي:
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 اوزار استعمال ڪندي روٽ ڪرڻ جي اجازت ڏين ٿا.

هتي هڪ ٻي شيء آهي، لينڪس ۾ هڪ نام نهاد ريورس پاٿ فلٽر آهي، جيڪو سڄي شيء کي خراب ڪري ٿو؛ اهو هڪ سادي چيڪ انجام ڏئي ٿو: سڀني ايندڙ پيڪيٽس لاء، اهو موڪليندڙ پتي سان پيڪٽ جو ذريعو پتو تبديل ڪري ٿو ۽ چيڪ ڪري ٿو ته ڇا. پيڪٽ ان ئي انٽرفيس ذريعي نڪري سگهي ٿو جنهن تي اهو وصول ڪيو ويو هو، جيڪڏهن نه، اهو ان کي فلٽر ڪري ڇڏيندو.

مسئلو اهو آهي ته اسان جي صورت ۾ اهو صحيح ڪم نه ڪندو، پر اسان ان کي بند ڪري سگهون ٿا:

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

مهرباني ڪري نوٽ ڪريو ته پهريون حڪم rp_filter جي عالمي رويي کي سنڀاليندو آهي؛ جيڪڏهن اهو غير فعال نه آهي، ٻيو حڪم ڪو اثر نه ٿيندو. جڏهن ته، باقي انٽرفيس rp_filter فعال سان گڏ رهندا.

فلٽر جي آپريشن کي مڪمل طور تي محدود نه ڪرڻ لاء، اسان استعمال ڪري سگھون ٿا rp_filter عمل درآمد netfilter لاءِ. 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.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو