
Hiljuti kohtusin ĂŒsna ebatavalise ĂŒlesandega MetalLB marsruutimise seadistamiseks. See ei tohiks olla probleem, sest tavaliselt ei ole MetalLB jaoks vaja mingeid lisameetmeid, kuid meie puhul on tegemist piisavalt suure klastriga, millel on ĂŒsna lihtne vĂ”rgu konfiguratsioon.
Selles artiklis rÀÀgin, kuidas seadistada source-based ja policy-based marsruutimist teie klastrisse suunatud vÀlistesse vÔrkudesse.
Ma ei hakka ĂŒksikasjalikult peatuma MetalLB installimisel ja seadistamisel, kuna eeldan, et teil on juba mingit kogemust. Pakun, et liigume kohe asja juurde, nimelt marsruutimise seadistamisele. Seega on meil neli juhtumit:
Juhtum 1: Kui seadistamine ei ole vajalik
Vaatame lihtsat juhtumit.

Lisaks marsruutimise seadistamine ei ole vajalik, kui MetalLB vÀlja antud aadressid asuvad samas alamvÔrgus kui teie sÔlmede aadressid.
NÀiteks teil on alamvÔrk 192.168.1.0/24, millel 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 see nii on? 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 jaotuse piires olevad aadressid saavad neid kasutada ilma tÀiendavate sammudeta.
Juhtum 2: Kui on vajalik tÀiendav seadistamine

Te peaksite seadistama tÀiendavad marsruudid iga kord, kui teie noodidel ei ole seadistatud IP-aadressid vÔi marsruuti alamvÔrku, mille jaoks MetalLB aadresse vÀljastab.
Selgitan natuke lÀhemalt. Iga kord, kui MetalLB aadressi vÀljastab, sarnaneb see lihtsa mÀÀramisega:
ip addr add 10.9.8.7/32 dev loPange tÀhele:
- a) Aadress mÀÀratakse eelistuks
/32st, et marsruuti alamvĂ”rku selle jaoks automaatselt ei lisandu (see on lihtsalt aadress) - b) Aadress kinnitatakse mistahes noodide liidesele (nĂ€iteks loopback). Siinkohal tasub mainida Linuxi vĂ”rgu stack'i omadust. Pole tĂ€htis, millisele liidesele aadressi lisate, tuum kĂ€sitleb alati arp-pĂ€ringute ja saadab arp-vastuseid mistahes neist, see kĂ€itumine on korrektne ja mida 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_announceSelles olukorras saadetakse arp-vastused ainult siis, kui liides sisaldab selgelt konkreetset IP-aadressi. See seade on kohustuslik, kui plaanite kasutada MetalLB-d ja teie kube-proxy töötab IPVS-reĆŸiimis.
Siiski ei kasuta MetalLB kerne arp-pÀringute töötlemiseks, vaid teeb seda ise kasutajaruumi tasemel. SeetÔttu ei mÔjuta see valik MetalLB tööd.
Naaseme meie ĂŒlesande juurde. Kui teie sĂ”lmedel ei ole vĂ€ljastatavate aadresside 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, kui saate pakette lÀbi eraldi vÀrava, mitte selle, mis on teie vaikimisi seadistatud. SeetÔttu peavad ka vastavad paketid minema lÀbi sama vÀrava.
NÀiteks, teil on sama alamvÔrk 192.168.1.0/24 kasutamiseks teie sÔlmedele, kuid soovite vÀliseid aadresse MetalLB abil vÀljastada. Oletame, et teil on mitu aadressi alamvÔrgus 1.2.3.0/24 VLAN 100, ja soovite neid kasutada Kubernetes teenustele vÀljastamiseks.

Kui pöördute aadressile 1.2.3.4 teete pÀringuid teisest alamvÔrgust kui 1.2.3.0/24 ja oodata vastust. SÔlm, mis hetkel on MetalLB aadressi jaoks meistriks 1.2.3.4, saab paketi ruuterilt 1.2.3.1, kuid vastus peab liikuma sama marsruudi kaudu, lÀbi 1.2.3.1.
Kuna meie sÔlm on juba seadistatud vaikimisi gateway'iks 192.168.1.1, siis vastus saadetakse vaikimisi sinna, mitte 1.2.3.1, lÀbi mille me paketi saime.
Kuidas sellises olukorras toime tulla?
Sellisel juhul peate valmistama kĂ”ik oma sĂ”lmed ette nii, et need oleksid valmis teenindama vĂ€liseid aadresse ilma lisaseadeteta. Nii et ĂŒlaltoodud nĂ€ite puhul 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 siis lisada marsruutide:
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 marsruute lisame eraldi marsruutimistabelisse 100 see sisaldab ainult kahte marsruuti, mis on vajalikud vastupaketi 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 on 1.2.3.0/24, siis tuleb kasutada marsruutimistabelit 100. See on meil juba kirjeldatud marsruut, mis saadab selle lĂ€bi 1.2.3.1
Juhtum 4: Kui on vajalik poliitikapÔhine marsruutimine
VÔrgutopoloogia nagu eelnevas nÀites, kuid oletame, et soovite ka vÔimalust pöörduda vÀlistesse aadressidesse grupist 1.2.3.0/24 teie pod'idest:

Eelis seisneb selles, et pöördudes mis tahes aadressi poole 1.2.3.0/24, jÔuab vastav pakett sÔlme ja sellel on allika aadress vahemikus 1.2.3.0/24 saab see usaldusvÀÀrselt saadetud eth0.100, kuid me soovime, et Kubernetes suunaks selle meie esimesse pod'i, mis algselt saatis pÀringu.
Selle probleemi lahendamine osutus keeruliseks, kuid see sai vÔimalikuks poliitikapÔhise marsruutimise tÀnu:
Protsessi parema mÔistmise nimel toon vÀlja netfilter'i plokkskeemi:

Alustuseks, nagu eelnevas nÀites, loome lisaks marsruuditabeli:
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 iptables'esse 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Ă€rgistavad sisenevad ĂŒhendused liideses eth0.100, tĂ€histades kĂ”iki pakette sildiga 0x100, sama sildiga mĂ€rgistatakse ka vastused ĂŒhe ĂŒhenduse raames.
NĂŒĂŒd saame lisada marsruutimise reegli:
ip rule add from 1.2.3.0/24 fwmark 0x100 lookup 100See tÀhendab, et kÔik paketid, mille allika aadress on 1.2.3.0/24 ja silt 0x100 peavad olema marsruutitud kasutades tabelit 100.
Seega ei kuulu teised paketid, mis saavad teise liidese kaudu, sellele reeglile, mis vÔimaldab neil olla marsruutitud Kubernetes'e tavaliste vahenditega.
On veel ĂŒks aga, Linuxis on olemas nn tagasitee filtrid, mis rikuvad kogu olukorra â nad teevad lihtsa kontrolli: kĂ”ikide sisse tulevate pakettide puhul muudavad nad paketi allika aadressi saatja aadressiks ja kontrollivad, kas pakett saab minna sama liidese kaudu, mille kaudu seda saadi; kui ei, siis filtreeritakse see vĂ€lja.
Probleem on selles, et meie puhul töötab see ebaĂŒhtlaselt, aga me saame selle keelata:
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_filter globaalset kĂ€itumist; kui seda ei keelata, siis teine kĂ€sk ei toimi. Siiski jÀÀvad teised liidesed rp_filteriga sisse lĂŒlitatud.
Kuna mitte piirata filtri tööd tÀielikult, saame kasutada rp_filter'i rakendust netfilter'is. Kasutades rpfilter'it iptables'i moodulina, on vÔimalik seadistada 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ĂŒlitage rp_filter sisse liidesel eth0.100 kĂ”igi aadresse vĂ€lja arvatud 1.2.3.0/24.
Allikas: habr.com
