Kubernetes-də bir pod necə IP ünvanı alır

Qeyd. tərcümə.: LinkedIn-də SRE mühəndisi tərəfindən yazılmış bu məqalə Kubernetesdəki "daxili sehr" - daha dəqiq desək, CRI, CNI və kube-apiserverin qarşılıqlı əlaqəsi - növbəti pod-a IP ünvanı təyin edilməli olduqda nə baş verdiyini təfərrüatlandırır.

Əsas tələblərdən biri Kubernetes şəbəkə modeli odur ki, hər bir podun öz IP ünvanı olmalıdır və klasterdəki hər hansı digər pod həmin ünvanda onunla əlaqə saxlaya bilməlidir. Bu şəbəkə modelini həyata keçirməyə kömək edən bir çox şəbəkə "provayderləri" (Flannel, Calico, Canal və s.) mövcuddur.

Kubernetes ilə ilk dəfə işləməyə başlayanda podların IP ünvanlarını necə əldə etdiyi mənə tam aydın deyildi. Ayrı-ayrı komponentlərin necə fəaliyyət göstərdiyini başa düşməklə belə, onların birlikdə işlədiyini təsəvvür etmək çətin idi. Məsələn, mən CNI plaginlərinin nə üçün olduğunu bilirdim, lakin onların tam olaraq necə adlandırıldığını bilmirdim. Buna görə də, müxtəlif şəbəkə komponentləri və onların Kubernetes klasterində necə birlikdə işləməsi haqqında bilikləri bölüşmək üçün bu məqaləni yazmaq qərarına gəldim ki, bu da hər bir podun özünəməxsus IP ünvanını əldə etməyə imkan verir.

Kubernetes-də şəbəkəni təşkil etməyin müxtəlif yolları var - eynilə konteynerlər üçün müxtəlif iş vaxtı seçimləri kimi. Bu yazı istifadə edəcək Flanel klasterdə şəbəkə qurmaq üçün və icra edilə bilən mühit kimi - Konteyner. Mən də güman edirəm ki, siz konteynerlər arasında şəbəkələşmənin necə işlədiyini bilirsiniz, ona görə də sırf kontekst üçün ona qısaca toxunacağam.

Bəzi əsas anlayışlar

Bir baxışda konteynerlər və şəbəkə

İnternetdə konteynerlərin şəbəkə üzərindən bir-biri ilə necə əlaqə saxladığını izah edən bir neçə əla yazı var. Buna görə də, mən yalnız əsas anlayışlar haqqında ümumi məlumat verəcəyəm və özümü Linux körpüsü yaratmaq və paketləri əhatə edən bir yanaşma ilə məhdudlaşdıracağam. Konteyner şəbəkəsi mövzusunun özü ayrıca məqaləyə layiq olduğundan təfərrüatlar buraxılmışdır. Bəzi xüsusilə məlumatlandırıcı və məlumatlandırıcı nəşrlərə keçidlər aşağıda təqdim olunacaq.

Eyni hostda konteynerlər

Eyni hostda işləyən konteynerlər arasında IP ünvanı əlaqəsini təşkil etməyin bir yolu Linux körpüsünün yaradılmasını nəzərdə tutur. Bunun üçün Kubernetes (və Docker) virtual cihazlar yaradır veth (virtual ethernet). Veth cihazının bir ucu konteynerin şəbəkə ad sahəsinə, digər ucu isə bağlanır Linux körpüsü host şəbəkəsində.

Eyni hostda olan bütün konteynerlər bir-biri ilə IP ünvanları ilə əlaqə saxlaya bildikləri körpüyə qoşulmuş bir veth ucuna malikdir. Linux körpüsü də bir IP ünvanına malikdir və digər qovşaqlar üçün nəzərdə tutulmuş podlardan gedən (çıxış) trafik üçün şlüz rolunu oynayır.

Kubernetes-də bir pod necə IP ünvanı alır

Müxtəlif hostlarda konteynerlər

Paket inkapsulyasiyası müxtəlif hostlardakı konteynerlərin IP ünvanlarından istifadə edərək bir-biri ilə əlaqə saxlamasının bir yoludur. Flannel-də bunu mümkün edən texnologiyadır. vxlan, mənbə paketini UDP paketinə "paketləyir" və sonra onu təyinat yerinə göndərir.

Kubernetes klasterində Flannel vxlan cihazı yaradır və müvafiq olaraq hər node üzrə marşrut cədvəlini yeniləyir. Başqa bir hostda konteyner üçün nəzərdə tutulmuş hər bir paket vxlan cihazından keçir və UDP paketinə daxil edilir. Təyinat yerində, yuvalanmış paket götürülür və düzgün poda yönləndirilir.

Kubernetes-də bir pod necə IP ünvanı alır
Qeyd: Bu, konteynerlər arasında şəbəkə qurmağın yollarından yalnız biridir.

CRI nədir?

CRI (Container Runtime Interface) kubelet-ə müxtəlif konteyner işləmə vaxtlarından istifadə etməyə imkan verən bir plagindir. CRI API müxtəlif iş vaxtlarına quraşdırılmışdır ki, istifadəçilər istədikləri iş vaxtını seçə bilsinlər.

CNI nədir?

CNI layihəsi birdir spesifikasiya Linux konteynerləri üçün universal şəbəkə həllini təşkil etmək. Bundan əlavə, daxildir plaginlərpod şəbəkəsini qurarkən müxtəlif funksiyalara cavabdeh olan . CNI plaqini spesifikasiyaya uyğun icra olunan proqramdır (aşağıda bəzi plaginləri müzakirə edəcəyik).

Podlara IP ünvanlarını təyin etmək üçün alt şəbəkə hostları

Klasterdəki hər bir podun bir IP ünvanı olmalıdır, bu ünvanın unikal olduğuna əmin olmaq vacibdir. Bu, hər bir qovşaq üçün unikal alt şəbəkə təyin etməklə əldə edilir, bundan sonra həmin qovşaqdakı podlara IP ünvanları təyin edilir.

Node IPAM Controller

Zaman nodeipam bayraq parametri kimi keçdi --controllers kube-nəzarətçi-menecer, o, hər bir node üçün CIDR klasterindən (yəni, klaster şəbəkəsi üçün IP ünvanlarının diapazonu) ayrıca alt şəbəkə (podCIDR) ayırır. Bu podCIDR-lər üst-üstə düşmədiyi üçün hər bir pod üçün unikal IP ünvanı təyin etmək mümkün olur.

Kubernetes nodu klasterdə ilk dəfə qeydiyyatdan keçəndə podCIDR təyin olunur. Qovşaqların podCIDR-ni dəyişdirmək üçün siz onların qeydiyyatını ləğv etməli və sonra aralarındakı Kubernetes nəzarət qatının konfiqurasiyasına müvafiq dəyişikliklər etməklə onları yenidən qeydiyyatdan keçirməlisiniz. Aşağıdakı əmrlə qovşağın podCIDR-ini göstərə bilərsiniz:

$ kubectl get no <nodeName> -o json | jq '.spec.podCIDR'
10.244.0.0/24

Kubelet, konteyner işləmə vaxtı və CNI plaginləri: hamısı necə işləyir

Bir node üçün bir pod planlaşdırmaq bir çox hazırlıq işlərini əhatə edir. Bu bölmədə mən yalnız pod şəbəkəsinin qurulması ilə birbaşa əlaqəli olanlara diqqət yetirəcəyəm.

Bir qovşaq üçün bir qovşaq planlaşdırmaq aşağıdakı hadisələr zəncirini tetikler:

Kubernetes-də bir pod necə IP ünvanı alır

Kömək: Konteyner CRI Plugin Arxitekturası.

Konteyner işləmə vaxtı və CNI plaginləri arasında qarşılıqlı əlaqə

Hər bir şəbəkə provayderinin öz CNI plagini var. Konteynerin işləmə vaxtı onu işə saldıqda pod üçün şəbəkəni konfiqurasiya etmək üçün onu işə salır. Konteyner vəziyyətində, CNI plagini plagin tərəfindən işə salınır Konteyner C.R.I..

Üstəlik, hər bir provayderin öz agenti var. O, bütün Kubernetes qovşaqlarında quraşdırılıb və podların şəbəkə konfiqurasiyasına cavabdehdir. Bu agent ya CNI konfiqurasiyası ilə birlikdə gəlir və ya onu qovşaqda özü yaradır. Konfiqurasiya CRI plagininə hansı CNI plaqini çağıracağını müəyyən etməyə kömək edir.

CNI konfiqurasiyasının yeri konfiqurasiya edilə bilər; default olaraq içəridədir /etc/cni/net.d/<config-file>. Klaster administratorları həmçinin hər bir klaster nodeunda CNI plaginlərinin quraşdırılmasına cavabdehdirlər. Onların yeri də konfiqurasiya edilə bilər; standart kataloq - /opt/cni/bin.

Konteynerdən istifadə edərkən, bölmədə konfiqurasiya və plagin ikili faylları üçün yollar təyin edilə bilər [plugins.«io.containerd.grpc.v1.cri».cni] в konteyner konfiqurasiya faylı.

Şəbəkə provayderimiz kimi Flannel-dən istifadə etdiyimiz üçün onun qurulması haqqında bir az danışaq:

  • Flaneld (Flanelin demonu) adətən klasterə DaemonSet kimi quraşdırılır. install-cni kimi başlanğıc konteyner.
  • Install-cni yaradır CNI konfiqurasiya faylı (/etc/cni/net.d/10-flannel.conflist) hər qovşaqda.
  • Flanneld vxlan cihazı yaradır, API serverindən şəbəkə metadatasını alır və pod yeniləmələrinə nəzarət edir. Onlar yaradıldıqca, o, marşrutları klaster üzrə bütün podlara yayır.
  • Bu marşrutlar podların bir-biri ilə IP ünvanları ilə əlaqə saxlamasına imkan verir.

Flanelin işi haqqında daha ətraflı məlumat üçün məqalənin sonundakı bağlantılardan istifadə etməyi məsləhət görürəm.

Containerd CRI plagini ilə CNI plaginləri arasında qarşılıqlı əlaqə diaqramı budur:

Kubernetes-də bir pod necə IP ünvanı alır

Yuxarıda göründüyü kimi, kubelet podun şəbəkəsini qurmaq üçün artıq CNI plaginini çağıran pod yaratmaq üçün Containerd CRI plaginini çağırır. Bu halda, şəbəkə provayderinin CNI plagini şəbəkənin müxtəlif aspektlərini konfiqurasiya etmək üçün digər əsas CNI plaginlərini çağırır.

CNI plaginləri arasında qarşılıqlı əlaqə

Müxtəlif CNI plaginləri var, onların vəzifəsi hostda konteynerlər arasında şəbəkə əlaqəsini qurmağa kömək etməkdir. Bu məqalə onlardan üçünü müzakirə edəcək.

Flanel CNI plagini

Şəbəkə provayderi kimi Flannel istifadə edərkən, Containerd CRI komponenti çağırır Flanel CNI plagini, CNI konfiqurasiya faylından istifadə edərək /etc/cni/net.d/10-flannel.conflist.

$ cat /etc/cni/net.d/10-flannel.conflist
{
  "name": "cni0",
  "plugins": [
    {
      "type": "flannel",
      "delegate": {
         "ipMasq": false,
        "hairpinMode": true,
        "isDefaultGateway": true
      }
    }
  ]
}

Flannel CNI plagini Flanneld ilə birlikdə işləyir. Başlanğıc zamanı Flanneld podCIDR və digər şəbəkə ilə bağlı təfərrüatları API serverindən alır və onları faylda saxlayır. /run/flannel/subnet.env.

FLANNEL_NETWORK=10.244.0.0/16 
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450 
FLANNEL_IPMASQ=false

Flannel CNI plagini məlumatlardan istifadə edir /run/flannel/subnet.env körpü CNI plaginini konfiqurasiya etmək və çağırmaq üçün.

Bridge CNI Plugin

Bu plagin aşağıdakı konfiqurasiya ilə çağırılır:

{
  "name": "cni0",
  "type": "bridge",
  "mtu": 1450,
  "ipMasq": false,
  "isGateway": true,
  "ipam": {
    "type": "host-local",
    "subnet": "10.244.0.0/24"
  }
}

İlk dəfə çağırıldığında, o, ilə Linux körpüsü yaradır «name»: «cni0», konfiqurasiyada göstərilmişdir. Sonra hər pod üçün bir veth cütü yaradılır. Bir ucu konteynerin şəbəkə ad sahəsinə, digər ucu isə hostun şəbəkəsindəki Linux körpüsünə qoşulur. Bridge CNI Plugin bütün host konteynerlərini host şəbəkəsindəki Linux körpüsünə birləşdirir.

Veth cütü konfiqurasiya edildikdə, Bridge plagini host-yerli IPAM CNI plaginini çağırır. IPAM plagin növü CRI plagininin Flannel CNI plagininə zəng etmək üçün istifadə etdiyi CNI konfiqurasiyasında konfiqurasiya edilə bilər.

Host-Yerli IPAM CNI Pluginləri

Bridge CNI zəngləri host-yerli IPAM CNI plagini aşağıdakı konfiqurasiya ilə:

{
  "name": "cni0",
  "ipam": {
    "type": "host-local",
    "subnet": "10.244.0.0/24",
    "dataDir": "/var/lib/cni/networks"
  }
}

Host-yerli IPAM plagini (IP Address Management - IP ünvanının idarə edilməsi) alt şəbəkədən konteyner üçün IP ünvanını qaytarır və ayrılmış IP-ni bölmədə göstərilən kataloqda hostda saxlayır dataDir - /var/lib/cni/networks/<network-name=cni0>/<ip>. Bu fayl verilmiş IP ünvanının təyin olunduğu konteynerin ID-sini ehtiva edir.

Host-yerli IPAM plagininə zəng edərkən o, aşağıdakı məlumatları qaytarır:

{
  "ip4": {
    "ip": "10.244.4.2",
    "gateway": "10.244.4.3"
  },
  "dns": {}
}

Xülasə

Kube-nəzarətçi-meneceri hər bir node üçün podCIDR təyin edir. Hər bir qovşağın podları ayrılmış podCIDR diapazonundakı ünvan məkanından IP ünvanları alır. Düyünlərin podCIDR-ləri üst-üstə düşmədiyi üçün bütün podlar unikal IP ünvanları əldə edir.

Kubernetes klaster inzibatçısı kubeleti, konteynerin işləmə müddətini, şəbəkə provayderi agentini konfiqurasiya edir və quraşdırır və CNI plaginlərini hər bir node-a kopyalayır. Başlanğıc zamanı şəbəkə provayderi agenti CNI konfiqurasiyasını yaradır. Pod bir qovşaq üçün planlaşdırıldıqda, kubelet onu yaratmaq üçün CRI plaginini çağırır. Sonra, konteyner istifadə edilərsə, Containerd CRI plagini pod şəbəkəsini qurmaq üçün CNI konfiqurasiyasında göstərilən CNI plaqini çağırır. Nəticədə pod bir IP ünvanı alır.

Bütün bu qarşılıqlı əlaqənin bütün incəliklərini və nüanslarını başa düşmək mənə bir qədər vaxt apardı. Ümid edirəm ki, əldə edilmiş təcrübə Kubernetesin necə işlədiyini daha yaxşı başa düşməyə kömək edəcək. Hər hansı bir şeydə səhvim varsa, mənimlə əlaqə saxlayın Twitter və ya ünvanda [e-poçt qorunur]. Bu məqalənin aspektlərini və ya başqa bir şeyi müzakirə etmək istəyirsinizsə, çekinmeyin. Sizinlə söhbət etməkdən məmnun olaram!

References

Konteynerlər və şəbəkə

Flanel necə işləyir

CRI və CNI

Tərcüməçidən PS

Bloqumuzda da oxuyun:

Mənbə: www.habr.com

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