L2 rejimində MetalLB üçün marşrutun dəqiq tənzimlənməsi

L2 rejimində MetalLB üçün marşrutun dəqiq tənzimlənməsi
Çox keçməmiş MetalLB üçün marşrutlaşdırma qurmaq kimi çox qeyri-adi bir vəzifə ilə üzləşdim. Hər şey yaxşı olardı, çünki... Adətən MetalLB heç bir əlavə hərəkət tələb etmir, lakin bizim vəziyyətimizdə çox sadə şəbəkə konfiqurasiyasına malik kifayət qədər böyük klasterimiz var.

Bu yazıda mən sizə klasterinizin xarici şəbəkəsi üçün mənbəyə əsaslanan və siyasətə əsaslanan marşrutlaşdırmanı necə konfiqurasiya edəcəyinizi söyləyəcəyəm.

MetalLB-nin quraşdırılması və konfiqurasiyası haqqında təfərrüata varmayacağam, çünki güman edirəm ki, sizin artıq müəyyən təcrübəniz var. Mən birbaşa nöqtəyə getməyi, yəni marşrutlaşdırma qurmağı təklif edirəm. Beləliklə, dörd halımız var:

1-ci hal: Heç bir konfiqurasiya tələb olunmadıqda

Gəlin sadə bir işə baxaq.

L2 rejimində MetalLB üçün marşrutun dəqiq tənzimlənməsi

MetalLB tərəfindən verilən ünvanlar qovşaqlarınızın ünvanları ilə eyni alt şəbəkədə olduqda əlavə marşrutlaşdırma konfiqurasiyası tələb olunmur.

Məsələn, sizin alt şəbəkəniz var 192.168.1.0/24, onun marşrutlaşdırıcısı var 192.168.1.1, və qovşaqlarınız ünvanları alır: 192.168.1.10-30, sonra MetalLB üçün diapazonu tənzimləyə bilərsiniz 192.168.1.100-120 və heç bir əlavə konfiqurasiya olmadan işləyəcəklərinə əmin olun.

Niyə belədir? Çünki qovşaqlarınız artıq konfiqurasiya edilmiş marşrutlara malikdir:

# 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

Eyni diapazondan olan ünvanlar heç bir əlavə hərəkət etmədən onlardan yenidən istifadə edəcək.

2-ci hal: Əlavə fərdiləşdirmə tələb olunduqda

L2 rejimində MetalLB üçün marşrutun dəqiq tənzimlənməsi

Qovşaqlarınızın konfiqurasiya edilmiş IP ünvanı və ya MetalLB problemlərinin ünvanlandığı alt şəbəkəyə marşrutu olmadıqda, siz əlavə marşrutları konfiqurasiya etməlisiniz.

Bir az daha ətraflı izah edəcəyəm. MetalLB bir ünvan çıxardıqda, onu sadə tapşırıqla müqayisə etmək olar:

ip addr add 10.9.8.7/32 dev lo

Diqqət edin:

  • a) Ünvan prefikslə təyin olunur /32 yəni marşrut onun üçün avtomatik olaraq alt şəbəkəyə əlavə edilməyəcək (bu, sadəcə bir ünvandır)
  • b) Ünvan istənilən node interfeysinə əlavə olunur (məsələn, geri dönmə). Burada Linux şəbəkə yığınının xüsusiyyətlərini qeyd etmək yerinə düşər. Ünvanı hansı interfeysə əlavə etməyinizdən asılı olmayaraq, nüvə həmişə arp sorğularını emal edəcək və onlardan hər hansı birinə arp cavabları göndərəcək, bu davranış düzgün hesab olunur və üstəlik Kubernetes kimi dinamik mühitdə kifayət qədər geniş istifadə olunur.

Bu davranış, məsələn, ciddi arp-ı aktivləşdirməklə fərdiləşdirilə bilər:

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

Bu halda, arp cavabları yalnız o halda göndəriləcək ki, interfeys açıq şəkildə konkret IP ünvanını ehtiva edir. Əgər siz MetalLB-dən istifadə etməyi planlaşdırırsınızsa və kube-proksi IPVS rejimində işləyirsə, bu parametr tələb olunur.

Bununla belə, MetalLB arp sorğularını emal etmək üçün nüvədən istifadə etmir, lakin bunu istifadəçi məkanında özü edir, ona görə də bu seçim MetalLB-nin işinə təsir etməyəcək.

Gəlin vəzifəmizə qayıdaq. Verilmiş ünvanlar üçün marşrut qovşaqlarınızda yoxdursa, onu əvvəlcədən bütün qovşaqlara əlavə edin:

ip route add 10.9.8.0/24 dev eth1

3-cü hal: Mənbəyə əsaslanan marşrutlaşdırmaya ehtiyacınız olduqda

Paketləri defolt olaraq konfiqurasiya edilmiş deyil, ayrıca şlüz vasitəsilə qəbul edərkən mənbəyə əsaslanan marşrutlaşdırmanı konfiqurasiya etməlisiniz, buna görə də cavab paketləri eyni şlüzdən keçməlidir.

Məsələn, eyni alt şəbəkəniz var 192.168.1.0/24 qovşaqlarınıza həsr olunmuş, lakin siz MetalLB istifadə edərək xarici ünvanlar vermək istəyirsiniz. Tutaq ki, alt şəbəkədən bir neçə ünvanınız var 1.2.3.0/24 VLAN 100-də yerləşir və siz onlardan Kubernetes xidmətlərinə xaricdən daxil olmaq üçün istifadə etmək istəyirsiniz.

L2 rejimində MetalLB üçün marşrutun dəqiq tənzimlənməsi

Əlaqə qurarkən 1.2.3.4 fərqli alt şəbəkədən sorğular edəcəksiniz 1.2.3.0/24 və cavab gözləyin. Hal-hazırda MetalLB tərəfindən verilmiş ünvan üçün master olan qovşaq 1.2.3.4, paketi marşrutlaşdırıcıdan alacaq 1.2.3.1, lakin onun üçün cavab mütləq eyni marşrutdan keçməlidir 1.2.3.1.

Çünki bizim node artıq konfiqurasiya edilmiş standart şlüzə malikdir 192.168.1.1, onda standart olaraq cavab ona deyil, ona gedəcək 1.2.3.1, bunun vasitəsilə paketi aldıq.

Bu vəziyyətin öhdəsindən necə gəlmək olar?

Bu halda, bütün qovşaqlarınızı elə hazırlamalısınız ki, onlar əlavə konfiqurasiya olmadan xarici ünvanlara xidmət göstərməyə hazır olsunlar. Yəni yuxarıdakı nümunə üçün əvvəlcədən node üzərində VLAN interfeysi yaratmalısınız:

ip link add link eth0 name eth0.100 type vlan id 100
ip link set eth0.100 up

Və sonra marşrutlar əlavə edin:

ip route add 1.2.3.0/24 dev eth0.100 table 100
ip route add default via 1.2.3.1 table 100

Nəzərə alın ki, biz marşrutları ayrıca marşrut cədvəlinə əlavə edirik 100 o, şlüz vasitəsilə cavab paketini göndərmək üçün lazım olan yalnız iki marşrutdan ibarət olacaq 1.2.3.1, interfeysin arxasında yerləşir eth0.100.

İndi sadə bir qayda əlavə etməliyik:

ip rule add from 1.2.3.0/24 lookup 100

açıq şəkildə deyir: paketin mənbə ünvanı varsa 1.2.3.0/24, onda siz marşrutlaşdırma cədvəlindən istifadə etməlisiniz 100. Biz artıq onu göndərəcək marşrutu təsvir etdik 1.2.3.1

Case 4: Siyasət əsaslı marşrutlaşdırmaya ehtiyacınız olduqda

Şəbəkə topologiyası əvvəlki nümunədəki kimidir, lakin tutaq ki, siz həm də xarici hovuz ünvanlarına daxil olmaq istəyirsiniz 1.2.3.0/24 çubuqlarınızdan:

L2 rejimində MetalLB üçün marşrutun dəqiq tənzimlənməsi

Xüsusiyyət ondan ibarətdir ki, istənilən ünvana daxil olduqda 1.2.3.0/24, cavab paketi qovşağı vurur və diapazonda mənbə ünvanı var 1.2.3.0/24 itaətlə göndəriləcək eth0.100, lakin biz Kubernetesdən onu orijinal sorğunu yaradan ilk podumuza yönləndirməsini istəyirik.

Bu problemi həll etmək çətin oldu, lakin siyasətə əsaslanan marşrutlaşdırma sayəsində mümkün oldu:

Prosesi daha yaxşı başa düşmək üçün burada netfilter blok diaqramı var:
L2 rejimində MetalLB üçün marşrutun dəqiq tənzimlənməsi

Əvvəlcə əvvəlki nümunədə olduğu kimi əlavə marşrut cədvəli yaradaq:

ip route add 1.2.3.0/24 dev eth0.100 table 100
ip route add default via 1.2.3.1 table 100

İndi iptables-ə bir neçə qayda əlavə edək:

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

Bu qaydalar interfeysə daxil olan əlaqələri qeyd edəcək eth0.100, bütün paketləri etiketlə qeyd edin 0x100, eyni əlaqə daxilində cavablar da eyni etiketlə qeyd olunacaq.

İndi marşrutlaşdırma qaydasını əlavə edə bilərik:

ip rule add from 1.2.3.0/24 fwmark 0x100 lookup 100

Yəni mənbə ünvanı olan bütün paketlər 1.2.3.0/24 və etiketləyin 0x100 cədvəldən istifadə etməklə istiqamətləndirilməlidir 100.

Beləliklə, başqa interfeysdə qəbul edilən digər paketlər bu qaydaya tabe deyil, bu da onları standart Kubernetes alətlərindən istifadə etməklə yönləndirməyə imkan verəcək.

Daha bir şey var, Linux-da hər şeyi korlayan sözdə əks yol filtri var; o, sadə bir yoxlama aparır: bütün daxil olan paketlər üçün paketin mənbə ünvanını göndərən ünvanı ilə dəyişir və yoxlayır. paket qəbul edildiyi eyni interfeysdən gedə bilər, əgər olmasa, onu süzəcək.

Problem ondadır ki, bizim vəziyyətimizdə o, düzgün işləməyəcək, lakin biz onu söndürə bilərik:

echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth0.100/rp_filter

Nəzərə alın ki, birinci əmr rp_filter-in qlobal davranışına nəzarət edir; əgər o, söndürülməyibsə, ikinci əmrin heç bir təsiri olmayacaq. Bununla belə, qalan interfeyslər rp_filter aktiv olaraq qalacaq.

Süzgəcin işini tamamilə məhdudlaşdırmamaq üçün netfilter üçün rp_filter tətbiqindən istifadə edə bilərik. Rpfilterdən iptables modulu kimi istifadə edərək, olduqca çevik qaydaları konfiqurasiya edə bilərsiniz, məsələn:

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

interfeysdə rp_filter aktivləşdirin eth0.100 istisna olmaqla, bütün ünvanlar üçün 1.2.3.0/24.

Mənbə: www.habr.com

Добавить комментарий