በ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 ጥሩ ማስተካከያ

የእርስዎ አንጓዎች የተዋቀረ አይ ፒ አድራሻ ወይም MetalLB አድራሻ ወደሚያወጣበት ንኡስ ኔት የሚወስድ መንገድ በሌሉት ቁጥር ተጨማሪ መንገዶችን ማዋቀር አለቦት።

በጥቂቱ በዝርዝር እገልጻለሁ። MetalLB አድራሻ ባወጣ ቁጥር፣ ከእንደዚህ አይነት ቀላል ስራ ጋር ሊወዳደር ይችላል።

ip addr add 10.9.8.7/32 dev lo

ትኩረት ይስጡ ለ፡-

  • a) አድራሻው ከቅድመ ቅጥያ ጋር ተመድቧል /32 ማለትም፣ አንድ መንገድ ለእሱ ወደ ንኡስ አውታረ መረብ በቀጥታ አይታከልም (አድራሻ ብቻ ነው)
  • b) አድራሻው ከማንኛውም መስቀለኛ መንገድ ጋር ተያይዟል (ለምሳሌ loopback)። እዚህ ላይ የሊኑክስ ኔትወርክ ቁልል ባህሪያትን መጥቀስ ተገቢ ነው. አድራሻውን የትኛውም በይነገጽ ቢያክሉ፣ ከርነሉ ሁልጊዜ የአርፕ ጥያቄዎችን ያስኬዳል እና ለአንዳቸውም የአርፕ ምላሾችን ይልካል፣ ይህ ባህሪ ትክክል ነው ተብሎ ይታሰባል እና በተጨማሪም እንደ Kubernetes ባሉ ተለዋዋጭ አካባቢዎች ውስጥ በሰፊው ጥቅም ላይ ይውላል።

ይህ ባህሪ ሊበጅ ይችላል፣ ለምሳሌ ጥብቅ አርፕን በማንቃት፡-

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

በዚህ አጋጣሚ የአርፕ ምላሾች የሚላኩት በይነገጹ የተወሰነ አይፒ አድራሻን በግልፅ ከያዘ ብቻ ነው። MetalLB ለመጠቀም ካቀዱ እና የእርስዎ kube-proxy በIPVS ሁነታ የሚሰራ ከሆነ ይህ ቅንብር ያስፈልጋል።

ነገር ግን MetalLB የአርፕ ጥያቄዎችን ለማስኬድ ከርነሉን አይጠቀምም፣ ነገር ግን እራሱን በተጠቃሚ ቦታ ላይ ነው የሚሰራው፣ ስለዚህ ይህ አማራጭ የ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 ውስጥ የሚገኙ እና የኩበርኔትስ አገልግሎቶችን በውጪ ለማግኘት ሊጠቀሙባቸው ይፈልጋሉ።

በ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ነገር ግን ኩበርኔትስ ወደ መጀመሪያው ፖድ እንዲያዞረው እንፈልጋለን፣ ይህም የመጀመሪያውን ጥያቄ ያመነጨ ነው።

ይህንን ችግር መፍታት ከባድ ሆኖ ተገኝቷል፣ ነገር ግን በፖሊሲ ላይ ለተመሰረተ ማዘዋወር ምስጋና ይግባው ሆነ፡

የሂደቱን የተሻለ ግንዛቤ ለማግኘት፣ የnetfilter block ዲያግራም እዚህ አለ፡-
በ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 እንደነቃ ሌሎች በይነገጾች ይቆያሉ።

የማጣሪያውን አሠራር ሙሉ በሙሉ ላለመገደብ, የ rp_filter ትግበራን ለ netfilter መጠቀም እንችላለን. 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.

ምንጭ: hab.com

አስተያየት ያክሉ