L2 rejimida MetalLB uchun marshrutni nozik sozlash

L2 rejimida MetalLB uchun marshrutni nozik sozlash
Yaqinda men MetalLB uchun marshrutlashni sozlash bo'yicha juda noodatiy vazifaga duch keldim. Hammasi yaxshi bo'lardi, chunki... Odatda MetalLB qo'shimcha harakatlarni talab qilmaydi, ammo bizning holatlarimizda bizda juda oddiy tarmoq konfiguratsiyasiga ega bo'lgan juda katta klaster mavjud.

Ushbu maqolada men sizga klasteringizning tashqi tarmog'i uchun manbaga asoslangan va siyosatga asoslangan marshrutlashni qanday sozlashni aytaman.

Men MetalLB ni o'rnatish va sozlash haqida batafsil to'xtalmayman, chunki sizda allaqachon tajriba bor deb o'ylayman. Men to'g'ridan-to'g'ri nuqtaga borishni taklif qilaman, ya'ni marshrutlashni o'rnatish. Shunday qilib, bizda to'rtta holat mavjud:

1-holat: Hech qanday konfiguratsiya talab etilmaganda

Keling, oddiy ishni ko'rib chiqaylik.

L2 rejimida MetalLB uchun marshrutni nozik sozlash

MetalLB tomonidan berilgan manzillar tugunlaringiz manzillari bilan bir xil quyi tarmoqda bo'lsa, qo'shimcha marshrutlash konfiguratsiyasi talab qilinmaydi.

Masalan, sizda quyi tarmoq mavjud 192.168.1.0/24, unda router mavjud 192.168.1.1, va tugunlaringiz manzillarni oladi: 192.168.1.10-30, keyin MetalLB uchun diapazonni sozlashingiz mumkin 192.168.1.100-120 va ular hech qanday qo'shimcha konfiguratsiyasiz ishlashiga ishonch hosil qiling.

Nega bunday? Chunki tugunlaringiz allaqachon konfiguratsiya qilingan marshrutlarga ega:

# 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

Va bir xil diapazondagi manzillar ularni qo'shimcha harakatlarsiz qayta ishlatadi.

2-holat: Qo'shimcha moslashtirish kerak bo'lganda

L2 rejimida MetalLB uchun marshrutni nozik sozlash

Agar tugunlaringiz konfiguratsiya qilingan IP manzili yoki MetalLB bilan bog'liq muammolarni hal qiladigan quyi tarmoqqa marshrutga ega bo'lmasa, siz qo'shimcha marshrutlarni sozlashingiz kerak.

Men biroz batafsilroq tushuntiraman. MetalLB har doim manzilni chiqarsa, uni oddiy topshiriq bilan solishtirish mumkin, masalan:

ip addr add 10.9.8.7/32 dev lo

E'tibor bering:

  • a) Manzil prefiks bilan belgilanadi /32 ya'ni marshrut uning uchun pastki tarmoqqa avtomatik ravishda qo'shilmaydi (bu shunchaki manzil)
  • b) Manzil har qanday tugun interfeysiga biriktirilgan (masalan, loopback). Bu erda Linux tarmoq stekining xususiyatlarini eslatib o'tish kerak. Manzilni qaysi interfeysga qo'shmasligingizdan qat'iy nazar, yadro har doim arp so'rovlarini qayta ishlaydi va ularning har qandayiga arp javoblarini yuboradi, bu xatti-harakatlar to'g'ri hisoblanadi va bundan tashqari Kubernetes kabi dinamik muhitda juda keng qo'llaniladi.

Ushbu xatti-harakatni sozlash mumkin, masalan, qattiq arpni yoqish orqali:

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

Bunday holda, arp javoblari faqat interfeys aniq IP-manzilni o'z ichiga olgan taqdirdagina yuboriladi. Agar siz MetalLB dan foydalanmoqchi bo'lsangiz va kube-proksi IPVS rejimida ishlayotgan bo'lsa, bu sozlama talab qilinadi.

Biroq, MetalLB arp so'rovlarini qayta ishlash uchun yadrodan foydalanmaydi, lekin uni o'zi foydalanuvchi maydonida bajaradi, shuning uchun bu parametr MetalLB ishlashiga ta'sir qilmaydi.

Keling, vazifamizga qaytaylik. Agar berilgan manzillar uchun marshrut tugunlaringizda mavjud bo'lmasa, uni barcha tugunlarga oldindan qo'shing:

ip route add 10.9.8.0/24 dev eth1

3-holat: Manbaga asoslangan marshrutlash kerak bo'lganda

Paketlarni sukut bo'yicha sozlangan emas, balki alohida shlyuz orqali qabul qilganingizda manbaga asoslangan marshrutlashni sozlashingiz kerak bo'ladi, shuning uchun javob paketlari ham bir xil shlyuz orqali o'tishi kerak.

Misol uchun, sizda bir xil pastki tarmoq mavjud 192.168.1.0/24 tugunlaringizga bag'ishlangan, lekin siz MetalLB yordamida tashqi manzillarni berishni xohlaysiz. Faraz qilaylik, sizda quyi tarmoqdan bir nechta manzillar mavjud 1.2.3.0/24 VLAN 100 da joylashgan va siz ulardan Kubernetes xizmatlariga tashqaridan kirish uchun foydalanmoqchisiz.

L2 rejimida MetalLB uchun marshrutni nozik sozlash

Aloqa paytida 1.2.3.4 dan boshqa quyi tarmoqdan so'rovlar yuborasiz 1.2.3.0/24 va javobni kuting. Hozirda MetalLB tomonidan berilgan manzil uchun asosiy tugun 1.2.3.4, paketni marshrutizatordan oladi 1.2.3.1, lekin uning uchun javob, albatta, bir xil yo'l orqali borish kerak 1.2.3.1.

Chunki bizning tugunimiz allaqachon konfiguratsiya qilingan standart shlyuzga ega 192.168.1.1, keyin sukut bo'yicha javob unga emas, balki unga boradi 1.2.3.1, bu orqali biz paketni oldik.

Bu vaziyat bilan qanday kurashish mumkin?

Bunday holda, siz barcha tugunlaringizni tashqi manzillarga qo'shimcha konfiguratsiyasiz xizmat ko'rsatishga tayyor bo'ladigan tarzda tayyorlashingiz kerak. Ya'ni, yuqoridagi misol uchun siz tugunda VLAN interfeysini oldindan yaratishingiz kerak:

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

Va keyin marshrutlarni qo'shing:

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

E'tibor bering, biz marshrutlarni alohida marshrut jadvaliga qo'shamiz 100 u shlyuz orqali javob paketini yuborish uchun zarur bo'lgan faqat ikkita marshrutni o'z ichiga oladi 1.2.3.1, interfeysning orqasida joylashgan eth0.100.

Endi biz oddiy qoidani qo'shishimiz kerak:

ip rule add from 1.2.3.0/24 lookup 100

Bu aniq aytilgan: agar paketning manba manzili bo'lsa 1.2.3.0/24, keyin marshrutlash jadvalidan foydalanishingiz kerak 100. Unda biz uni yuboradigan marshrutni allaqachon tasvirlab berdik 1.2.3.1

4-holat: Siyosatga asoslangan marshrutlash kerak bo'lganda

Tarmoq topologiyasi avvalgi misoldagi kabi, lekin siz tashqi hovuz manzillariga ham kirishni xohlaysiz deylik. 1.2.3.0/24 sizning ko'chatlaringizdan:

L2 rejimida MetalLB uchun marshrutni nozik sozlash

O'ziga xosligi shundaki, istalgan manzilga kirishda 1.2.3.0/24, javob paketi tugunga tushadi va diapazonda manba manziliga ega 1.2.3.0/24 ga itoatkorlik bilan yuboriladi eth0.100, lekin biz Kubernetes uni asl so'rovni yaratgan birinchi podamizga yo'naltirishini xohlaymiz.

Ushbu muammoni hal qilish qiyin bo'lib chiqdi, ammo bu siyosatga asoslangan marshrutlash tufayli mumkin bo'ldi:

Jarayonni yaxshiroq tushunish uchun bu erda netfilter blok diagrammasi:
L2 rejimida MetalLB uchun marshrutni nozik sozlash

Birinchidan, oldingi misolda bo'lgani kabi, keling, qo'shimcha marshrutlash jadvalini yaratamiz:

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

Endi iptables-ga bir nechta qoidalarni qo'shamiz:

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

Ushbu qoidalar interfeysga kiruvchi ulanishlarni belgilaydi eth0.100, barcha paketlarni teg bilan belgilash 0x100, bir xil ulanish ichidagi javoblar ham bir xil teg bilan belgilanadi.

Endi biz marshrutlash qoidasini qo'shishimiz mumkin:

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

Ya'ni manba manzili bo'lgan barcha paketlar 1.2.3.0/24 va teg 0x100 jadval yordamida yo'naltirilishi kerak 100.

Shunday qilib, boshqa interfeysda qabul qilingan boshqa paketlar ushbu qoidaga bo'ysunmaydi, bu ularni standart Kubernetes vositalari yordamida yo'naltirishga imkon beradi.

Yana bir narsa bor, Linuxda teskari yo'l filtri mavjud bo'lib, u hamma narsani buzadi; u oddiy tekshirishni amalga oshiradi: barcha kiruvchi paketlar uchun paketning manba manzilini jo'natuvchi manzili bilan o'zgartiradi va tekshiradi. paket qabul qilingan interfeys orqali ketishi mumkin, agar bo'lmasa, uni filtrlaydi.

Muammo shundaki, bizning holatlarimizda u to'g'ri ishlamaydi, lekin biz uni o'chirib qo'yishimiz mumkin:

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

E'tibor bering, birinchi buyruq rp_filterning global harakatini boshqaradi; agar u o'chirilgan bo'lsa, ikkinchi buyruq hech qanday ta'sir qilmaydi. Biroq, qolgan interfeyslar rp_filter yoqilgan holda qoladi.

Filtrning ishlashini to'liq cheklamaslik uchun biz netfilter uchun rp_filter dasturidan foydalanishimiz mumkin. Rpfilterni iptables moduli sifatida ishlatib, siz juda moslashuvchan qoidalarni sozlashingiz mumkin, masalan:

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

interfeysda rp_filterni yoqing eth0.100 bundan mustasno barcha manzillar uchun 1.2.3.0/24.

Manba: www.habr.com

a Izoh qo'shish