Kubernetes podasi IP manzilini qanday oladi?

Eslatma. tarjima.: LinkedIn’dan SRE muhandisi tomonidan yozilgan ushbu maqola Kubernetesdagi ichki sehr haqida batafsil ma’lumot beradi – aniqrog‘i, CRI, CNI va kube-apiserverning o‘zaro ta’siri – bu keyingi podka IP-manzil tayinlanishi kerak bo‘lganda sodir bo‘ladi.

Asosiy talablardan biri Kubernetes tarmoq modeli shundan iboratki, har bir pod o‘z IP-manziliga ega bo‘lishi va klasterdagi boshqa har qanday pod u bilan shu manzilda bog‘lana olishi kerak. Ushbu tarmoq modelini amalga oshirishga yordam beradigan ko'plab tarmoq "provayderlari" (Flannel, Calico, Canal va boshqalar) mavjud.

Men birinchi marta Kubernetes bilan ishlashni boshlaganimda, podlar o'zlarining IP manzillarini qanday olishlari menga to'liq tushunarsiz edi. Alohida komponentlar qanday ishlashini tushunish bilan ham, ularning birgalikda ishlashini tasavvur qilish qiyin edi. Misol uchun, men CNI plaginlari nimaga mo'ljallanganligini bilardim, lekin ular qanday nomlanishini bilmasdim. Shuning uchun men ushbu maqolani turli tarmoq komponentlari va ularning Kubernetes klasterida qanday birgalikda ishlashi haqida bilim almashish uchun yozishga qaror qildim, bu esa har bir podkastga o'ziga xos IP manzilini olish imkonini beradi.

Kubernetes-da tarmoqni tashkil qilishning turli usullari mavjud, xuddi konteynerlar uchun turli xil ish vaqti variantlari mavjud. Ushbu nashrdan foydalaniladi Flanel tarmoqni klasterda tashkil qilish va bajariladigan muhit sifatida - Konteyner. Men, shuningdek, konteynerlar orasidagi tarmoq qanday ishlashini bilasiz, deb taxmin qilyapman, shuning uchun men unga faqat kontekst uchun qisqacha to'xtalib o'taman.

Ba'zi asosiy tushunchalar

Konteynerlar va tarmoq: qisqacha sharh

Internetda konteynerlarning tarmoq orqali bir-biri bilan qanday aloqa qilishini tushuntiruvchi ko'plab ajoyib nashrlar mavjud. Shuning uchun men faqat asosiy tushunchalar haqida umumiy ma'lumot beraman va o'zimni Linux ko'prigini yaratish va paketlarni o'z ichiga olgan bitta yondashuv bilan cheklayman. Tafsilotlar olib tashlandi, chunki konteyner tarmog'i mavzusining o'zi alohida maqolaga loyiqdir. Ba'zi bir ayniqsa chuqur va ta'lim nashrlariga havolalar quyida taqdim etiladi.

Bitta xostdagi konteynerlar

Xuddi shu xostda ishlaydigan konteynerlar orasidagi IP manzillar orqali aloqani tashkil qilishning bir usuli Linux ko'prigini yaratishni o'z ichiga oladi. Shu maqsadda Kubernetes (va Docker) da virtual qurilmalar yaratilgan. veth (virtual Ethernet). Veth qurilmasining bir uchi konteynerning tarmoq nom maydoniga, ikkinchisi esa ulanadi Linux ko'prigi xost tarmog'ida.

Bitta xostdagi barcha konteynerlar vethning bir uchi ko'prik bilan bog'langan bo'lib, ular orqali IP manzillari orqali bir-biri bilan bog'lanishlari mumkin. Linux ko'prigi, shuningdek, IP-manzilga ega va boshqa tugunlar uchun mo'ljallangan podlardan chiqish trafiki uchun shlyuz vazifasini bajaradi.

Kubernetes podasi IP manzilini qanday oladi?

Turli xostlardagi konteynerlar

Paket inkapsulyatsiyasi turli tugunlardagi konteynerlarga IP-manzillar yordamida bir-biri bilan bog'lanish imkonini beruvchi usullardan biridir. Flannel-da texnologiya bu imkoniyat uchun javobgardir. vxlan, u asl paketni UDP paketiga "paketlaydi" va keyin uni belgilangan manzilga yuboradi.

Kubernetes klasterida Flannel vxlan qurilmasini yaratadi va mos ravishda har bir tugundagi marshrut jadvalini yangilaydi. Boshqa xostdagi konteyner uchun mo'ljallangan har bir paket vxlan qurilmasi orqali o'tadi va UDP paketiga qadalgan. Belgilangan joyda ichki o'rnatilgan paket chiqariladi va kerakli podkaga yo'naltiriladi.

Kubernetes podasi IP manzilini qanday oladi?
Eslatma: Bu konteynerlar o'rtasida tarmoq aloqasini tashkil qilishning bir usuli.

CRI nima?

CRI (Container Runtime Interface) kubeletga turli konteyner ish vaqti muhitlaridan foydalanish imkonini beruvchi plagindir. CRI API turli xil ish vaqtlariga o'rnatilgan, shuning uchun foydalanuvchilar o'zlari tanlagan ish vaqtini tanlashlari mumkin.

CNI nima?

CNI loyihasi o'zida aks ettiradi spetsifikatsiya Linux konteynerlari uchun universal tarmoq yechimini tashkil qilish. Bundan tashqari, u o'z ichiga oladi plaginlar, pod tarmog'ini o'rnatishda turli funktsiyalar uchun javobgardir. CNI plagini spetsifikatsiyaga mos keladigan bajariladigan fayldir (biz quyida ba'zi plaginlarni muhokama qilamiz).

Podkalarga IP-manzillarni belgilash uchun pastki tarmoqlarni tugunlarga ajratish

Klasterdagi har bir podkada IP-manzil bo'lishi kerakligi sababli, bu manzil noyob bo'lishini ta'minlash muhim. Bunga har bir tugunga o'ziga xos pastki tarmoqni belgilash orqali erishiladi, shundan so'ng ushbu tugundagi podslarga IP manzillari tayinlanadi.

Tugun IPAM Controller

qachon nodeipam bayroq parametri sifatida qabul qilingan --controllers kube-kontroller-menejer, u CIDR klasteridan har bir tugunga alohida quyi tarmoqni (podCIDR) ajratadi (ya'ni, klaster tarmog'i uchun IP manzillar diapazoni). Ushbu podCIDR'lar bir-biriga mos kelmaganligi sababli, har bir podkada uchun noyob IP-manzil ajratilishi mumkin bo'ladi.

Kubernetes tuguniga dastlab klasterda ro'yxatdan o'tkazilganda podCIDR tayinlanadi. Tugunlarning podCIDR-ni o'zgartirish uchun siz ularni ro'yxatdan o'tkazishingiz va keyin Kubernetes boshqaruv qatlami konfiguratsiyasiga tegishli o'zgarishlar kiritib, ularni qayta ro'yxatdan o'tkazishingiz kerak. Siz quyidagi buyruq yordamida tugunning podCIDR-ni ko'rsatishingiz mumkin:

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

Kubelet, konteyner ish vaqti va CNI plaginlari: barchasi qanday ishlaydi

Har bir tugun uchun podani rejalashtirish juda ko'p tayyorgarlik bosqichlarini o'z ichiga oladi. Ushbu bo'limda men faqat pod tarmog'ini o'rnatish bilan bevosita bog'liq bo'lganlarga e'tibor qarataman.

Podni ma'lum bir tugunga rejalashtirish quyidagi hodisalar zanjirini ishga tushiradi:

Kubernetes podasi IP manzilini qanday oladi?

FAQ: Containerd CRI plaginlari arxitekturasi.

Konteynerning ishlash vaqti va CNI plaginlari o'rtasidagi o'zaro ta'sir

Har bir tarmoq provayderi o'z CNI plaginiga ega. Konteynerning ish vaqti uni ishga tushirilganda podkast uchun tarmoqni sozlash uchun ishga tushiradi. Konteynerda CNI plagini plagin tomonidan ishga tushiriladi Konteyner CRI.

Bundan tashqari, har bir provayder o'z agentiga ega. U barcha Kubernetes tugunlariga o'rnatiladi va podslarning tarmoq konfiguratsiyasi uchun javobgardir. Ushbu agent CNI konfiguratsiyasiga kiritilgan yoki uni mustaqil ravishda tugunda yaratadi. Konfiguratsiya CRI plaginiga qaysi CNI plaginini chaqirishni belgilashga yordam beradi.

CNI konfiguratsiyasining joylashuvi moslashtirilishi mumkin; sukut bo'yicha u mavjud /etc/cni/net.d/<config-file>. Klaster ma'murlari har bir klaster tuguniga CNI plaginlarini o'rnatish uchun ham javobgardir. Ularning joylashuvi ham moslashtirilgan; standart katalog - /opt/cni/bin.

Konteynerdan foydalanganda plagin konfiguratsiyasi va ikkilik fayllar uchun yo'llar bo'limda o'rnatilishi mumkin [plugins.«io.containerd.grpc.v1.cri».cni] в konteyner konfiguratsiya fayli.

Biz Flannel-dan tarmoq provayderimiz sifatida foydalanayotganimiz sababli, uni sozlash haqida bir oz gaplashamiz:

  • Flaneld (Flanel demoni) odatda klasterda DaemonSet sifatida o'rnatiladi. install-cni sifatda boshlang'ich konteyner.
  • Install-cni yaratadi CNI konfiguratsiya fayli (/etc/cni/net.d/10-flannel.conflist) har bir tugunda.
  • Flanneld vxlan qurilmasini yaratadi, API serveridan tarmoq metama'lumotlarini oladi va pod yangilanishlarini kuzatib boradi. Ular yaratilgach, u klaster bo'ylab barcha podslarga marshrutlarni tarqatadi.
  • Ushbu marshrutlar podslarning bir-biri bilan IP manzillari orqali bog'lanishiga imkon beradi.

Flanelning ishi haqida batafsil ma'lumot olish uchun men maqolaning oxiridagi havolalardan foydalanishni maslahat beraman.

Bu erda Containerd CRI plagini va CNI plaginlari o'rtasidagi o'zaro ta'sir diagrammasi:

Kubernetes podasi IP manzilini qanday oladi?

Yuqorida ko'rib turganingizdek, kubelet podni yaratish uchun Containerd CRI plaginini chaqiradi, so'ngra pod tarmog'ini sozlash uchun CNI plaginini chaqiradi. Bunda tarmoq provayderining CNI plagini tarmoqning turli jihatlarini sozlash uchun boshqa asosiy CNI plaginlarini chaqiradi.

CNI plaginlari o'rtasidagi o'zaro ta'sir

Turli xil CNI plaginlari mavjud, ularning vazifasi xostdagi konteynerlar o'rtasida tarmoq aloqasini o'rnatishga yordam berishdir. Ushbu maqolada ulardan uchtasi muhokama qilinadi.

CNI plagini Flanel

Flannel-dan tarmoq provayderi sifatida foydalanilganda, Containerd CRI komponenti qo'ng'iroq qiladi CNI plagini FlanelCNI konfiguratsiya faylidan foydalanish /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 bilan birgalikda ishlaydi. Ishga tushirish vaqtida Flanneld API serveridan podCIDR va tarmoq bilan bog'liq boshqa ma'lumotlarni oladi va ularni faylga saqlaydi. /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 ma'lumotlardan foydalanadi /run/flannel/subnet.env CNI ko'prigi plaginini sozlash va chaqirish uchun.

CNI plagin ko'prigi

Ushbu plagin quyidagi konfiguratsiya bilan chaqiriladi:

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

Birinchi marta chaqirilganda, u bilan Linux ko'prigi yaratadi «name»: «cni0», bu konfiguratsiyada ko'rsatilgan. Keyin har bir pod uchun veth juftligi yaratiladi. Uning bir uchi konteynerning tarmoq nom maydoniga ulangan, ikkinchisi esa xost tarmog'idagi Linux ko'prigiga kiritilgan. CNI plagin ko'prigi barcha xost konteynerlarini xost tarmog'idagi Linux ko'prigiga ulaydi.

Veth juftligini sozlashni tugatgandan so'ng, Bridge plagini xost-mahalliy IPAM CNI plaginini chaqiradi. IPAM plagin turi CRI plagini Flannel CNI plaginini chaqirish uchun foydalanadigan CNI konfiguratsiyasida sozlanishi mumkin.

Xost-mahalliy IPAM CNI plaginlari

Bridge CNI qo'ng'iroqlari xost-mahalliy IPAM plagini CNI quyidagi konfiguratsiya bilan:

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

Xost-mahalliy IPAM plagini (IP Akiyinish Management - IP manzillarni boshqarish) quyi tarmoqdan konteyner uchun IP-manzilni qaytaradi va ajratilgan IP-ni xostda bo'limda ko'rsatilgan katalogda saqlaydi dataDir - /var/lib/cni/networks/<network-name=cni0>/<ip>. Ushbu faylda ushbu IP manzili tayinlangan konteyner identifikatori mavjud.

Mahalliy IPAM plaginiga qo'ng'iroq qilganda, u quyidagi ma'lumotlarni qaytaradi:

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

Xulosa

Kube-controller-menejer har bir tugunga podCIDR ni tayinlaydi. Har bir tugunning podslari ajratilgan podCIDR diapazonidagi manzil maydonidan IP manzillarini oladi. Tugunlarning podCIDRlari bir-biriga mos kelmaganligi sababli, barcha podlar noyob IP manzillarini oladi.

Kubernetes klasteri ma'muri kubelet, konteyner ish vaqti, tarmoq provayderi agentini sozlaydi va o'rnatadi va CNI plaginlarini har bir tugunga nusxalaydi. Ishga tushirish vaqtida tarmoq provayderi agenti CNI konfiguratsiyasini yaratadi. Pod bir tugunga rejalashtirilsa, kubelet uni yaratish uchun CRI plaginini chaqiradi. Keyinchalik, konteyner ishlatilsa, Containerd CRI plagini pod tarmog'ini sozlash uchun CNI konfiguratsiyasida ko'rsatilgan CNI plaginini chaqiradi. Natijada, pod IP-manzilni oladi.

Bu barcha o'zaro ta'sirlarning barcha nozikliklari va nuanslarini tushunish uchun menga biroz vaqt kerak bo'ldi. Umid qilamanki, bu tajriba sizga Kubernetes qanday ishlashini yaxshiroq tushunishga yordam beradi. Agar biror narsada xato qilsam, iltimos, men bilan bog'laning Twitter yoki manzilda [elektron pochta bilan himoyalangan]. Agar siz ushbu maqolaning jihatlarini yoki boshqa narsalarni muhokama qilishni istasangiz, bemalol bog'laning. Men siz bilan suhbatlashishni istardim!

Manbalar

Konteynerlar va tarmoq

Flanel qanday ishlaydi?

CRI va CNI

Tarjimondan PS

Shuningdek, bizning blogimizda o'qing:

Manba: www.habr.com

a Izoh qo'shish