Чӣ тавр як pod Kubernetes суроғаи IP-ро мегирад?

Шарҳ. тарҷума.: Ин мақола, ки аз ҷониби як муҳандиси SRE аз LinkedIn навишта шудааст, дар бораи ҷодугарии ботинӣ дар Кубернетес муфассал нақл мекунад - дақиқтараш, ҳамкории CRI, CNI ва kube-apiserver - ин вақте рух медиҳад, ки ба подкоҳи навбатӣ суроғаи IP таъин карда шавад.

Яке аз талаботи асосӣ Модели шабакаи Kubernetes он аст, ки ҳар як подкаст бояд суроғаи IP-и худро дошта бошад ва ҳар як подкоҳи дигари кластер бояд бо он суроға тамос гирад. Бисёр «провайдерҳои» шабакавӣ (Flannel, Calico, Canal ва ғайра) мавҷуданд, ки дар татбиқи ин модели шабакавӣ кӯмак мекунанд.

Вақте ки ман бори аввал бо Kubernetes кор карданро сар кардам, ба ман комилан равшан набуд, ки чӣ тавр поддонҳо суроғаҳои IP-и худро мегиранд. Ҳатто бо фаҳмидани он, ки ҷузъҳои инфиродӣ чӣ гуна кор мекунанд, тасаввур кардан душвор буд, ки онҳо якҷоя кор мекунанд. Масалан, ман медонистам, ки плагинҳои CNI барои чӣ ҳастанд, аммо ман намедонистам, ки онҳо чӣ гуна номида мешаванд. Аз ин рӯ, ман қарор додам, ки ин мақоларо барои мубодилаи дониш дар бораи ҷузъҳои гуногуни шабака ва чӣ гуна онҳо дар кластери Kubernetes якҷоя кор мекунанд, нависам, ки ба ҳар як pod суроғаи IP-и беназири худро медиҳад.

Роҳҳои гуногуни ташкили шабака дар Kubernetes вуҷуд доранд, ҳамон тавре ки имконоти гуногуни вақти корӣ барои контейнерҳо мавҷуданд. Ин нашрия истифода хоҳад кард Flannel ташкили шабака дар кластер ва ҳамчун муҳити иҷрошаванда - Контейнер. Ман инчунин тахмин мекунам, ки шумо медонед, ки шабака байни контейнерҳо чӣ гуна кор мекунад, аз ин рӯ ман танҳо барои контекст ба таври мухтасар ба он муроҷиат мекунам.

Баъзе мафҳумҳои асосӣ

Контейнерҳо ва шабака: Шарҳи мухтасар

Дар Интернет бисёр нашрияҳои олӣ мавҷуданд, ки чӣ гуна контейнерҳо тавассути шабака бо ҳам муошират мекунанд. Аз ин рӯ, ман танҳо шарҳи умумии мафҳумҳои асосиро медиҳам ва худро бо як равиш маҳдуд мекунам, ки эҷоди пули Linux ва бастаҳоро фаро мегирад. Тафсилот партофта шудаанд, зеро худи мавзӯи шабакаи контейнерӣ сазовори мақолаи алоҳида аст. Истинодҳо ба баъзе нашрияҳои махсусан фаҳмо ва таълимӣ дар зер оварда мешаванд.

Контейнерҳо дар як мизбон

Як роҳи ташкили иртибот тавассути суроғаҳои IP байни контейнерҳое, ки дар як ҳост кор мекунанд, эҷоди пули Linux мебошад. Бо ин мақсад, дастгоҳҳои виртуалӣ дар Kubernetes (ва Docker) сохта шудаанд. veth (ethernet виртуалӣ). Як канори дастгоҳи veth ба фазои номи шабакаи контейнер пайваст мешавад, дигараш ба пули Linux дар шабакаи мизбон.

Ҳама контейнерҳо дар як мизбон як нӯги veth доранд, ки ба пул пайваст карда шудаанд, ки тавассути он онҳо метавонанд тавассути суроғаҳои IP бо ҳамдигар муошират кунанд. Пули Linux инчунин суроғаи IP дорад ва ҳамчун шлюз барои трафики хуруҷ аз блокҳои барои гиреҳҳои дигар таъиншуда амал мекунад.

Чӣ тавр як pod Kubernetes суроғаи IP-ро мегирад?

Контейнерҳо дар ҳостҳои гуногун

Инкапсуляцияи пакет як усулест, ки ба контейнерҳо дар гиреҳҳои гуногун имкон медиҳад, ки бо истифода аз суроғаҳои IP бо ҳамдигар муошират кунанд. Дар Flannel технология барои ин имконият масъул аст. vxlan, ки бастаи аслиро ба бастаи UDP "баста" мекунад ва сипас онро ба макони таъинот мефиристад.

Дар кластери Kubernetes, Flannel як дастгоҳи vxlan эҷод мекунад ва ҷадвали масирро дар ҳар як гиреҳ мувофиқан нав мекунад. Ҳар як бастаи барои контейнер дар ҳости дигар таъиншуда аз дастгоҳи vxlan мегузарад ва дар бастаи UDP фаро гирифта шудааст. Дар макони таъинот, бастаи лонашуда истихроҷ карда мешавад ва ба қуттии дилхоҳ фиристода мешавад.

Чӣ тавр як pod Kubernetes суроғаи IP-ро мегирад?
Эзоҳ: Ин танҳо як роҳи ташкили алоқаи шабакавӣ байни контейнерҳост.

CRI чист?

CRI (Интерфейси Runtime Container) плагинест, ки ба kubelet имкон медиҳад, ки муҳитҳои гуногуни контейнерро истифода барад. API CRI дар вақтҳои гуногуни иҷро сохта шудааст, аз ин рӯ корбарон метавонанд вақти дилхоҳи худро интихоб кунанд.

CNI чист?

Лоиҳаи CNI як аст мушаххасот ташкили ҳалли универсалии шабакавӣ барои контейнерҳои Linux. Илова бар ин, он дар бар мегирад плагинҳо, масъул барои вазифаҳои гуногун ҳангоми таъсиси шабакаи pod. Васлкунаки CNI файли иҷрошаванда аст, ки ба мушаххасот мувофиқат мекунад (мо дар зер баъзе плагинҳоро муҳокима хоҳем кард).

Тақсимоти зершабакаҳо ба гиреҳҳо барои таъини суроғаҳои IP ба pods

Азбаски ҳар як подкаст дар кластер бояд суроғаи IP дошта бошад, муҳим аст, ки ин суроға беназир аст. Ин тавассути таъин кардани ҳар як гиреҳ як зершабакаи беназир ба даст оварда мешавад, ки аз он ба подкастҳои он гиреҳ суроғаҳои IP таъин карда мешаванд.

Нозири гиреҳи IPAM

Ҳангоми nodeipam ҳамчун параметри парчам гузашт --controllers кубе-контроллер-мудир, он зершабакаи алоҳида (podCIDR) аз кластери CIDR (яъне диапазони суроғаҳои IP барои шабакаи кластер) ба ҳар як гиреҳ ҷудо мекунад. Азбаски ин podCIDRҳо ба ҳам мувофиқ нестанд, имкон пайдо мешавад, ки барои ҳар як подкаст суроғаи IP-и беназир ҷудо карда шавад.

Ба гиреҳи Kubernetes podCIDR таъин карда мешавад, вақте ки он дар аввал дар кластер ба қайд гирифта мешавад. Барои тағир додани podCIDR гиреҳҳо, шумо бояд онҳоро аз сабти ном хориҷ кунед ва сипас онҳоро аз нав сабт кунед ва дар байни конфигуратсияи қабати назоратии Kubernetes тағироти мувофиқ ворид кунед. Шумо метавонед podCIDR-и гиреҳро бо истифода аз фармони зерин намоиш диҳед:

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

Kubelet, вақти кории контейнер ва плагинҳои CNI: ин ҳама чӣ гуна кор мекунад

Банақшагирии як pod барои як гиреҳ бисёр қадамҳои омодагиро дар бар мегирад. Дар ин бахш, ман танҳо ба онҳое таваҷҷӯҳ хоҳам кард, ки мустақиман бо таъсиси шабакаи поддон алоқаманданд.

Банақшагирии pod ба гиреҳи муайян занҷири рӯйдодҳои зеринро ба вуҷуд меорад:

Чӣ тавр як pod Kubernetes суроғаи IP-ро мегирад?

Кӯмак: Архитектураи плагинҳои CRI Containerd.

Муносибати байни контейнер ва плагинҳои CNI

Ҳар як провайдери шабака плагини CNI-и худро дорад. Вақти кори контейнер онро барои танзим кардани шабака барои pod ҳангоми оғозёбии он кор мекунад. Дар мавриди контейнер, плагини CNI аз ҷониби плагин оғоз мешавад Контейнери CRI.

Ғайр аз он, ҳар як провайдер агенти худро дорад. Он дар ҳама гиреҳҳои Kubernetes насб карда шудааст ва барои конфигуратсияи шабакаи подкҳо масъул аст. Ин агент ё ба конфигуратсияи CNI дохил карда шудааст ё онро мустақилона дар гиреҳ эҷод мекунад. Конфигуратсия ба плагини CRI кӯмак мекунад, ки кадом плагини CNI занг занад.

Ҷойгиршавии конфигуратсияи CNI метавонад танзим карда шавад; ба таври нобаёнӣ он дар /etc/cni/net.d/<config-file>. Маъмурони кластер инчунин барои насб кардани плагинҳои CNI дар ҳар як гиреҳи кластер масъуланд. Ҷойгиршавии онҳо низ танзимшаванда аст; директорияи пешфарз - /opt/cni/bin.

Ҳангоми истифодаи контейнер, роҳҳоро барои конфигуратсияи плагин ва бинарҳо дар қисмат муқаррар кардан мумкин аст [plugins.«io.containerd.grpc.v1.cri».cni] в файли конфигуратсияи контейнер.

Азбаски мо Flannel-ро ҳамчун провайдери шабакавии худ истифода мебарем, биёед дар бораи танзими он каме сӯҳбат кунем:

  • Фланелд (демони Фланел) одатан дар кластер ҳамчун DaemonSet бо install-cni ҳамчун контейнери ибтидоӣ.
  • Install-cni месозад Файли конфигуратсияи CNI (/etc/cni/net.d/10-flannel.conflist) дар ҳар як гиреҳ.
  • Фланелд як дастгоҳи vxlan эҷод мекунад, метамаълумоти шабакаро аз сервери API дарёфт мекунад ва навсозиҳои поддонҳоро назорат мекунад. Вақте ки онҳо сохта мешаванд, он масирҳоро ба ҳамаи подкҳо дар саросари кластер тақсим мекунад.
  • Ин хатсайрҳо ба поддонҳо имкон медиҳанд, ки тавассути суроғаҳои IP бо ҳамдигар муошират кунанд.

Барои маълумоти муфассал дар бораи кори Flannel, ман тавсия медиҳам, ки истинодҳои охири мақоларо истифода баранд.

Ин аст диаграммаи ҳамкории байни плагини Containerd CRI ва плагинҳои CNI:

Чӣ тавр як pod Kubernetes суроғаи IP-ро мегирад?

Тавре ки шумо дар боло мебинед, kubelet плагини Containerd CRI-ро барои сохтани подк даъват мекунад, ки пас аз он плагини CNI-ро барои танзими шабакаи pod даъват мекунад. Дар ин ҳолат, плагини CNI провайдери шабака дигар плагинҳои асосии CNI-ро барои танзими ҷанбаҳои гуногуни шабака даъват мекунад.

Муносибати байни плагинҳои CNI

Васлкунакҳои гуногуни CNI мавҷуданд, ки вазифаи онҳо барои ташкили алоқаи шабакавӣ байни контейнерҳо дар ҳост мебошад. Дар ин мақола се нафари онҳо муҳокима хоҳанд шуд.

Васлкунаки CNI Flannel

Ҳангоми истифодаи Flannel ҳамчун провайдери шабака, ҷузъи Containerd CRI занг мезанад Васлкунаки CNI Flannelбо истифода аз файли конфигуратсияи CNI /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 кор мекунад. Ҳангоми оғозёбӣ, Flanneld podCIDR ва дигар тафсилоти марбут ба шабакаро аз сервери API мегирад ва онҳоро дар файл захира мекунад /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-ро дар конфигуратсияи CNI танзим кардан мумкин аст, ки плагини CRI барои занги плагини Flannel CNI истифода мебарад.

Васлкунакҳои мизбони маҳаллии IPAM CNI

Зангҳои Bridge 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>. Ин файл дорои ID-и контейнерест, ки ба он суроғаи IP таъин шудааст.

Ҳангоми занг задан ба плагини маҳаллии IPAM, он маълумоти зеринро бармегардонад:

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

Натиҷа

Kube-controller-менеҷер ба ҳар як гиреҳ як podCIDR таъин мекунад. Ҳар як гиреҳ суроғаҳои IP-ро аз фазои суроғаҳо дар диапазони ҷудошудаи podCIDR мегиранд. Азбаски podCIDR-ҳои гиреҳҳо ба ҳам мувофиқ нестанд, ҳама подкҳо суроғаҳои IP-и беназир мегиранд.

Администратори кластери Kubernetes кубелет, вақти кори контейнер, агенти провайдери шабакаро танзим ва насб мекунад ва плагинҳои CNI-ро ба ҳар як гиреҳ нусхабардорӣ мекунад. Ҳангоми оғозёбӣ, агенти провайдери шабака конфигуратсияи CNI тавлид мекунад. Ҳангоме ки поддон ба гиреҳ ба нақша гирифта шудааст, kubelet плагини CRI-ро барои сохтани он даъват мекунад. Минбаъд, агар контейнер истифода шавад, плагини Containerd CRI плагини CNI-ро, ки дар конфигуратсияи CNI нишон дода шудааст, даъват мекунад, то шабакаи podро танзим кунад. Дар натиҷа, pod суроғаи IP мегирад.

Барои фаҳмидани тамоми нозукиҳо ва нозукиҳои ҳамаи ин муносибатҳо ба ман чанд вақт лозим шуд. Умедворам, ки ин таҷриба ба шумо дар фаҳмидани он ки чӣ тавр Kubernetes кор мекунад, кӯмак мекунад. Агар дар ягон чиз хато бошам, лутфан бо ман тамос гиред Twitter ё ба адреси [почтаи электронӣ ҳифз карда шудааст]. Агар шумо хоҳед, ки ҷанбаҳои ин мақола ё чизи дигареро муҳокима кунед, озодона тамос гиред. Ман мехостам бо шумо сӯҳбат кунам!

мурожиат

Контейнерҳо ва шабака

Фланел чӣ гуна кор мекунад?

CRI ва CNI

PS аз тарҷумон

Инчунин дар блоги мо хонед:

Манбаъ: will.com

Илова Эзоҳ