Si muda mrefu uliopita nilikabiliwa na kazi isiyo ya kawaida sana ya kusanidi njia ya MetalLB. Kila kitu kitakuwa sawa, kwa sababu ... Kawaida MetalLB haihitaji hatua zozote za ziada, lakini kwa upande wetu tunayo nguzo kubwa yenye usanidi rahisi sana wa mtandao.
Katika makala haya nitakuambia jinsi ya kusanidi uelekezaji kulingana na chanzo na sera kwa mtandao wa nje wa nguzo yako.
Sitaingia kwa undani juu ya kusakinisha na kusanidi MetalLB, kwani nadhani tayari una uzoefu fulani. Ninapendekeza kwenda moja kwa moja kwa uhakika, ambayo ni kuanzisha njia. Kwa hivyo tuna kesi nne:
Kesi ya 1: Wakati hakuna usanidi unahitajika
Hebu tuangalie kesi rahisi.
Usanidi wa ziada wa uelekezaji hauhitajiki wakati anwani zilizotolewa na MetalLB ziko katika mtandao mdogo sawa na anwani za nodi zako.
Kwa mfano, una subnet 192.168.1.0/24
, ina kipanga njia 192.168.1.1
, na nodi zako hupokea anwani: 192.168.1.10-30
, basi kwa MetalLB unaweza kurekebisha masafa 192.168.1.100-120
na uhakikishe kuwa watafanya kazi bila usanidi wowote wa ziada.
Kwanini hivyo? Kwa sababu nodi zako tayari zina njia zilizosanidiwa:
# 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
Na anwani kutoka kwa safu sawa zitazitumia tena bila vitendo vyovyote vya ziada.
Kesi ya 2: Wakati ubinafsishaji wa ziada unahitajika
Unapaswa kusanidi njia za ziada wakati wowote nodi zako hazina anwani ya IP iliyosanidiwa au njia ya kwenda kwa subnet ambayo MetalLB inatoa anwani.
Nitaelezea kwa undani zaidi. Wakati wowote MetalLB inapotoa anwani, inaweza kulinganishwa na mgawo rahisi kama:
ip addr add 10.9.8.7/32 dev lo
Makini na:
- a) Anwani imepewa kiambishi awali
/32
yaani, njia haitaongezwa kiotomatiki kwa subnet yake (ni anwani tu) - b) Anwani imeambatishwa kwa kiolesura chochote cha nodi (kwa mfano loopback). Ni muhimu kutaja hapa vipengele vya mtandao wa mtandao wa Linux. Haijalishi ni kiolesura gani unachoongeza anwani, kernel itachakata maombi ya arp kila wakati na kutuma majibu ya arp kwa yoyote kati yao, tabia hii inachukuliwa kuwa sawa na, zaidi ya hayo, inatumika sana katika mazingira yenye nguvu kama Kubernetes.
Tabia hii inaweza kubinafsishwa, kwa mfano kwa kuwezesha arp kali:
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
Katika hali hii, majibu ya arp yatatumwa tu ikiwa kiolesura kina anwani maalum ya IP. Mpangilio huu unahitajika ikiwa unapanga kutumia MetalLB na proksi yako ya kube inafanya kazi katika hali ya IPVS.
Walakini, MetalLB haitumii kernel kuchakata maombi ya arp, lakini inajifanya yenyewe katika nafasi ya mtumiaji, kwa hivyo chaguo hili halitaathiri utendakazi wa MetalLB.
Wacha turudi kwenye kazi yetu. Ikiwa njia ya anwani zilizotolewa haipo kwenye nodi zako, ongeza mapema kwa nodi zote:
ip route add 10.9.8.0/24 dev eth1
Kesi ya 3: Unapohitaji uelekezaji wa msingi wa chanzo
Utahitaji kusanidi uelekezaji kulingana na chanzo unapopokea pakiti kupitia lango tofauti, si lile lililosanidiwa kwa chaguo-msingi, kwa hivyo pakiti za majibu zinapaswa pia kupitia lango sawa.
Kwa mfano, una subnet sawa 192.168.1.0/24
iliyojitolea kwa nodi zako, lakini unataka kutoa anwani za nje kwa kutumia MetalLB. Hebu tuchukulie una anwani nyingi kutoka kwa subnet 1.2.3.0/24
ziko katika VLAN 100 na unataka kuzitumia kufikia huduma za Kubernetes nje.
Wakati wa kuwasiliana 1.2.3.4
utakuwa ukifanya maombi kutoka kwa subnet tofauti na 1.2.3.0/24
na kusubiri jibu. Nodi ambayo kwa sasa ni bwana wa anwani iliyotolewa na MetalLB 1.2.3.4
, itapokea pakiti kutoka kwa router 1.2.3.1
, lakini jibu kwa ajili yake lazima lazima kwenda njia sawa, kupitia 1.2.3.1
.
Kwa kuwa nodi yetu tayari ina lango chaguo-msingi lililosanidiwa 192.168.1.1
, basi kwa chaguo-msingi jibu litaenda kwake, na sio 1.2.3.1
, kupitia ambayo tulipokea kifurushi.
Jinsi ya kukabiliana na hali hii?
Katika kesi hii, unahitaji kuandaa nodes zako zote kwa njia ambayo wako tayari kutumikia anwani za nje bila usanidi wa ziada. Hiyo ni, kwa mfano hapo juu, unahitaji kuunda kiolesura cha VLAN kwenye nodi mapema:
ip link add link eth0 name eth0.100 type vlan id 100
ip link set eth0.100 up
Na kisha ongeza njia:
ip route add 1.2.3.0/24 dev eth0.100 table 100
ip route add default via 1.2.3.1 table 100
Tafadhali kumbuka kuwa tunaongeza njia kwenye jedwali tofauti la uelekezaji 100
itakuwa na njia mbili tu zinazohitajika kutuma pakiti ya majibu kupitia lango 1.2.3.1
, iko nyuma ya kiolesura eth0.100
.
Sasa tunahitaji kuongeza sheria rahisi:
ip rule add from 1.2.3.0/24 lookup 100
ambayo inasema wazi: ikiwa anwani ya chanzo cha pakiti iko ndani 1.2.3.0/24
, basi unahitaji kutumia meza ya uelekezaji 100
. Ndani yake tayari tumeeleza njia itakayompeleka 1.2.3.1
Kesi ya 4: Unapohitaji uelekezaji unaotegemea sera
Topolojia ya mtandao ni sawa na katika mfano uliopita, lakini hebu tuseme unataka kuwa na uwezo wa kufikia anwani za nje. 1.2.3.0/24
kutoka kwa maganda yako:
Upekee ni kwamba wakati wa kupata anwani yoyote ndani 1.2.3.0/24
, pakiti ya majibu hugonga nodi na ina anwani ya chanzo katika safu 1.2.3.0/24
itatumwa kwa utii eth0.100
, lakini tunataka Kubernetes ielekeze kwenye ganda letu la kwanza, ambalo lilitoa ombi asili.
Kutatua tatizo hili kuligeuka kuwa ngumu, lakini ikawa shukrani inayowezekana kwa uelekezaji wa sera:
Kwa ufahamu bora wa mchakato, hapa kuna mchoro wa netfilter block:
Kwanza, kama katika mfano uliopita, wacha tuunde jedwali la ziada la uelekezaji:
ip route add 1.2.3.0/24 dev eth0.100 table 100
ip route add default via 1.2.3.1 table 100
Sasa hebu tuongeze sheria chache kwa 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
Sheria hizi zitaashiria miunganisho inayoingia kwenye kiolesura eth0.100
, kuashiria pakiti zote na lebo 0x100
, majibu ndani ya muunganisho sawa pia yatawekewa lebo sawa.
Sasa tunaweza kuongeza sheria ya uelekezaji:
ip rule add from 1.2.3.0/24 fwmark 0x100 lookup 100
Hiyo ni, pakiti zote zilizo na anwani ya chanzo 1.2.3.0/24
na tag 0x100
lazima ipitishwe kwa kutumia meza 100
.
Kwa hivyo, pakiti zingine zilizopokelewa kwenye kiolesura kingine si chini ya sheria hii, ambayo itawawezesha kupitishwa kwa kutumia zana za kawaida za Kubernetes.
Kuna jambo moja zaidi, katika Linux kuna kinachojulikana kama kichungi cha njia ya nyuma, ambayo inaharibu jambo zima; hufanya ukaguzi rahisi: kwa pakiti zote zinazoingia, inabadilisha anwani ya chanzo ya pakiti na anwani ya mtumaji na kuangalia ikiwa. pakiti inaweza kuondoka kupitia kiolesura kilekile ambacho kilipokelewa, ikiwa sivyo, itaichuja.
Shida ni kwamba kwa upande wetu haitafanya kazi kwa usahihi, lakini tunaweza kuizima:
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth0.100/rp_filter
Tafadhali kumbuka kuwa amri ya kwanza inadhibiti tabia ya kimataifa ya rp_filter; ikiwa haijazimwa, amri ya pili haitakuwa na athari. Walakini, violesura vilivyosalia vitasalia na rp_filter kuwezeshwa.
Ili kutopunguza kabisa utendakazi wa kichujio, tunaweza kutumia rp_filter utekelezaji kwa netfilter. Kutumia rpfilter kama moduli ya iptables, unaweza kusanidi sheria zinazobadilika kabisa, kwa mfano:
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
wezesha rp_filter kwenye kiolesura eth0.100
kwa anwani zote isipokuwa 1.2.3.0/24
.
Chanzo: mapenzi.com