గమనిక. అనువాదం.: లింక్డ్ఇన్ నుండి SRE ఇంజనీర్ వ్రాసిన ఈ కథనం, కుబెర్నెట్స్లోని అంతర్గత మాయాజాలం గురించి వివరంగా తెలియజేస్తుంది - మరింత ఖచ్చితంగా, CRI, CNI మరియు kube-apiserver పరస్పర చర్య - ఇది తదుపరి పాడ్కి IP చిరునామాను కేటాయించాల్సిన అవసరం వచ్చినప్పుడు జరుగుతుంది.
ప్రాథమిక అవసరాలలో ఒకటి కుబెర్నెట్స్ నెట్వర్క్ మోడల్ ప్రతి పాడ్ దాని స్వంత IP చిరునామాను కలిగి ఉండాలి మరియు క్లస్టర్లోని ఏదైనా ఇతర పాడ్ తప్పనిసరిగా ఆ చిరునామాలో సంప్రదించగలగాలి. ఈ నెట్వర్క్ మోడల్ను అమలు చేయడంలో సహాయపడే అనేక నెట్వర్క్ "ప్రొవైడర్లు" (ఫ్లాన్నెల్, కాలికో, కెనాల్, మొదలైనవి) ఉన్నాయి.
నేను మొదట కుబెర్నెట్స్తో పనిచేయడం ప్రారంభించినప్పుడు, పాడ్లు వాటి IP చిరునామాలను ఎలా పొందుతాయనేది నాకు పూర్తిగా స్పష్టంగా తెలియలేదు. వ్యక్తిగత భాగాలు ఎలా పనిచేస్తాయో అర్థం చేసుకున్నప్పటికీ, అవి కలిసి పనిచేస్తాయని ఊహించడం కష్టం. ఉదాహరణకు, CNI ప్లగిన్లు దేనికి ఉపయోగపడతాయో నాకు తెలుసు, కానీ వాటిని సరిగ్గా ఎలా పిలుస్తారో నాకు తెలియదు. అందువల్ల, వివిధ నెట్వర్క్ కాంపోనెంట్ల గురించి మరియు అవి కుబెర్నెట్స్ క్లస్టర్లో ఎలా కలిసి పనిచేస్తాయి అనే దాని గురించి జ్ఞానాన్ని పంచుకోవడానికి నేను ఈ కథనాన్ని వ్రాయాలని నిర్ణయించుకున్నాను, ఇది ప్రతి పాడ్కు దాని స్వంత ప్రత్యేక IP చిరునామాను పొందడానికి అనుమతిస్తుంది.
కంటైనర్ల కోసం వేర్వేరు రన్టైమ్ ఎంపికలు ఉన్నట్లే, కుబెర్నెట్స్లో నెట్వర్కింగ్ను నిర్వహించడానికి వివిధ మార్గాలు ఉన్నాయి. ఈ ప్రచురణ ఉపయోగించబడుతుంది ఒక దినుసు సన్నకంబళి క్లస్టర్లో నెట్వర్క్ని నిర్వహించడానికి మరియు ఎక్జిక్యూటబుల్ ఎన్విరాన్మెంట్గా - కంటైనర్. కంటైనర్ల మధ్య నెట్వర్కింగ్ ఎలా పనిచేస్తుందో మీకు తెలుసని నేను ఊహిస్తున్నాను, కాబట్టి నేను కేవలం సందర్భం కోసం క్లుప్తంగా దానిపై టచ్ చేస్తాను.
కొన్ని ప్రాథమిక భావనలు
కంటైనర్లు మరియు నెట్వర్క్: సంక్షిప్త అవలోకనం
నెట్వర్క్లో కంటైనర్లు ఒకదానితో ఒకటి ఎలా సంభాషించుకుంటాయో వివరించే అద్భుతమైన ప్రచురణలు ఇంటర్నెట్లో పుష్కలంగా ఉన్నాయి. అందువల్ల, నేను ప్రాథమిక భావనల యొక్క సాధారణ అవలోకనాన్ని మాత్రమే ఇస్తాను మరియు నన్ను ఒక విధానానికి పరిమితం చేస్తాను, ఇందులో Linux వంతెనను సృష్టించడం మరియు ప్యాకేజీలను సంగ్రహించడం వంటివి ఉంటాయి. కంటైనర్ నెట్వర్కింగ్ అనే అంశం ప్రత్యేక కథనానికి అర్హమైనది కనుక, వివరాలు విస్మరించబడ్డాయి. కొన్ని ప్రత్యేకించి అంతర్దృష్టి మరియు విద్యా సంబంధిత ప్రచురణలకు లింక్లు క్రింద అందించబడతాయి.
ఒక హోస్ట్పై కంటైనర్లు
ఒకే హోస్ట్లో నడుస్తున్న కంటైనర్ల మధ్య IP చిరునామాల ద్వారా కమ్యూనికేషన్ను నిర్వహించడానికి ఒక మార్గం Linux వంతెనను సృష్టించడం. ఈ ప్రయోజనం కోసం, కుబెర్నెట్స్ (మరియు డాకర్)లో వర్చువల్ పరికరాలు సృష్టించబడతాయి. వెత్ (వర్చువల్ ఈథర్నెట్). వెత్ పరికరం యొక్క ఒక చివర కంటైనర్ యొక్క నెట్వర్క్ నేమ్స్పేస్కి, మరొకటి కనెక్ట్ అవుతుంది Linux వంతెన హోస్ట్ నెట్వర్క్లో.
ఒకే హోస్ట్లోని అన్ని కంటైనర్లు ఒక వంతెనకు కనెక్ట్ చేయబడిన వెత్ యొక్క ఒక చివరను కలిగి ఉంటాయి, దీని ద్వారా అవి IP చిరునామాల ద్వారా ఒకదానితో ఒకటి సంభాషించవచ్చు. Linux వంతెన కూడా IP చిరునామాను కలిగి ఉంది మరియు ఇతర నోడ్ల కోసం ఉద్దేశించిన పాడ్ల నుండి ఎగ్రెస్ ట్రాఫిక్కు గేట్వేగా పనిచేస్తుంది.
విభిన్న హోస్ట్లపై కంటైనర్లు
ప్యాకెట్ ఎన్క్యాప్సులేషన్ అనేది IP చిరునామాలను ఉపయోగించి వివిధ నోడ్లలోని కంటైనర్లను ఒకదానితో ఒకటి కమ్యూనికేట్ చేయడానికి అనుమతించే ఒక పద్ధతి. ఫ్లాన్నెల్లో, సాంకేతికత ఈ అవకాశానికి బాధ్యత వహిస్తుంది. vxlan, ఇది ఒరిజినల్ ప్యాకెట్ను UDP ప్యాకెట్గా "ప్యాకేజ్ చేస్తుంది" మరియు దానిని దాని గమ్యస్థానానికి పంపుతుంది.
కుబెర్నెటెస్ క్లస్టర్లో, ఫ్లాన్నెల్ ఒక vxlan పరికరాన్ని సృష్టిస్తుంది మరియు తదనుగుణంగా ప్రతి నోడ్లోని రూట్ టేబుల్ను అప్డేట్ చేస్తుంది. వేరొక హోస్ట్లో కంటైనర్ కోసం ఉద్దేశించబడిన ప్రతి ప్యాకెట్ vxlan పరికరం గుండా వెళుతుంది మరియు UDP ప్యాకెట్లో కప్పబడి ఉంటుంది. గమ్యస్థానంలో, నెస్టెడ్ ప్యాకెట్ సంగ్రహించబడుతుంది మరియు కావలసిన పాడ్కు ఫార్వార్డ్ చేయబడుతుంది.
గమనిక: కంటైనర్ల మధ్య నెట్వర్క్ కమ్యూనికేషన్ని నిర్వహించడానికి ఇది ఒక మార్గం.
CRI అంటే ఏమిటి?
CRI (కంటైనర్ రన్టైమ్ ఇంటర్ఫేస్) విభిన్న కంటైనర్ రన్టైమ్ పరిసరాలను ఉపయోగించడానికి kubeletని అనుమతించే ప్లగ్ఇన్. CRI API వివిధ రన్టైమ్లలో నిర్మించబడింది, కాబట్టి వినియోగదారులు తమకు నచ్చిన రన్టైమ్ను ఎంచుకోవచ్చు.
CNI అంటే ఏమిటి?
ప్రాజెక్ట్ CNI a వివరణ Linux కంటైనర్ల కోసం యూనివర్సల్ నెట్వర్క్ పరిష్కారాన్ని నిర్వహించడానికి. అదనంగా, ఇది కలిగి ఉంటుంది ప్లగిన్లు, పాడ్ నెట్వర్క్ను సెటప్ చేసేటప్పుడు వివిధ విధులకు బాధ్యత వహిస్తుంది. CNI ప్లగ్ఇన్ అనేది స్పెసిఫికేషన్కు అనుగుణంగా ఉండే ఎక్జిక్యూటబుల్ ఫైల్ (మేము క్రింద కొన్ని ప్లగిన్లను చర్చిస్తాము).
పాడ్లకు IP చిరునామాలను కేటాయించడం కోసం నోడ్లకు సబ్నెట్ల కేటాయింపు
క్లస్టర్లోని ప్రతి పాడ్కు తప్పనిసరిగా IP చిరునామా ఉండాలి కాబట్టి, ఈ చిరునామా ప్రత్యేకంగా ఉండేలా చూసుకోవడం చాలా ముఖ్యం. ప్రతి నోడ్కు ఒక ప్రత్యేక సబ్నెట్ను కేటాయించడం ద్వారా ఇది సాధించబడుతుంది, దాని నుండి ఆ నోడ్లోని పాడ్లకు IP చిరునామాలు కేటాయించబడతాయి.
నోడ్ IPAM కంట్రోలర్
ఉన్నప్పుడు nodeipam ఫ్లాగ్ పారామీటర్గా ఆమోదించబడింది --controllerskube-కంట్రోలర్-మేనేజర్, ఇది క్లస్టర్ CIDR నుండి ప్రతి నోడ్కు ప్రత్యేక సబ్నెట్ (podCIDR)ను కేటాయిస్తుంది (అనగా, క్లస్టర్ నెట్వర్క్ కోసం IP చిరునామాల పరిధి). ఈ పాడ్సిఐడిఆర్లు అతివ్యాప్తి చెందవు కాబట్టి, ప్రతి పాడ్కు ప్రత్యేకమైన IP చిరునామాను కేటాయించడం సాధ్యమవుతుంది.
మొదట క్లస్టర్తో రిజిస్టర్ చేయబడినప్పుడు కుబెర్నెటెస్ నోడ్కి పాడ్సిఐడిఆర్ కేటాయించబడుతుంది. నోడ్ల యొక్క పాడ్సిఐడిఆర్ని మార్చడానికి, మీరు వాటి రిజిస్టర్ను రద్దు చేసి, ఆపై వాటిని మళ్లీ నమోదు చేయాలి, మధ్యలో కుబెర్నెట్స్ కంట్రోల్ లేయర్ కాన్ఫిగరేషన్కు తగిన మార్పులు చేయాలి. కింది ఆదేశాన్ని ఉపయోగించి మీరు నోడ్ యొక్క podCIDRని ప్రదర్శించవచ్చు:
$ kubectl get no <nodeName> -o json | jq '.spec.podCIDR'
10.244.0.0/24
కుబెలెట్, కంటైనర్ రన్టైమ్ మరియు CNI ప్లగిన్లు: ఇవన్నీ ఎలా పని చేస్తాయి
ప్రతి నోడ్కు పాడ్ని షెడ్యూల్ చేయడంలో చాలా సన్నాహక దశలు ఉంటాయి. ఈ విభాగంలో, నేను నేరుగా పాడ్ నెట్వర్క్ని సెటప్ చేయడానికి సంబంధించిన వాటిపై మాత్రమే దృష్టి పెడతాను.
పాడ్ను నిర్దిష్ట నోడ్కి షెడ్యూల్ చేయడం క్రింది ఈవెంట్ల గొలుసును ప్రేరేపిస్తుంది:
కంటైనర్ రన్టైమ్ మరియు CNI ప్లగిన్ల మధ్య పరస్పర చర్య
ప్రతి నెట్వర్క్ ప్రొవైడర్కు దాని స్వంత CNI ప్లగ్ఇన్ ఉంటుంది. పాడ్ ప్రారంభమైనప్పుడు దాని కోసం నెట్వర్క్ను కాన్ఫిగర్ చేయడానికి కంటైనర్ యొక్క రన్టైమ్ దాన్ని అమలు చేస్తుంది. కంటైనర్ విషయంలో, CNI ప్లగ్ఇన్ ప్లగ్ఇన్ ద్వారా ప్రారంభించబడుతుంది కంటైనర్డ్ CRI.
అంతేకాకుండా, ప్రతి ప్రొవైడర్కు దాని స్వంత ఏజెంట్ ఉంటుంది. ఇది అన్ని కుబెర్నెట్స్ నోడ్లలో ఇన్స్టాల్ చేయబడింది మరియు పాడ్ల నెట్వర్క్ కాన్ఫిగరేషన్కు బాధ్యత వహిస్తుంది. ఈ ఏజెంట్ CNI కాన్ఫిగర్తో చేర్చబడుతుంది లేదా స్వతంత్రంగా నోడ్లో దీన్ని సృష్టిస్తుంది. కాన్ఫిగర్ CRI ప్లగ్ఇన్ ఏ CNI ప్లగిన్ కాల్ చేయాలో సెట్ చేయడంలో సహాయపడుతుంది.
CNI కాన్ఫిగరేషన్ యొక్క స్థానాన్ని అనుకూలీకరించవచ్చు; డిఫాల్ట్గా అది ఉంది /etc/cni/net.d/<config-file>. ప్రతి క్లస్టర్ నోడ్లో CNI ప్లగిన్లను ఇన్స్టాల్ చేయడానికి క్లస్టర్ నిర్వాహకులు కూడా బాధ్యత వహిస్తారు. వారి స్థానం కూడా అనుకూలీకరించదగినది; డిఫాల్ట్ డైరెక్టరీ - /opt/cni/bin.
కంటైనర్ను ఉపయోగిస్తున్నప్పుడు, ప్లగ్ఇన్ కాన్ఫిగర్ మరియు బైనరీల కోసం మార్గాలను విభాగంలో సెట్ చేయవచ్చు [plugins.«io.containerd.grpc.v1.cri».cni] в కంటైనర్ కాన్ఫిగరేషన్ ఫైల్.
మేము మా నెట్వర్క్ ప్రొవైడర్గా ఫ్లాన్నెల్ని ఉపయోగిస్తున్నందున, దీన్ని సెటప్ చేయడం గురించి కొంచెం మాట్లాడుకుందాం:
ఫ్లాన్నెల్డ్ (ఫ్లాన్నెల్ డెమోన్) సాధారణంగా క్లస్టర్లో డెమోన్సెట్గా ఇన్స్టాల్ చేయబడుతుంది install-cni వంటి init కంటైనర్.
Install-cni సృష్టిస్తుంది CNI కాన్ఫిగరేషన్ ఫైల్ (/etc/cni/net.d/10-flannel.conflist) ప్రతి నోడ్లో.
Flanneld ఒక vxlan పరికరాన్ని సృష్టిస్తుంది, API సర్వర్ నుండి నెట్వర్క్ మెటాడేటాను తిరిగి పొందుతుంది మరియు పాడ్ అప్డేట్లను పర్యవేక్షిస్తుంది. అవి సృష్టించబడినందున, ఇది క్లస్టర్లోని అన్ని పాడ్లకు మార్గాలను పంపిణీ చేస్తుంది.
ఈ మార్గాలు IP చిరునామాల ద్వారా పాడ్లు ఒకదానితో ఒకటి సంభాషించడానికి అనుమతిస్తాయి.
ఫ్లాన్నెల్ యొక్క పని గురించి మరింత వివరమైన సమాచారం కోసం, వ్యాసం చివరిలో ఉన్న లింక్లను ఉపయోగించమని నేను సిఫార్సు చేస్తున్నాను.
Containerd CRI ప్లగిన్ మరియు CNI ప్లగిన్ల మధ్య పరస్పర చర్య యొక్క రేఖాచిత్రం ఇక్కడ ఉంది:
మీరు పైన చూడగలిగినట్లుగా, పాడ్ని సృష్టించడానికి kubelet Containerd CRI ప్లగ్ఇన్ని పిలుస్తుంది, అది పాడ్ నెట్వర్క్ను కాన్ఫిగర్ చేయడానికి CNI ప్లగిన్ని పిలుస్తుంది. అలా చేయడం ద్వారా, నెట్వర్క్ ప్రొవైడర్ యొక్క CNI ప్లగ్ఇన్ నెట్వర్క్ యొక్క వివిధ అంశాలను కాన్ఫిగర్ చేయడానికి ఇతర కోర్ CNI ప్లగిన్లను పిలుస్తుంది.
CNI ప్లగిన్ల మధ్య పరస్పర చర్య
హోస్ట్లోని కంటైనర్ల మధ్య నెట్వర్క్ కమ్యూనికేషన్ను సెటప్ చేయడంలో సహాయపడే వివిధ CNI ప్లగిన్లు ఉన్నాయి. ఈ వ్యాసం వాటిలో మూడు చర్చిస్తుంది.
CNI ప్లగ్ఇన్ ఫ్లాన్నెల్
Flannelని నెట్వర్క్ ప్రొవైడర్గా ఉపయోగిస్తున్నప్పుడు, Containerd CRI కాంపోనెంట్ కాల్ చేస్తుంది CNI ప్లగ్ఇన్ ఫ్లాన్నెల్CNI కాన్ఫిగరేషన్ ఫైల్ ఉపయోగించి /etc/cni/net.d/10-flannel.conflist.
Flannel CNI ప్లగ్ఇన్ Flanneldతో కలిసి పని చేస్తుంది. ప్రారంభ సమయంలో, ఫ్లాన్నెల్డ్ API సర్వర్ నుండి పాడ్సిఐడిఆర్ మరియు ఇతర నెట్వర్క్ సంబంధిత వివరాలను తిరిగి పొందుతుంది మరియు వాటిని ఫైల్లో సేవ్ చేస్తుంది /run/flannel/subnet.env.
మొదటిసారి పిలిచినప్పుడు, ఇది Linux వంతెనను సృష్టిస్తుంది «name»: «cni0», ఇది కాన్ఫిగరేషన్లో సూచించబడింది. అప్పుడు ప్రతి పాడ్ కోసం ఒక వెత్ జత సృష్టించబడుతుంది. దాని యొక్క ఒక చివర కంటైనర్ యొక్క నెట్వర్క్ నేమ్స్పేస్కు కనెక్ట్ చేయబడింది, మరొకటి హోస్ట్ నెట్వర్క్లోని Linux వంతెనలో చేర్చబడింది. CNI ప్లగ్ఇన్ వంతెన అన్ని హోస్ట్ కంటైనర్లను హోస్ట్ నెట్వర్క్లోని Linux వంతెనకు కలుపుతుంది.
వెత్ జతని సెటప్ చేయడం పూర్తి చేసిన తర్వాత, బ్రిడ్జ్ ప్లగ్ఇన్ హోస్ట్-లోకల్ IPAM CNI ప్లగిన్ని పిలుస్తుంది. Flannel CNI ప్లగిన్కి కాల్ చేయడానికి CRI ప్లగిన్ ఉపయోగించే CNI కాన్ఫిగర్లో IPAM ప్లగిన్ రకాన్ని కాన్ఫిగర్ చేయవచ్చు.
హోస్ట్-లోకల్ IPAM ప్లగ్ఇన్ (IPAవస్త్రధారణ Mనిర్వహణ - IP చిరునామా నిర్వహణ) సబ్నెట్ నుండి కంటైనర్ కోసం IP చిరునామాను అందిస్తుంది మరియు విభాగంలో పేర్కొన్న డైరెక్టరీలో హోస్ట్లో కేటాయించిన IPని నిల్వ చేస్తుంది dataDir - /var/lib/cni/networks/<network-name=cni0>/<ip>. ఈ ఫైల్ ఈ IP చిరునామా కేటాయించబడిన కంటైనర్ IDని కలిగి ఉంది.
హోస్ట్-లోకల్ IPAM ప్లగిన్కి కాల్ చేస్తున్నప్పుడు, ఇది క్రింది డేటాను అందిస్తుంది:
Kube-కంట్రోలర్-మేనేజర్ ప్రతి నోడ్కు పాడ్సిఐడిఆర్ను కేటాయిస్తుంది. ప్రతి నోడ్ యొక్క పాడ్లు కేటాయించబడిన పాడ్సిఐడిఆర్ పరిధిలోని చిరునామా స్థలం నుండి IP చిరునామాలను స్వీకరిస్తాయి. నోడ్ల పాడ్సిఐడిఆర్లు అతివ్యాప్తి చెందవు కాబట్టి, అన్ని పాడ్లు ప్రత్యేకమైన IP చిరునామాలను పొందుతాయి.
Kubernetes క్లస్టర్ అడ్మినిస్ట్రేటర్ kubelet, కంటైనర్ రన్టైమ్, నెట్వర్క్ ప్రొవైడర్ ఏజెంట్ను కాన్ఫిగర్ చేస్తుంది మరియు ఇన్స్టాల్ చేస్తుంది మరియు ప్రతి నోడ్కి CNI ప్లగిన్లను కాపీ చేస్తుంది. ప్రారంభ సమయంలో, నెట్వర్క్ ప్రొవైడర్ ఏజెంట్ CNI కాన్ఫిగరేషన్ను రూపొందిస్తుంది. పాడ్ నోడ్కి షెడ్యూల్ చేయబడినప్పుడు, దానిని సృష్టించడానికి kubelet CRI ప్లగిన్ని పిలుస్తుంది. తర్వాత, కంటైనర్ను ఉపయోగించినట్లయితే, పాడ్ నెట్వర్క్ను కాన్ఫిగర్ చేయడానికి CNI కాన్ఫిగరేషన్లో పేర్కొన్న CNI ప్లగ్ఇన్ని Containerd CRI ప్లగ్ఇన్ కాల్ చేస్తుంది. ఫలితంగా, పాడ్ IP చిరునామాను అందుకుంటుంది.
ఈ పరస్పర చర్యల యొక్క అన్ని చిక్కులు మరియు సూక్ష్మ నైపుణ్యాలను అర్థం చేసుకోవడానికి నాకు కొంత సమయం పట్టింది. కుబెర్నెటెస్ ఎలా పనిచేస్తుందో బాగా అర్థం చేసుకోవడానికి ఈ అనుభవం మీకు సహాయపడుతుందని నేను ఆశిస్తున్నాను. నేను ఏదైనా తప్పుగా ఉంటే, దయచేసి నన్ను ఇక్కడ సంప్రదించండి Twitter లేదా చిరునామాలో [ఇమెయిల్ రక్షించబడింది]. మీరు ఈ ఆర్టికల్ లేదా మరేదైనా అంశాలను చర్చించాలనుకుంటే సంకోచించకండి. నేను మీతో చాట్ చేయాలనుకుంటున్నాను!