
Hiljuti sattusin ĂŒsna ebatavalisse ĂŒlesannetesse MetalLB marsruutimise seadistamiseks. KĂ”ik oleks hĂ€sti, sest tavaliselt ei ole MetalLB jaoks vaja tĂ€iendavaid samme, kuid meie juhul on tegemist piisavalt suure klastriga ĂŒsna lihtsa vĂ”rgukonfiguratsiooniga.
Selles artiklis rÀÀgin, kuidas seadistada source-based ja policy-based marsruutimist teie klastrite vÀlise vÔrgu jaoks.
Ma ei peatuks detailselt MetalLB installimise ja seadistamise juures, kuna eeldan, et teil on juba mingi kogemus. Pakun, et lÀheme kohe asja juurde, nimelt marsruutimise seadistamisele. Niisiis, meil on neli juhtumit:
Juhtum 1: Kui seadistust ei nÔuta
Uurime lihtsat juhtumit.

TÀiendavat marsruutimise seadistust ei nÔuta, kui MetalLB antud aadressid asuvad samas alamvÔrgus nagu teie sÔlmede aadressid.
NÀiteks teil on alamvÔrk 192.168.1.0/24, seal on marsruuter 192.168.1.1, ja teie sÔlmed saavad aadresse: 192.168.1.10-30, siis saate MetalLB jaoks seadistada vahemiku 192.168.1.100-120 ja olla kindel, et need töötavad ilma igasuguste tÀiendavate seadistusteta.
Miks mitte? Sest teie sÔlmedel on juba seadistatud marsruudid:
# 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.10Ja sama vahemiku aadressid kasutavad neid uuesti ilma igasuguste tÀiendavate sammudeta.
Juhtum 2: Kui on vajalik tÀiendav seadistus

Te peaksite seadistama tÀiendavad marsruudid igal ajal, kui teie sÔlmedel ei ole seadistatud IP-aadressid vÔi marsruuti alamvÔrku, mille jaoks MetalLB aadresse vÀlja annab.
Selgitan veidi pÔhjalikumalt. Iga kord, kui MetalLB annab vÀlja aadressi, vÔib seda vÔrrelda lihtsa mÀÀramisega:
ip addr add 10.9.8.7/32 dev loPange tÀhele:
- a) Aadress mÀÀratakse eellaiusega
/32, st marsruut alamvĂ”rku ei lisata automaatselt (see on lihtsalt aadress) - b) Aadress lisatakse ĂŒkskĂ”ik millisele sĂ”lme liidesele (nĂ€iteks loopback). Siin on oluline mainida Linuxi vĂ”rgu stack'i eripĂ€ra. Pole oluline, millisele liidesele te aadressi lisate, tuum töötleb alati arp-pĂ€ringuid ja saadab arp-vastuseid igal liidesel, see kĂ€itumine on korrektne ja seda kasutatakse laialdaselt dĂŒnaamilises keskkonnas nagu Kubernetes.
Seda kÀitumist saab seadistada, nÀiteks lubades range arp:
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announceSel juhul saadetakse arp-vastused ainult siis, kui liides sisaldab selgelt konkreetset IP-aadressi. See seadistus on kohustuslik, kui plaanite kasutada MetalLB-d ja teie kube-proxy töötab IPVS-reĆŸiimis.
Siiski ei kasuta MetalLB tuuma arp-pÀringute töötlemiseks, vaid teeb seda iseseisvalt user-space'is, seega ei mÔjuta see valik MetalLB tööd.
Naaseme meie ĂŒlesande juurde. Kui teie sĂ”lmedel ei ole antud aadresside jaoks marsruuti, lisage see eelnevalt kĂ”ikidele sĂ”lmedele:
ip route add 10.9.8.0/24 dev eth1Juhtum 3: Kui on vajalik source-based routing
Source-based routing tuleb seadistada juhul, kui saate pakette eraldi gateway kaudu, mitte selle kaudu, mis on teie vaikeseade, seega peavad ka vastavad pakettid minema lÀbi sama gateway.
NÀiteks, teil on endiselt sama alamvÔrk 192.168.1.0/24 erakordseks oma sÔlmede jaoks, kuid soovite vÀliseid aadresse vÀlja anda MetalLB abil. Oletame, et teil on mÔned aadressid alamvÔrgust 1.2.3.0/24 VLAN 100-s, ja soovite neid kasutada Kubernetes teenuste ligipÀÀsuks vÀljastpoolt.

Kui pöördute aadressi poole 1.2.3.4 saate pÀringuid teisest alamvÔrgust kui 1.2.3.0/24 ja ootate vastust. SÔlm, mis on hetkel MetalLB antud aadressi jaoks meistriks 1.2.3.4, saab paketi ruuterilt 1.2.3.1, kuid vastus peab kindlasti minema sama marsruuti pidi, lÀbi 1.2.3.1.
Kuna meie sÔlm juba omab seadistatud vaikeseadet 192.168.1.1, siis lÀhevad vastused vaikimisi sinna, mitte 1.2.3.1, kaudu, mille kaudu me paketi saime.
Kuidas sellest olukorrast ĂŒle saada?
Sel juhul peate valmistama ette kÔik oma sÔlmed nii, et nad oleksid valmis teenindama vÀliseid aadresse ilma tÀiendava seadistamiseta. Seega, antud nÀite jaoks peate eelnevalt looma VLAN-liidese sÔlmes:
ip link add link eth0 name eth0.100 type vlan id 100
ip link set eth0.100 upJa seejÀrel lisama marsruudid:
ip route add 1.2.3.0/24 dev eth0.100 table 100
ip route add default via 1.2.3.1 table 100Pange tÀhele, et marsruudid lisame eraldi marsruutimistabelisse 100 see sisaldab ainult kahte marsruuti, mis on vajalikud vastuse saatmiseks lÀbi gateway 1.2.3.1, mis asub liidese taga eth0.100.
NĂŒĂŒd peame lisama lihtsa reegli:
ip rule add from 1.2.3.0/24 lookup 100mis ĂŒtleb selgelt: kui paketi allika aadress asub 1.2.3.0/24, siis tuleb kasutada marsruutimistabelit 100. Siin on juba kirjeldatud marsruut, mis saadab selle lĂ€bi 1.2.3.1
Juhtum 4: Kui on vaja kÀsitsemispÔhist marsruutimist
VÔrgu topoloogia nagu eelnevas nÀites, kuid oletame, et soovite ka vÀlistele aadressidele ligipÀÀsu teie puu 1.2.3.0/24 teie pod'ide kaudu:

EripÀra seisneb selles, et kui pöörduda mistahes aadressi poole, 1.2.3.0/24, tÀhendades, et vastus pakett, jÔudes sÔlme ja omades lÀhteaadressi vahemikus 1.2.3.0/24 saab usaldusvÀÀrselt saadetud eth0.100, kuid me soovime, et Kubernetes suunaks selle meie esimese pod'i juurde, mis algselt genereeris pÀringu.
Selle probleemi lahendamine osutus keeruliseks, kuid see sai vÔimalikuks tÀnu kÀsitsemispÔhisele marsruutimisele:
Selle protsessi parema mÔistmise jaoks toome kirjeldava skeemi netfilter:

Alustame, nagu eelnevas nÀites, tÀiendava marsruuditabeli loomisega:
ip route add 1.2.3.0/24 dev eth0.100 table 100
ip route add default via 1.2.3.1 table 100NĂŒĂŒd lisame iptablesse mĂ”ned reeglid:
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-markNeed reeglid mĂ€rgivad sissetulevaid ĂŒhendusi liidesel eth0.100, mĂ€rkides kĂ”ik paketid sildiga 0x100, sama sildiga mĂ€rgitakse ka vastused seoses sama ĂŒhendusega.
NĂŒĂŒd saame lisada marsruudireegli:
ip rule add from 1.2.3.0/24 fwmark 0x100 lookup 100See tÀhendab, et kÔik paketid allika aadressiga 1.2.3.0/24 ja sildiga 0x100 peavad olema marsruudiga, kasutades tabelit 100.
SeetÔttu ei jÔua teised paketid, mis saabuvad teisele liidesele, selle reegli alla, mis vÔimaldab neil olla marsruudiga Kubernetes'i standardsete meetoditega.
On veel ĂŒks aga, Linuxis on olemas nn pöördfiltri kontroll, mis rikub kogu sĂŒsteemi ja teeb lihtsa kontrolli: kĂ”ikide sissetulevate paketide jaoks vahetab ta paketil lĂ€hteaadressi saatja aadressiga ja kontrollib, kas pakett vĂ”ib lahkuda sama liidese kaudu, mille kaudu see saadi, kui ei, siis filtreeritakse see vĂ€lja.
Probleem on selles, et meie juhul töötab see ebaĂ”igesti, kuid me saame selle vĂ€lja lĂŒlitada:
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth0.100/rp_filterPange tĂ€hele, et esimene kĂ€sk kontrollib rp_filteri globaalset kĂ€itumist, kui seda ei lĂŒlita vĂ€lja, ei oma teine kĂ€sk mingit mĂ”ju. Sellegipoolest jÀÀvad teised liidesed rp_filteriga sisse lĂŒlitatuks.
Kuna filtri töö hÀirimist vÀltida, saame kasutada rp_filteri rakendust netfilteris. Kasutades rpfilterit iptablesi moodulina, on vÔimalik seada piisavalt paindlikke reegleid, nÀiteks:
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 DROPlĂŒlitab rp_filter'i sisse liidese kohta eth0.100 kĂ”igile aadressidele peale 1.2.3.0/24.
Allikas: habr.com
