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.
ʻ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.
'Ō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 --controllerskube-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:
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:
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.
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.
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.
Pūnaehana IPAM hoʻokipa (IPAhale 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:
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!