ProHoster > Blog > İdarə > Kubernetesdə şəbəkə qurmaq üçün Calico: giriş və bir az təcrübə
Kubernetesdə şəbəkə qurmaq üçün Calico: giriş və bir az təcrübə
Məqalənin məqsədi oxucunu Kubernetes-də şəbəkə qurmağın və şəbəkə siyasətinin idarə edilməsinin əsasları, eləcə də standart imkanları genişləndirən üçüncü tərəf Calico plaginini təqdim etməkdir. Yol boyu, konfiqurasiya asanlığı və bəzi xüsusiyyətlər əməliyyat təcrübəmizdən real nümunələrdən istifadə etməklə nümayiş etdiriləcək.
Bu məqalənin kontekstində qeyd etmək lazımdır ki, K8-in özü konteynerlər və qovşaqlar arasında şəbəkə bağlantısı üçün məsuliyyət daşımır: bunun üçün müxtəlif CNI plaginləri (Konteyner Şəbəkə İnterfeysi). Bu konsepsiya haqqında daha çox mənə də dedilər.
Məsələn, bu plaginlərdən ən çox yayılmışı Flanel — hər qovşaqda körpülər qaldıraraq, ona alt şəbəkə təyin etməklə bütün klaster qovşaqları arasında tam şəbəkə bağlantısını təmin edir. Bununla belə, tam və tənzimlənməmiş əlçatanlıq həmişə faydalı olmur. Klasterdə bir növ minimal izolyasiya təmin etmək üçün təhlükəsizlik duvarının konfiqurasiyasına müdaxilə etmək lazımdır. Ümumi halda, o, eyni CNI-nin nəzarəti altında yerləşdirilir, buna görə də iptables-ə hər hansı üçüncü tərəf müdaxilələri səhv şərh edilə bilər və ya ümumiyyətlə nəzərə alınmır.
Kubernetes klasterində şəbəkə siyasətinin idarə edilməsini təşkil etmək üçün "qutudan kənar" təmin edilir NetworkPolicy API. Seçilmiş ad məkanları üzərində paylanmış bu resurs bir tətbiqdən digərinə girişi fərqləndirmək üçün qaydalar ehtiva edə bilər. O, həmçinin xüsusi podlar, mühitlər (ad boşluqları) və ya IP ünvan blokları arasında əlçatanlığı konfiqurasiya etməyə imkan verir:
Bu, ən primitiv nümunə deyil rəsmi sənədlər şəbəkə siyasətlərinin necə işlədiyinin məntiqini anlamaq istəyini birdəfəlik azalda bilər. Bununla belə, biz yenə də şəbəkə siyasətlərindən istifadə edərək trafik axınlarının işlənməsinin əsas prinsiplərini və üsullarını anlamağa çalışacağıq...
Məntiqlidir ki, 2 növ trafik var: poda daxil olmaq (Giriş) və ondan çıxan (Egress).
Əslində siyasət hərəkət istiqamətinə görə bu 2 kateqoriyaya bölünür.
Növbəti tələb olunan atribut seçicidir; qaydanın tətbiq olunduğu şəxs. Bu, pod (və ya bir qrup pod) və ya mühit (yəni ad sahəsi) ola bilər. Vacib bir detal: bu obyektlərin hər iki növü etiketdən ibarət olmalıdır (etiket Kubernetes terminologiyasında) - siyasətçilərin işlədikləri bunlardır.
Bir növ etiketlə birləşdirilən məhdud sayda seçicilərə əlavə olaraq, müxtəlif variasiyalarda “Hər şeyə/hər kəsə icazə ver/inkar et” kimi qaydaları yazmaq mümkündür. Bu məqsədlə formanın konstruksiyalarından istifadə olunur:
Bir klaster üçün CNI plagininin seçiminə qayıdaraq, qeyd etmək lazımdır hər şəbəkə plagini NetworkPolicy-ni dəstəkləmir. Məsələn, artıq qeyd olunan Flanel şəbəkə siyasətini necə konfiqurasiya edəcəyini bilmir birbaşa deyilir rəsmi depoda. Orada bir alternativ də qeyd olunur - Açıq Mənbə layihəsi kolenkor, bu, şəbəkə siyasətləri baxımından Kubernetes API-lərinin standart dəstini əhəmiyyətli dərəcədə genişləndirir.
Calico ilə tanış olmaq: nəzəriyyə
Calico plagini Flannel ilə inteqrasiyada istifadə edilə bilər (alt layihə Kanal) və ya müstəqil olaraq həm şəbəkə bağlantısı, həm də əlçatanlığın idarə edilməsi imkanlarını əhatə edir.
K8s "qutulu" həlli və Calico-dan API dəsti istifadə edərək hansı imkanları təmin edir?
NetworkPolicy-də qurulan budur:
siyasətçilər ətraf mühitlə məhdudlaşır;
siyasətlər etiketlərlə işarələnmiş podlara tətbiq edilir;
qaydalar podlara, mühitlərə və ya alt şəbəkələrə tətbiq edilə bilər;
qaydalar protokolları, adlandırılmış və ya simvolik port spesifikasiyalarını ehtiva edə bilər.
Calico bu funksiyaları necə genişləndirir:
siyasətlər istənilən obyektə tətbiq oluna bilər: pod, konteyner, virtual maşın və ya interfeys;
qaydalar müəyyən bir hərəkəti ehtiva edə bilər (qadağa, icazə, giriş);
hədəf və ya qaydaların mənbəyi port, bir sıra portlar, protokollar, HTTP və ya ICMP atributları, IP və ya alt şəbəkə (4-cü və ya 6-cı nəsil), istənilən seçicilər (qovşaqlar, hostlar, mühitlər) ola bilər;
Əlavə olaraq, siz DNAT parametrləri və trafik yönləndirmə siyasətlərindən istifadə edərək trafikin keçidini tənzimləyə bilərsiniz.
Calico deposunda GitHub-da ilk öhdəliklər 2016-cı ilin iyul ayına təsadüf edir və bir il sonra layihə Kubernetes şəbəkə bağlantısının təşkilində aparıcı mövqe tutdu - bunu, məsələn, sorğunun nəticələri sübut edir, The New Stack tərəfindən aparılır:
K8-lər ilə bir çox böyük idarə olunan həllər, məsələn Amazon EKS, Azure AKS, Google GKE və başqaları istifadə üçün tövsiyə etməyə başladılar.
Performansa gəlincə, burada hər şey əladır. Məhsullarını sınaqdan keçirərkən, Calico inkişaf komandası saniyədə 50000 konteyner yaratma sürəti ilə 500 fiziki qovşaqda 20-dən çox konteyner işlədən astronomik performans nümayiş etdirdi. Ölçmə ilə bağlı heç bir problem müəyyən edilmədi. Belə nəticələr elan edildi artıq birinci versiyanın elanında. Ötürmə qabiliyyətinə və resurs istehlakına yönəlmiş müstəqil tədqiqatlar da Calico-nun performansının Flannel-inki qədər yaxşı olduğunu təsdiqləyir. Məsələn:
Layihə çox sürətlə inkişaf edir, K8s, OpenShift, OpenStack tərəfindən idarə olunan məşhur həllərdə işləməyi dəstəkləyir, klasteri yerləşdirərkən Calico-dan istifadə etmək mümkündür. qəpik, Service Mesh şəbəkələrinin qurulmasına istinadlar var (burada bir nümunə var Istio ilə birlikdə istifadə olunur).
Calico ilə məşq edin
Vanil Kubernetes istifadəsinin ümumi vəziyyətində, CNI-nin quraşdırılması fayldan istifadə etməyə gəlir calico.yaml, rəsmi saytından endirilib, istifadə edərək kubectl apply -f.
Bir qayda olaraq, plaqinin cari versiyası Kubernetes-in ən son 2-3 versiyasına uyğun gəlir: köhnə versiyalarda işləmə sınaqdan keçirilmir və zəmanət verilmir. Tərtibatçıların fikrincə, Calico iptables və ya IPVS-in üstündə CentOS 3.10, Ubuntu 7 və ya Debian 16 ilə işləyən 8-dan yuxarı Linux nüvələrində işləyir.
Ətraf mühitdə izolyasiya
Ümumi başa düşmək üçün Calico notasiyasındakı şəbəkə siyasətlərinin standartlardan necə fərqləndiyini və qaydaların yaradılmasına yanaşmanın onların oxunaqlılığını və konfiqurasiya çevikliyini necə asanlaşdırdığını başa düşmək üçün sadə bir vəziyyətə baxaq:
Klasterdə yerləşdirilmiş 2 veb proqram var: Node.js və PHP-də, onlardan biri Redis-dən istifadə edir. Node.js ilə əlaqə saxlamaqla PHP-dən Redis-ə girişi bloklamaq üçün aşağıdakı siyasəti tətbiq etmək kifayətdir:
Əslində biz Node.js-dən Redis portuna gələn trafikə icazə verdik. Və açıq şəkildə başqa heç nəyi qadağan etmədilər. NetworkPolicy görünən kimi, başqa cür göstərilmədiyi təqdirdə, orada qeyd olunan bütün seçicilər təcrid olunmağa başlayır. Bununla belə, izolyasiya qaydaları selektorun əhatə etmədiyi digər obyektlərə şamil edilmir.
Nümunə istifadə edir apiVersion Kubernetes qutudan çıxdı, lakin heç bir şey istifadə etməyinizə mane olmur Calico çatdırılmasından eyni adlı resurs. Oradakı sintaksis daha təfərrüatlıdır, ona görə də yuxarıdakı hal üçün qaydanı aşağıdakı formada yenidən yazmalısınız:
Adi NetworkPolicy API vasitəsilə bütün trafikə icazə vermək və ya rədd etmək üçün yuxarıda qeyd olunan konstruksiyalar başa düşmək və yadda saxlamaq çətin olan mötərizəli konstruksiyaları ehtiva edir. Calico vəziyyətində, bir firewall qaydasının məntiqini əksinə dəyişdirmək üçün sadəcə dəyişdirin action: Allow haqqında action: Deny.
Ətraf mühitə görə izolyasiya
İndi tətbiqin Prometheus-da toplanması və Grafana-dan istifadə edərək sonrakı təhlil üçün biznes ölçülərini yaratdığı bir vəziyyəti təsəvvür edin. Yükləmədə defolt olaraq yenidən ictimaiyyət üçün görünən həssas data ola bilər. Gəlin bu məlumatları maraqlı gözlərdən gizlədək:
Prometey, bir qayda olaraq, ayrı bir xidmət mühitində yerləşdirilir - nümunədə bu, belə bir ad sahəsi olacaqdır:
Sahə metadata.labels bunun təsadüf olmadığı ortaya çıxdı. Yuxarıda qeyd edildiyi kimi, namespaceSelector (eləcə də podSelector) etiketlərlə işləyir. Buna görə də, müəyyən bir portdakı bütün podlardan ölçülərin götürülməsinə icazə vermək üçün bir növ etiket əlavə etməli (və ya mövcud olanlardan götürməli) və sonra belə bir konfiqurasiya tətbiq etməlisiniz:
Ümumiyyətlə, xüsusi ehtiyaclar üçün bu cür siyasətləri əlavə etməklə siz klasterdəki proqramların işinə zərərli və ya təsadüfi müdaxilədən qoruya bilərsiniz.
Calico yaradıcılarının fikrincə, ən yaxşı təcrübə “Hər şeyi bloklayın və sizə lazım olanı açıq şəkildə açın” yanaşmasıdır. rəsmi sənədlər (digərləri oxşar yanaşmaya əməl edirlər - xüsusən də artıq qeyd olunan məqalə).
Əlavə Calico Obyektlərindən istifadə
Nəzərinizə çatdırım ki, Calico API-lərinin genişləndirilmiş dəsti vasitəsilə siz qovşaqlarla məhdudlaşmayaraq, qovşaqların mövcudluğunu tənzimləyə bilərsiniz. Aşağıdakı nümunədə istifadə edərək GlobalNetworkPolicy klasterdə ICMP sorğularını ötürmək imkanı bağlanır (məsələn, poddan qovşağa, podlar arasında və ya qovşaqdan IP poduna pinglər):
Yuxarıdakı vəziyyətdə, klaster qovşaqlarının ICMP vasitəsilə bir-birinə “çatması” hələ də mümkündür. Və bu məsələ vasitələrlə həll olunur GlobalNetworkPolicy, müəssisəyə tətbiq edilir HostEndpoint:
Nəhayət, standart siyasət dəsti kifayət etmədikdə, klasterə yaxın qarşılıqlı əlaqə üçün Calico funksiyalarından istifadənin çox real nümunəsini verəcəyəm. Veb tətbiqinə daxil olmaq üçün müştərilər VPN tunelindən istifadə edirlər və bu giriş ciddi şəkildə idarə olunur və istifadəyə icazə verilən xidmətlərin xüsusi siyahısı ilə məhdudlaşır:
Müştərilər standart UDP portu 1194 vasitəsilə VPN-ə qoşulur və qoşulduqda podların və xidmətlərin klaster alt şəbəkələrinə marşrutlar alırlar. Yenidən başlatma və ünvan dəyişiklikləri zamanı xidmətləri itirməmək üçün bütün alt şəbəkələr itələnir.
Konfiqurasiyadakı port standartdır, bu, tətbiqin konfiqurasiyası və Kubernetes klasterinə ötürülməsi prosesinə bəzi nüanslar qoyur. Məsələn, UDP üçün eyni AWS LoadBalancer sözün həqiqi mənasında keçən ilin sonunda məhdud bölgələr siyahısında ortaya çıxdı və NodePort bütün klaster qovşaqlarında yönləndirilməsi səbəbindən istifadə edilə bilməz və server nümunələrinin sayını miqyaslaşdırmaq mümkün deyil. səhvlərə dözümlülük məqsədləri. Üstəlik, standart port diapazonunu dəyişməli olacaqsınız...
Mümkün həllərin axtarışı nəticəsində aşağıdakılar seçildi:
VPN ilə podlar hər bir node üçün planlaşdırılıb hostNetwork, yəni faktiki IP-yə.
Xidmət vasitəsilə kənarda yerləşdirilir ClusterIP. Kiçik rezervasiyalarla xaricdən əldə edilə bilən (həqiqi IP ünvanının şərti olması) qovşaqda fiziki olaraq bir port quraşdırılmışdır.
Pod gülünün hansı düyünün müəyyən edilməsi hekayəmizin əhatə dairəsindən kənardadır. Sadəcə deyəcəyəm ki, xidməti bir qovşaqda möhkəm "mixlaya" və ya VPN xidmətinin cari IP ünvanını izləyəcək və müştərilərlə qeydiyyatdan keçmiş DNS qeydlərini redaktə edəcək kiçik bir yan xidmət yaza bilərsiniz - kimin kifayət qədər təsəvvürü varsa.
Marşrutlaşdırma nöqteyi-nəzərindən biz VPN müştərisini VPN serveri tərəfindən verilmiş IP ünvanı ilə unikal şəkildə müəyyən edə bilərik. Aşağıda yuxarıda qeyd olunan Redis-də təsvir edilmiş belə bir müştərinin xidmətlərə çıxışını məhdudlaşdıran primitiv nümunə verilmişdir:
Burada 6379 portuna qoşulmaq qəti qadağandır, lakin eyni zamanda qaydaları tərtib edərkən işləməsi çox vaxt əziyyət çəkən DNS xidmətinin fəaliyyəti qorunur. Çünki, əvvəl qeyd edildiyi kimi, seçici görünəndə, başqa cür göstərilmədiyi təqdirdə, defolt inkar siyasəti ona tətbiq edilir.
Nəticələri
Beləliklə, Calico-nun təkmil API-dən istifadə edərək, siz klasterdə və ətrafında marşrutlaşdırmanı çevik şəkildə konfiqurasiya edə və dinamik şəkildə dəyişə bilərsiniz. Ümumiyyətlə, onun istifadəsi topla sərçələri vurmaq kimi görünə bilər və BGP və IP-IP tunelləri ilə L3 şəbəkəsinin həyata keçirilməsi düz şəbəkədə sadə Kubernetes quraşdırmasında dəhşətli görünür... Lakin, əks halda alət kifayət qədər səmərəli və faydalı görünür. .
Təhlükəsizlik tələblərinə cavab vermək üçün klasteri təcrid etmək həmişə mümkün olmaya bilər və burada Calico (və ya oxşar həll) xilasetmə üçün gəlir. Bu məqalədə verilən nümunələr (kiçik dəyişikliklərlə) müştərilərimizin AWS-də bir neçə quraşdırmasında istifadə olunur.