Kubernetes pod IP мекенжайын қалай алады?

Ескерту. аударма: LinkedIn компаниясының SRE инженері жазған бұл мақала Kubernetes ішіндегі ішкі сиқыр туралы егжей-тегжейлі сипатталған - дәлірек айтқанда, CRI, CNI және kube-аписервердің өзара әрекеттесуі - бұл келесі подкастқа IP мекенжайын тағайындау қажет болғанда орын алады.

Негізгі талаптардың бірі Kubernetes желісінің моделі әрбір подкасттың жеке IP мекенжайы болуы керек және кластердегі кез келген басқа подкаст онымен сол мекенжай бойынша байланыса алуы керек. Бұл желілік модельді жүзеге асыруға көмектесетін көптеген желілік «провайдерлер» (Flannel, Calico, Canal және т.б.) бар.

Мен Kubernetes-пен алғаш жұмыс істей бастағанда, поддондар өздерінің IP мекенжайларын қалай алатыны маған толық түсініксіз болды. Жеке құрамдас бөліктердің қалай жұмыс істейтінін түсінгеннің өзінде, олардың бірге жұмыс істейтінін елестету қиын болды. Мысалы, мен CNI плагиндерінің не үшін екенін білдім, бірақ олардың дәл қалай аталатынын білмедім. Сондықтан мен бұл мақаланы әртүрлі желі құрамдастары және олардың Кубернетес кластерінде қалай бірге жұмыс істейтіні туралы біліммен бөлісу үшін жазуды шештім, бұл әрбір подкастқа өзінің бірегей IP мекенжайын алуға мүмкіндік береді.

Контейнерлер үшін әртүрлі орындау уақытының опциялары сияқты, Кубернетесте желіні ұйымдастырудың әртүрлі жолдары бар. Бұл басылым пайдаланатын болады Фланель желіні кластерде және орындалатын орта ретінде ұйымдастыру үшін - Контейнер. Мен сондай-ақ контейнерлер арасындағы желі қалай жұмыс істейтінін білесіз деп болжаймын, сондықтан мен контекст үшін оған қысқаша тоқталамын.

Кейбір негізгі ұғымдар

Контейнерлер және желі: қысқаша шолу

Интернетте контейнерлердің желі арқылы бір-бірімен қалай байланысатынын түсіндіретін көптеген тамаша басылымдар бар. Сондықтан мен тек негізгі ұғымдарға жалпы шолу жасаймын және Linux көпірін құруды және пакеттерді инкапсуляциялауды қамтитын бір тәсілмен шектелемін. Контейнерлік желі тақырыбының өзі бөлек мақалаға лайық болғандықтан, егжей-тегжейлер енгізілмейді. Кейбір ерекше түсінікті және танымдық жарияланымдарға сілтемелер төменде беріледі.

Бір хосттағы контейнерлер

Бір хостта жұмыс істейтін контейнерлер арасындағы IP мекенжайлары арқылы байланысты ұйымдастырудың бір жолы Linux көпірін жасауды қамтиды. Осы мақсатта виртуалды құрылғылар Kubernetes-те (және Docker) жасалады. veth (виртуалды Ethernet). Veth құрылғысының бір ұшы контейнердің желілік аттар кеңістігіне, екіншісіне қосылады Linux көпірі хост желісінде.

Бір хосттағы барлық контейнерлер IP мекенжайлары арқылы бір-бірімен байланыса алатын көпірге қосылған veth бір ұшына ие. Linux көпірінде сонымен қатар IP мекенжайы бар және басқа түйіндерге арналған блоктардан шығу трафигі үшін шлюз ретінде әрекет етеді.

Kubernetes pod IP мекенжайын қалай алады?

Әртүрлі хосттардағы контейнерлер

Пакет инкапсуляциясы - әртүрлі түйіндердегі контейнерлерге IP мекенжайлары арқылы бір-бірімен байланысуға мүмкіндік беретін әдістердің бірі. Фланельде технология бұл мүмкіндікке жауап береді. vxlan, ол бастапқы пакетті UDP бумасына «бумалайды», содан кейін оны тағайындалған жерге жібереді.

Kubernetes кластерінде Flannel vxlan құрылғысын жасайды және сәйкесінше әрбір түйіндегі маршрут кестесін жаңартады. Басқа хосттағы контейнерге арналған әрбір пакет vxlan құрылғысы арқылы өтеді және UDP пакетінде инкапсуляцияланады. Тағайындалған жерде кірістірілген пакет шығарылады және қажетті подкастқа жіберіледі.

Kubernetes pod IP мекенжайын қалай алады?
Ескерту: Бұл контейнерлер арасындағы желілік байланысты ұйымдастырудың бір жолы ғана.

CRI дегеніміз не?

CRI (Container Runtime Interface) kubelet әртүрлі контейнерлік жұмыс орталарын пайдалануға мүмкіндік беретін плагин болып табылады. CRI API әртүрлі орындалу уақыттарына енгізілген, сондықтан пайдаланушылар өз таңдауы бойынша орындалу уақытын таңдай алады.

CNI дегеніміз не?

CNI жобасы білдіреді спецификация Linux контейнерлері үшін әмбебап желілік шешімді ұйымдастыру. Сонымен қатар, ол қамтиды плагиндер, подкаст желісін орнату кезінде әртүрлі функцияларға жауапты. CNI плагині спецификацияға сәйкес келетін орындалатын файл (төменде кейбір плагиндерді талқылаймыз).

Бөлімшелерге IP мекенжайларын тағайындау үшін ішкі желілерді түйіндерге бөлу

Кластердегі әрбір подводтың IP мекенжайы болуы керек болғандықтан, бұл мекенжай бірегей екеніне көз жеткізу маңызды. Бұған әрбір түйінге бірегей ішкі желі тағайындау арқылы қол жеткізіледі, одан кейін сол түйіндегі түйіндерге IP мекенжайлары тағайындалады.

Түйін IPAM контроллері

Қашан nodeipam жалауша параметрі ретінде жіберілді --controllers kube-контроллер-менеджер, ол CIDR кластерінен әрбір түйінге бөлек ішкі желіні (podCIDR) бөледі (яғни кластер желісі үшін IP мекенжайларының ауқымы). Бұл podCIDR бір-біріне сәйкес келмейтіндіктен, әрбір подкастқа бірегей IP мекенжайын бөлу мүмкін болады.

Kubernetes түйіні кластермен бастапқыда тіркелген кезде podCIDR тағайындалады. Түйіндердің podCIDR-ін өзгерту үшін оларды тіркеуден алып тастау керек, содан кейін олардың арасында Kubernetes басқару қабатының конфигурациясына тиісті өзгерістер енгізіп, қайта тіркеу керек. Келесі пәрменді пайдаланып түйіннің podCIDR көрсетуіне болады:

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

Kubelet, контейнердің жұмыс уақыты және CNI плагиндері: бәрі қалай жұмыс істейді

Түйінге подкастты жоспарлау көптеген дайындық қадамдарын қамтиды. Бұл бөлімде мен подклиндік желіні орнатуға тікелей қатысы барларға ғана тоқталамын.

Бөлшекті белгілі бір түйінге жоспарлау келесі оқиғалар тізбегін іске қосады:

Kubernetes pod IP мекенжайын қалай алады?

Анықтама: Containerd CRI плагиндерінің архитектурасы.

Контейнердің жұмыс уақыты мен CNI плагиндері арасындағы өзара әрекеттесу

Әрбір желі провайдерінде өзінің CNI плагині бар. Контейнердің жұмыс уақыты оны іске қосу кезінде желіні конфигурациялау үшін іске қосады. Контейнерлік жағдайда, CNI плагині плагин арқылы іске қосылады Контейнерлік CRI.

Сонымен қатар, әр провайдердің өз агенті бар. Ол барлық Kubernetes түйіндеріне орнатылады және подкасттардың желілік конфигурациясына жауап береді. Бұл агент CNI конфигурациясына кіреді немесе оны түйінде дербес жасайды. Конфигурация CRI плагиніне қандай CNI плагиніне қоңырау шалу керектігін орнатуға көмектеседі.

CNI конфигурациясының орнын теңшеуге болады; әдепкі бойынша ол ішінде /etc/cni/net.d/<config-file>. Кластер әкімшілері әр кластер түйінінде CNI плагиндерін орнатуға да жауапты. Олардың орналасуы да реттеледі; әдепкі каталог - /opt/cni/bin.

Контейнерді пайдаланған кезде плагин конфигурациясына және екілік файлдарға арналған жолдарды бөлімде орнатуға болады [plugins.«io.containerd.grpc.v1.cri».cni] в контейнер конфигурация файлы.

Фланелді желі провайдері ретінде пайдаланатындықтан, оны орнату туралы аздап сөйлесейік:

  • Фланельд (Фланел демоны) әдетте кластерде DaemonSet ретінде орнатылады. install-cni ретінде бастапқы контейнер.
  • Install-cni жасайды CNI конфигурация файлы (/etc/cni/net.d/10-flannel.conflist) әрбір түйінде.
  • Flanneld vxlan құрылғысын жасайды, API серверінен желі метадеректерін шығарып алады және подключ жаңартуларды бақылайды. Олар жасалғанда, ол маршруттарды кластердегі барлық қосқыштарға таратады.
  • Бұл маршруттар подводтарға IP мекенжайлары арқылы бір-бірімен байланысуға мүмкіндік береді.

Фланелдің жұмысы туралы толығырақ ақпарат алу үшін мақаланың соңындағы сілтемелерді пайдалануды ұсынамын.

Мұнда Containerd CRI плагині мен CNI плагиндері арасындағы өзара әрекеттесу диаграммасы берілген:

Kubernetes pod IP мекенжайын қалай алады?

Жоғарыда көріп отырғаныңыздай, kubelet подкастты жасау үшін Containerd CRI плагинін шақырады, содан кейін подкаст желісін конфигурациялау үшін CNI плагинін шақырады. Бұл ретте желі провайдерінің CNI плагині желінің әртүрлі аспектілерін конфигурациялау үшін басқа негізгі CNI плагиндерін шақырады.

CNI плагиндері арасындағы өзара әрекеттесу

Хосттағы контейнерлер арасында желілік байланысты орнатуға көмектесетін әртүрлі CNI плагиндері бар. Бұл мақалада олардың үшеуі талқыланады.

CNI плагині Flannel

Фланелді желі провайдері ретінде пайдаланған кезде Containerd CRI құрамдас бөлігі шақырады CNI плагині FlannelCNI конфигурация файлын пайдалану /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 плагині Flanneld-пен бірге жұмыс істейді. Іске қосу кезінде Фланелд API серверінен podCIDR және басқа желіге қатысты мәліметтерді шығарып алады және оларды файлға сақтайды. /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 плагині деректерді пайдаланады /run/flannel/subnet.env CNI көпір плагинін конфигурациялау және шақыру.

CNI плагин көпірі

Бұл плагин келесі конфигурациямен шақырылады:

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

Бірінші рет шақырылған кезде ол Linux көпірін жасайды «name»: «cni0», ол конфигурацияда көрсетілген. Содан кейін әрбір бөтелке үшін вет жұбы жасалады. Оның бір ұшы контейнердің желілік аттар кеңістігіне қосылған, екіншісі хост желісіндегі Linux көпіріне қосылған. CNI плагин көпірі барлық хост контейнерлерін хост желісіндегі Linux көпіріне қосады.

Veth жұбын орнатуды аяқтағаннан кейін, Bridge плагині хост-жергілікті IPAM CNI плагинін шақырады. IPAM плагин түрін CRI плагині Flannel CNI плагинін шақыру үшін пайдаланатын CNI конфигурациясында конфигурациялауға болады.

Хост-жергілікті IPAM CNI плагиндері

Көпір CNI қоңыраулары хост-жергілікті IPAM плагині CNI келесі конфигурациямен:

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

Хост-жергілікті IPAM плагині (IP Aдресс Management - IP мекенжайын басқару) ішкі желіден контейнердің IP мекенжайын қайтарады және бөлімде көрсетілген каталогта хостта бөлінген IP мекенжайын сақтайды dataDir - /var/lib/cni/networks/<network-name=cni0>/<ip>. Бұл файлда осы IP мекенжайы тағайындалған контейнер идентификаторы бар.

Хост-жергілікті IPAM плагинін шақырған кезде ол келесі деректерді қайтарады:

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

Резюме

Kube-контроллер-менеджер әрбір түйінге podCIDR тағайындайды. Әрбір түйіннің түйіндері бөлінген podCIDR ауқымындағы мекенжай кеңістігінен IP мекенжайларын алады. Түйіндердің podCIDR нөмірлері қабаттаспағандықтан, барлық қосқыштар бірегей IP мекенжайларын алады.

Kubernetes кластерінің әкімшісі kubelet, контейнердің жұмыс уақытын, желі провайдері агентін конфигурациялайды және орнатады және CNI плагиндерін әрбір түйінге көшіреді. Іске қосу кезінде желі провайдерінің агенті CNI конфигурациясын жасайды. Торап түйінге жоспарланған кезде, kubelet оны жасау үшін CRI плагинін шақырады. Әрі қарай, контейнер пайдаланылса, Containerd CRI плагині подкаст желісін конфигурациялау үшін CNI конфигурациясында көрсетілген CNI плагинін шақырады. Нәтижесінде подвод IP мекенжайын алады.

Барлық осы өзара әрекеттесулердің барлық нәзіктіктері мен нюанстарын түсіну үшін маған біраз уақыт қажет болды. Бұл тәжірибе Kubernetes қалай жұмыс істейтінін жақсы түсінуге көмектеседі деп үміттенемін. Егер мен бірдеңеде қателессем, маған хабарласыңыз Twitter немесе мекенжай бойынша [электрондық пошта қорғалған]. Осы мақаланың аспектілерін немесе басқа нәрсені талқылағыңыз келсе, хабарласыңыз. Мен сізбен сөйлескім келеді!

сілтемелер

Контейнерлер және желі

Фланель қалай жұмыс істейді?

CRI және CNI

Аудармашыдан PS

Біздің блогта да оқыңыз:

Ақпарат көзі: www.habr.com

пікір қалдыру