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) Хаяг нь ямар ч зангилааны интерфэйсэд хавсаргасан байна (жишээлбэл, давталт). Линукс сүлжээний стекийн онцлогуудыг энд дурдах нь зүйтэй. Та аль интерфэйс рүү хаяг нэмэхээс үл хамааран цөм нь үргэлж arp хүсэлтийг боловсруулж, тэдгээрийн аль нэгэнд нь arp хариу илгээх болно, энэ зан үйлийг зөв гэж үздэг бөгөөд үүнээс гадна Kubernetes гэх мэт динамик орчинд нэлээд өргөн хэрэглэгддэг.

Энэ зан үйлийг жишээлбэл хатуу arp-г идэвхжүүлснээр тохируулж болно:

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

Энэ тохиолдолд интерфэйс нь тодорхой IP хаягийг агуулсан тохиолдолд л arp хариултыг илгээх болно. Хэрэв та MetalLB ашиглахаар төлөвлөж байгаа бөгөөд таны kube-прокси 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 Энэ нь гарцаар дамжуулан хариу илгээхэд шаардлагатай хоёр л замыг агуулна 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-ээс үүнийг анхны хүсэлтийг үүсгэсэн бидний эхний pod руу дахин чиглүүлэхийг хүсч байна.

Энэ асуудлыг шийдэх нь хэцүү байсан ч бодлогод суурилсан чиглүүлэлтийн ачаар боломжтой болсон.

Үйл явцыг илүү сайн ойлгохын тулд сүлжээ шүүлтүүрийн блок диаграммыг энд үзүүлэв.
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 идэвхжсэн хэвээр байх болно.

Шүүлтүүрийн ажиллагааг бүрэн хязгаарлахгүйн тулд бид 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.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх