Pehea e loaʻa ai i kahi pod Kubernetes kahi leka uila IP?

Nānā. unuhi.: ʻO kēia ʻatikala, i kākau ʻia e kahi ʻenekinia SRE mai LinkedIn, hele i nā kikoʻī e pili ana i ka hana kilokilo i loko o Kubernetes - ʻoi aku ka pololei, ka launa pū ʻana o CRI, CNI a me kube-apiserver - e hana ʻia i ka wā e pono ai ke kau ʻia ka pod aʻe i kahi IP address.

ʻO kekahi o nā koi kumu Ke kumu hoʻohālike pūnaewele Kubernetes ʻo ia ka pono o kēlā me kēia pod i kona IP ponoʻī a me nā pod ʻē aʻe i loko o ka pūʻulu e hiki ke hoʻopili iā ia ma kēlā helu. Nui nā "mea hoʻolako" pūnaewele (Flannel, Calico, Canal, etc.) e kōkua i ka hoʻokō ʻana i kēia ʻano hoʻohālike.

I koʻu hoʻomaka ʻana e hana pū me Kubernetes, ʻaʻole maopopo iaʻu pehea e loaʻa ai i nā pods ko lākou mau IP address. ʻOiai me ka hoʻomaopopo ʻana i ke ʻano o ka hana ʻana o kēlā me kēia ʻāpana, paʻakikī ke noʻonoʻo e hana pū lākou. No ka laʻana, ʻike wau i ke ʻano o nā plugins CNI, akā ʻaʻohe oʻu manaʻo pehea i kapa ʻia ai lākou. No laila, ua hoʻoholo wau e kākau i kēia ʻatikala e kaʻana like i ka ʻike e pili ana i nā ʻāpana pūnaewele like ʻole a pehea lākou e hana pū ai i kahi pūʻulu Kubernetes, kahi e hiki ai i kēlā me kēia pod ke loaʻa i kāna leka uila IP ponoʻī.

Aia nā ʻano like ʻole e hoʻonohonoho ai i ka pūnaewele ma Kubernetes, e like me nā koho runtime like ʻole no nā ipu. E hoʻohana kēia hoʻolaha Flannel e hoʻonohonoho i kahi pūnaewele i loko o kahi puʻupuʻu, a ma ke ʻano he wahi hoʻokō - Containerd. Ke manaʻo nei au ua ʻike ʻoe i ka hana ʻana o ka pūnaewele ma waena o nā ipu, no laila e hoʻopā wale wau iā ia, no ka pōʻaiapili wale nō.

ʻO kekahi mau manaʻo kumu

ʻO nā pahu a me ka Pūnaewele: He Manaʻo pōkole

Nui nā puke maikaʻi loa ma ka Pūnaewele e wehewehe ana i ke kamaʻilio ʻana o nā ipu i kekahi i kekahi ma ka pūnaewele. No laila, e hāʻawi wale wau i kahi ʻike nui o nā manaʻo kumu a kaupalena iaʻu iho i kahi ala hoʻokahi, e pili ana i ka hana ʻana i kahi alahaka Linux a me nā pūʻulu encapsulating. Hoʻokuʻu ʻia nā kikoʻī, no ka mea, pono ke kumuhana o ka ʻoihana pahu pahu i kahi ʻatikala ʻokoʻa. E hāʻawi ʻia ma lalo nei nā loulou i kekahi mau puke ʻike a hoʻonaʻauao.

ʻO nā pahu ma kahi hoʻokipa

ʻO kahi ala e hoʻonohonoho ai i ka kamaʻilio ma o nā IP address ma waena o nā pahu e holo ana ma ka host hoʻokahi e pili ana i ka hana ʻana i kahi alahaka Linux. No kēia kumu, hana ʻia nā polokalamu virtual ma Kubernetes (a me Docker) veth (virtual ethernet). Hoʻopili kekahi ʻaoʻao o ka hāmeʻa veth i ka inoa kikowaena pūnaewele o ka pahu, a ʻo kekahi i alahaka Linux ma ka pūnaewele hoʻokipa.

ʻO nā pahu a pau ma ka pūʻali hoʻokahi he hoʻokahi ʻaoʻao o ka veth i pili i kahi alahaka e hiki ai iā lākou ke kamaʻilio me kekahi i kekahi ma o nā leka uila IP. Loaʻa i ke alahaka Linux kahi IP address a hana ʻo ia ma ke ʻano he ʻīpuka no ka holo ʻana mai nā pods i koho ʻia no nā nodes ʻē aʻe.

Pehea e loaʻa ai i kahi pod Kubernetes kahi leka uila IP?

ʻO nā pahu ma nā pūʻali like ʻole

ʻO ka packet encapsulation kekahi ala e hiki ai i nā pahu ma nā node like ʻole ke kamaʻilio me kekahi me ka hoʻohana ʻana i nā helu IP. Ma Flannel, ʻo ka ʻenehana ke kuleana o kēia manawa. vxlan, ka mea "hoʻopili" i ka ʻeke kumu i loko o kahi ʻeke UDP a laila hoʻouna aku i kona wahi.

Ma kahi pūʻulu Kubernetes, hana ʻo Flannel i kahi mea vxlan a hōʻano hou i ka papa kuhikuhi ma kēlā me kēia node e like me ia. ʻO kēlā me kēia ʻeke i hoʻoholo ʻia no kahi pahu ma kahi hoʻokipa ʻē aʻe e hele i ka hāmeʻa vxlan a hoʻopili ʻia i loko o kahi ʻeke UDP. Ma kahi e hele ai, lawe ʻia ka ʻeke pūnana a hoʻouna ʻia i ka pod i makemake ʻia.

Pehea e loaʻa ai i kahi pod Kubernetes kahi leka uila IP?
'Ōlelo Aʻo: ʻO kēia wale nō kahi ala e hoʻonohonoho ai i ke kamaʻilio pūnaewele ma waena o nā pahu.

He aha ka CRI?

ʻO CRI (Ka Inoa Hoʻokele Kūʻai Kūʻai) he plugin ia e hiki ai iā kubelet ke hoʻohana i nā kaiapuni runtime pahu like ʻole. Kūkulu ʻia ka CRI API i nā manawa holo like ʻole, no laila hiki i nā mea hoʻohana ke koho i ka manawa holo o kā lākou koho.

He aha ka CNI?

Papahana CNI he kikoʻī e hoʻonohonoho i kahi hoʻonā pūnaewele puni honua no nā pahu Linux. Eia hou, ua komo nā mea hoʻopili, kuleana no nā hana like ʻole i ka hoʻonohonoho ʻana i kahi pūnaewele pod. ʻO ka plugin CNI he faila hiki ke hoʻokō me ka kikoʻī (e kūkākūkā mākou i kekahi mau plugins ma lalo).

ʻO ka hoʻokaʻawale ʻana i nā subnets i nā nodes no ka hāʻawi ʻana i nā helu IP i nā pods

No ka mea, pono e loaʻa i kēlā me kēia pod i loko o kahi pūʻulu kahi IP address, he mea nui e hōʻoia i ke kū hoʻokahi o kēia helu wahi. Loaʻa kēia ma ka hāʻawi ʻana i kēlā me kēia node i kahi subnet kūʻokoʻa, kahi i hāʻawi ʻia ai nā pods ma kēlā node i nā helu IP.

Node IPAM Controller

Inā nodeipam i hala ma ke ʻano he ʻāpana hae --controllers kube-controller-manager, hoʻokaʻawale ia i kahi subnet kaʻawale (podCIDR) i kēlā me kēia node mai ka hui CIDR (ʻo ia hoʻi, ka laulā o nā helu IP no ka pūnaewele cluster). No ka mea, ʻaʻole i uhi ʻia kēia podCIDRs, hiki i kēlā me kēia pod ke hoʻokaʻawale i kahi leka uila IP kūʻokoʻa.

Hāʻawi ʻia kahi node Kubernetes i podCIDR i ka wā i hoʻopaʻa inoa mua ʻia me ka pūʻulu. No ka hoʻololi ʻana i ka podCIDR o nā nodes, pono ʻoe e kāpae iā lākou a laila hoʻopaʻa inoa hou iā lākou, e hana ana i nā hoʻololi kūpono i ka hoʻonohonoho hoʻonohonoho papa mana Kubernetes ma waena. Hiki iā ʻoe ke hōʻike i ka podCIDR o kahi node me ka hoʻohana ʻana i kēia kauoha:

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

Kubelet, pahu holo manawa a me CNI plugins: pehea e hana ai

ʻO ka hoʻonohonoho ʻana i kahi pod ma kēlā me kēia node e pili ana i nā hana hoʻomākaukau. Ma kēia ʻāpana, e nānā wale wau i nā mea pili pono i ka hoʻonohonoho ʻana i kahi pūnaewele pod.

ʻO ka hoʻonohonoho ʻana i kahi pod i kekahi node e hoʻomaka ai i ke kaulahao o nā hanana:

Pehea e loaʻa ai i kahi pod Kubernetes kahi leka uila IP?

Kōkua: Hoʻolālā o Containerd CRI plugins.

Ka pilina ma waena o ka pahu pahu a me nā plugins CNI

Loaʻa i kēlā me kēia mea hoʻolako pūnaewele kāna plugin CNI ponoʻī. Holo ka manawa holo o ka ipu e hoʻonohonoho i ka pūnaewele no ka pod i kona hoʻomaka ʻana. I ka hihia o containerd, ua hoʻokuʻu ʻia ka plugin CNI e ka plugin Containerd CRI.

Eia kekahi, ua loaʻa i kēlā me kēia mea hoʻolako kāna iho ponoʻī. Hoʻokomo ʻia ia ma nā node Kubernetes āpau a nona ke kuleana no ka hoʻonohonoho pūnaewele o nā pods. Hoʻokomo ʻia kēia ʻelele me ka CNI config a i ʻole hana kūʻokoʻa iā ia ma ka node. Kōkua ka config i ka CRI plugin set i CNI plugin e kāhea.

Hiki ke hoʻololi i kahi o ka CNI config; ma ka paʻamau aia i loko /etc/cni/net.d/<config-file>. ʻO nā luna hoʻomalu pū kekahi ke kuleana no ka hoʻokomo ʻana i nā plugins CNI ma kēlā me kēia node cluster. Hiki ke hoʻonohonoho ʻia ko lākou wahi; papa kuhikuhi paʻamau - /opt/cni/bin.

Ke hoʻohana nei i ka containerd, hiki ke hoʻonohonoho ʻia nā ala no ka plugin config a me nā binaries ma ka ʻāpana [plugins.«io.containerd.grpc.v1.cri».cni] в waihona hoʻonohonoho containerd.

No ka mea ke hoʻohana nei mākou iā Flannel ma ko mākou mea hoʻolako pūnaewele, e kamaʻilio liʻiliʻi e pili ana i ka hoʻonohonoho ʻana:

  • Hoʻokomo pinepine ʻia ʻo Flanneld (Flannel's daemon) i loko o kahi pūpū e like me kahi DaemonSet me install-cni e like me pahu init.
  • Install-cni hana faila hoʻonohonoho CNI (/etc/cni/net.d/10-flannel.conflist) ma kēlā me kēia node.
  • Hoʻokumu ʻo Flanneld i kahi mea vxlan, kiʻi i ka metadata pūnaewele mai ka server API, a nānā i nā mea hou pod. Ke hana ʻia nei lākou, hāʻawi ʻo ia i nā ala i nā pods a pau i ka pūʻulu.
  • Hāʻawi kēia mau ala i nā pods e kamaʻilio me kekahi me nā leka IP.

No ka ʻike kikoʻī e pili ana i ka hana a Flannel, manaʻo wau e hoʻohana i nā loulou ma ka hope o ka ʻatikala.

Eia ke kiʻikuhi o ka pilina ma waena o Containerd CRI plugin a me CNI plugins:

Pehea e loaʻa ai i kahi pod Kubernetes kahi leka uila IP?

E like me kāu e ʻike ai ma luna, kāhea ka kubelet i ka plugin Containerd CRI e hana i ka pod, a laila kāhea i ka plugin CNI e hoʻonohonoho i ka pūnaewele o ka pod. I ka hana ʻana pēlā, kāhea ka mea hoʻolako pūnaewele i nā plugins CNI ʻē aʻe e hoʻonohonoho i nā ʻano like ʻole o ka pūnaewele.

Ka pilina ma waena o nā plugins CNI

Aia kekahi mau plugins CNI nona ka hana e kōkua i ka hoʻonohonoho ʻana i ke kamaʻilio pūnaewele ma waena o nā pahu ma ka host. E kūkākūkā kēia ʻatikala i ʻekolu o lākou.

CNI plugin Flannel

Ke hoʻohana nei ʻo Flannel ma ke ʻano he mea hoʻolako pūnaewele, kāhea ka ʻāpana Containerd CRI CNI plugin Flannelme ka hoʻohana ʻana i ka faila hoʻonohonoho 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
      }
    }
  ]
}

Ke hana pū nei ka plugin Flannel CNI me Flanneld. I ka wā hoʻomaka, hoʻihoʻi ʻo Flanneld i ka podCIDR a me nā kikoʻī e pili ana i ka pūnaewele mai ka server API a mālama iā lākou i kahi faila. /run/flannel/subnet.env.

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

Hoʻohana ka plugin Flannel CNI i ka ʻikepili mai /run/flannel/subnet.env e hoʻonohonoho a kāhea i ka CNI bridge plugin.

CNI plugin Bridge

Kāhea ʻia kēia plugin me kēia hoʻonohonoho:

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

Ke kāhea ʻia no ka manawa mua, hana ia i kahi alahaka Linux me «name»: «cni0», i hōʻike ʻia ma ka config. A laila hana ʻia kahi ʻāpana veth no kēlā me kēia pod. Hoʻopili ʻia kekahi ʻaoʻao i ka inoa inoa pūnaewele o ka pahu, ʻo kekahi i loko o ke alahaka Linux ma ka pūnaewele hoʻokipa. CNI plugin Bridge hoʻohui i nā pahu hoʻokipa āpau i kahi alahaka Linux ma ka pūnaewele hoʻokipa.

I ka pau ʻana o ka hoʻonohonoho ʻana i ka veth pair, ua kāhea ka plugin Bridge i ka plugin IPAM CNI host-local. Hiki ke hoʻonohonoho ʻia ke ʻano plugin IPAM ma ka CNI config i hoʻohana ʻia e ka plugin CRI e kāhea i ka plugin Flannel CNI.

Nā mea hoʻokipa IPAM CNI pūnaewele

Kāhea ʻo Bridge CNI mea hoʻokipa IPAM plugin CNI me kēia hoʻonohonoho:

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

Pūnaehana IPAM hoʻokipa (IP Ahale lole Mhoʻoponopono - hoʻokele IP address) hoʻihoʻi i ka IP address no ka ipu mai ka subnet a mālama i ka IP i hāʻawi ʻia ma ka host ma ka papa kuhikuhi i kuhikuhi ʻia ma ka ʻāpana. dataDir - /var/lib/cni/networks/<network-name=cni0>/<ip>. Aia i loko o kēia waihona ka ID o ka pahu kahi i hāʻawi ʻia ai kēia helu IP.

Ke kāhea ʻana i ka plugin IPAM host-local, hoʻihoʻi ia i ka ʻikepili aʻe:

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

Hōʻuluʻulu

Hāʻawi ʻo Kube-controller-manager i kahi podCIDR i kēlā me kēia node. Loaʻa i nā pods o kēlā me kēia node nā leka uila IP mai ka wahi kikoʻī ma ka laulā podCIDR i hoʻokaʻawale ʻia. No ka mea, ʻaʻole i uhi ʻia nā podCIDR o nā nodes, loaʻa nā pods āpau i nā leka uila IP kūʻokoʻa.

Hoʻonohonoho a hoʻokomo ka luna hoʻomalu hui Kubernetes i ke kubelet, ka manawa holo pahu, ka mea hoʻolako pūnaewele, a kope i nā plugins CNI i kēlā me kēia node. I ka wā o ka hoʻomaka ʻana, hoʻopuka ka mea lawelawe pūnaewele i kahi hoʻonohonoho CNI. Ke hoʻonohonoho ʻia kahi pod i kahi node, kāhea ka kubelet i ka plugin CRI e hana ai. A laila, inā hoʻohana ʻia ka containerd, kāhea ka Containerd CRI plugin i ka CNI plugin i kuhikuhi ʻia ma ka CNI config e hoʻonohonoho i ka pūnaewele o ka pod. ʻO ka hopena, loaʻa i ka pod kahi leka uila IP.

Ua lawe iaʻu i kekahi manawa e hoʻomaopopo i nā subtleties a me nā nuances o kēia mau pilina. Manaʻo wau e kōkua kēia ʻike iā ʻoe e hoʻomaopopo i ka hana ʻana o Kubernetes. Inā hewa wau i kekahi mea, e ʻoluʻolu e kelepona mai iaʻu ma Twitter aiʻole ma ka helu wahi [pale ʻia ka leka uila]. E ʻoluʻolu e kelepona aku inā makemake ʻoe e kūkākūkā i nā ʻano o kēia ʻatikala a i ʻole kekahi mea ʻē aʻe. Makemake au e kamaʻilio me ʻoe!

kūmole

Nā pahu a me ka pūnaewele

Pehea ka hana ʻana o Flannel?

CRI a me CNI

PS mai ka unuhi

E heluhelu pū ma kā mākou blog:

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka