Kubernetes में ClusterIP, NodePort और LoadBalancer सेवा प्रकारों में क्या अंतर है?


230

1 - मैं डॉक्यूमेंटेशन पढ़ रहा हूं और मैं शब्दांकन से थोड़ा भ्रमित हूं। इसे कहते हैं:

ClusterIP : क्लस्टर-आंतरिक IP पर सेवा का प्रस्ताव करता है। इस मान को चुनने से सेवा केवल क्लस्टर के भीतर से पहुंच योग्य हो जाती है। यह डिफ़ॉल्ट ServiceType है

NodePort : प्रत्येक Node के IP पर एक स्थिर पोर्ट (NodePort) पर सेवा प्रदान करता है। एक क्लस्टर सेवा, जिसमें NodePort सेवा रूट होगी, स्वचालित रूप से बनाई गई है। आप अनुरोध करके, क्लस्टर के बाहर से, NodePort सेवा से संपर्क कर सकेंगे <NodeIP>:<NodePort>

LoadBalancer : क्लाउड प्रदाता के लोड बैलेंसर का उपयोग करके बाहरी रूप से सेवा का प्रस्ताव करता है । NodePort और ClusterIP सेवाएं, जिनके लिए बाहरी लोड बैलेंसर रूट होगा, स्वचालित रूप से बनाई जाती हैं।

क्या NodePort सेवा प्रकार अभी भी ClusterIPकेवल एक अलग पोर्ट पर उपयोग करता है , जो बाहरी क्लाइंट के लिए खुला है? तो क्या इस मामले में भी <NodeIP>:<NodePort>ऐसा ही है <ClusterIP>:<NodePort>?

या क्या NodeIPवास्तव में आईपी तब मिलता है जब आप चलाते हैं kubectl get nodesऔर क्लस्टर आईपी सेवा प्रकार के लिए प्रयुक्त वर्चुअल आईपी नहीं है?

2 - इसके अलावा नीचे दिए गए लिंक से आरेख में:

http://kubernetes.io/images/docs/services-iptables-overview.svg

क्या कोई विशेष कारण Clientहै जो अंदर है Node? मैंने मान लिया कि यह Clusterएक क्लस्टर सेवा प्रकार के मामले में अंदर होना चाहिए ।

यदि एक ही आरेख NodePort के लिए तैयार किया गया था, तो क्या क्लाइंट को पूरी तरह से दोनों के बाहर खींचने के लिए मान्य होगा Nodeऔर क्या Clusterमैं पूरी तरह से बिंदु को याद नहीं कर रहा हूं?

जवाबों:


217

एक क्लस्टर निम्नलिखित को उजागर करता है:

  • spec.clusterIp:spec.ports[*].port

आप केवल क्लस्टर के अंदर ही इस सेवा का उपयोग कर सकते हैं। यह अपने spec.clusterIpबंदरगाह से सुलभ है । यदि कोई spec.ports[*].targetPortसेट है तो वह पोर्ट से टारगेटपोर्ट तक जाएगा। कॉलिंग-आईपी आपको कॉल करते समय मिलता kubectl get servicesहै, आईपी आंतरिक रूप से क्लस्टर के भीतर इस सेवा को सौंपा गया है।

एक NodePort निम्नलिखित को उजागर करता है:

  • <NodeIP>:spec.ports[*].nodePort
  • spec.clusterIp:spec.ports[*].port

यदि आप नोड के बाहरी IP से एक नोडपोर्ट पर इस सेवा का उपयोग करते हैं, तो यह अनुरोध को रूट करेगा spec.clusterIp:spec.ports[*].port, जो spec.ports[*].targetPortसेट होने पर इसे आपके लिए रूट करेगा । इस सेवा को उसी तरह से भी एक्सेस किया जा सकता है जैसे कि क्लस्टर।

आपके NodeIP नोड्स के बाहरी IP पते हैं। आप अपनी सेवा तक नहीं पहुँच सकते <ClusterIP>:spec.ports[*].nodePort

एक LoadBalancer निम्नलिखित को उजागर करता है:

  • spec.loadBalancerIp:spec.ports[*].port
  • <NodeIP>:spec.ports[*].nodePort
  • spec.clusterIp:spec.ports[*].port

आप इस सेवा को अपने लोड बैलेंसर के आईपी पते से एक्सेस कर सकते हैं, जो आपके अनुरोध को नोडपोर्ट पर ले जाता है, जो बदले में क्लस्टरआईपी पोर्ट के लिए अनुरोध करता है। आप इस सेवा का उपयोग कर सकते हैं क्योंकि आप एक NodePort या एक क्लस्टर सेवा भी कर सकते हैं।


3
क्या आप इस पर टिप्पणी कर सकते हैं कि externalIPsयहाँ समीकरण कैसे बदलता है? विशेष रूप से, किसी externalIPsसरणी को एक- ClusterIPटाइप सेवा में असाइन करना संभव है , और फिर सेवा बाहरी आईपी पर भी सुलभ हो जाती है? आप इसे NodePort पर कब चुनेंगे?
बोश

इस सवाल में बाहरी बातों का उल्लेख नहीं है - मुझे लगता है कि आप शायद इसे एक नए प्रश्न के रूप में पोस्ट करके प्रस्तुत करेंगे।
केलनबर्केट

39
यह पोस्ट वास्तव में आधिकारिक कुबर्नेटेस प्रलेखन की तुलना में इन मतभेदों को स्पष्ट करने में अधिक उपयोगी है।
एडप्रिनो

@kellanburket, यह कैसे काम करता है spec.clusterIp:। क्या ClusterIP को स्पष्ट रूप से service.yaml में उल्लिखित किया जा सकता है। और इसी तरहspec.loadBalancerIp
संस्कार

आपने अपने जवाब के साथ मेरा दिन बना दिया, बहुत-बहुत धन्यवाद! (एक पक्ष के रूप में, 2020 में अभी भी नेटवर्किंग प्रलेखन थोड़ा अस्पष्ट है)
user430191

103

सरल स्तर पर 3 के बीच अंतर क्या है, इसकी तलाश करने वाले किसी भी व्यक्ति के लिए। आप अपनी सेवा को न्यूनतम ClusterIp (k8s क्लस्टर के भीतर) या NodePort (क्लस्टर बाहरी से k8s क्लस्टर के भीतर) या LoadBalancer (बाहरी दुनिया या जो आप अपने LB में परिभाषित करते हैं) के साथ बड़ा प्रदर्शन कर सकते हैं।

ClusterIp जोखिम <NodePort जोखिम <LoadBalancer जोखिम

  • ClusterIp
    के माध्यम से सेवा का पर्दाफाश k8s क्लस्टर के साथip/name:port
  • NodePort एक्सपोजर
    सेवा आंतरिक नेटवर्क VM के माध्यम से k8 के लिए भी बाहरी हैip/name:port
  • LoadBalancer बाहरी दुनिया के
    माध्यम से सेवा या जो कुछ भी आपने अपने LB में परिभाषित किया है, उसे उजागर करें।

53

क्लस्टर: सेवाएँ क्लस्टर में पॉड्स / सेवाओं द्वारा पहुंच योग्य हैं
यदि मैं टाइप के डिफ़ॉल्ट नामस्थान में myservice नामक सेवा बनाता हूं: क्लस्टर तब सेवा के लिए निम्न पूर्वानुमानित स्थिर DNS पता बनाया जाएगा:

myservice.default.svc.cluster.local (या सिर्फ myservice.default, या केवल "myservice" काम करेगा डिफ़ॉल्ट नाम स्थान में फली द्वारा)

और DNS नाम केवल क्लस्टर के अंदर पॉड्स और सेवाओं द्वारा हल किया जा सकता है।

NodePort: सेवाएँ उसी LAN / क्लाइंट्स पर क्लाइंट्स द्वारा पहुंच योग्य होती हैं जो K8s होस्ट नोड्स (और क्लस्टर में पॉड्स / सर्विसेज) को पिंग कर सकते हैं (नोट सुरक्षा के लिए आपके k8s होस्ट नोड्स एक निजी सबनेट पर होने चाहिए, इस प्रकार इंटरनेट पर क्लाइंट जीते गए '
मैं इस सेवा तक पहुँचने में सक्षम नहीं हूँ) अगर मैं mynamesportsace नाम के mynamespace नामस्थान में एक सेवा बनाता हूं: 3 नोड Kubernetes क्लस्टर पर NodePort। फिर एक प्रकार की सेवा: ClusterIP बनाई जाएगी और यह क्लस्टर के अंदर ग्राहकों द्वारा निम्नलिखित पूर्वानुमानित स्थिर DNS पते पर उपलब्ध होगी:

mynodeportservice.mynamespace.svc.cluster.local (या सिर्फ mynodeportservice.mynamespace)

प्रत्येक पोर्ट के लिए जो mynodeportservice 30000 की सीमा में एक नोडपोर्ट पर सुनता है - 32767 बेतरतीब ढंग से चुना जाएगा। ताकि बाहरी ग्राहक जो क्लस्टर के बाहर हैं, वह क्लस्टर के अंदर मौजूद क्लस्टर सेवा को हिट कर सकें। कहते हैं कि हमारे 3 K8s होस्ट नोड्स में IP 10.10.10.1, 10.10.10.2, 10.10.10.3 है, Kubernetes सेवा पोर्ट 80 पर सुन रही है, और Nodeport यादृच्छिक पर चुनी गई 31852 थी।

एक क्लाइंट जो क्लस्टर के बाहर मौजूद होता है। 10.10.10.1:31852, 10.10.10.2:31852, या 10.10.10.3:31852 (NodePort के रूप में हर कुबेरनेट्स होस्ट नोड द्वारा सुनी जाती है) Kubeproxy mynodeportservice's port 80 के लिए अनुरोध को अग्रेषित करेगा।

LoadBalancer: सेवाएं इंटरनेट से जुड़े सभी लोगों द्वारा उपलब्ध हैं। (सामान्य वास्तुकला L4 LB सार्वजनिक रूप से इंटरनेट पर DMZ में डालकर या इसे निजी और सार्वजनिक IP और k8s होस्ट नोड्स दोनों को निजी सबनेट पर देने से है)
( नोट: यह एकमात्र सेवा प्रकार है जो 100% कुबेरनेट कार्यान्वयन में काम नहीं करता है, नंगे धातु कुबेरनेट की तरह, यह तब काम करता है जब कुबेरनेट्स में क्लाउड प्रदाता एकीकरण होते हैं।)

यदि आप mylbservice बनाते हैं, तो एक L4 LB VM को स्पैन किया जाएगा (एक क्लस्टर आईपी सेवा, और एक NodePort सेवा को अंतर्निहित रूप से अच्छी तरह से प्रायोजित किया जाएगा)। इस बार हमारा NodePort 30222 है। विचार यह है कि L4 LB में 1.2.3.4 का सार्वजनिक IP होगा और यह निजी IP पतों वाले 3 K8 होस्ट नोड्स के लिए संतुलन और अग्रेषित ट्रैफ़िक लोड करेगा। (10.10.10.1:30222, 10.10.10.2:30222, 10.10.10.3:30222) और फिर क्यूब प्रॉक्सी इसे क्लस्टर के अंदर मौजूद क्लस्टर क्लस्टर की सेवा के लिए अग्रेषित करेगा।


आपने यह भी पूछा: क्या NodePort सेवा प्रकार अभी भी ClusterIP का उपयोग करता है? हां *
या क्या NodeIP वास्तव में IP है जब आप kubectl चलाते हैं नोड मिलते हैं? इसके अलावा हां *

फंडामेंटल के बीच एक परालेंल बनाएं:
एक कंटेनर एक फली के अंदर होता है। एक फली प्रतिकृति के अंदर होती है। एक प्रतिकृति एक तैनाती के अंदर है।
ठीक इसी तरह:
एक क्लस्टर सेवा एक NodePort सेवा का हिस्सा है। एक NodePort सेवा एक लोड बैलेंसर सेवा का हिस्सा है।


आपके द्वारा दिखाए गए आरेख में, क्लाइंट क्लस्टर के अंदर एक पॉड होगा।


आपके अनुवर्ती प्रश्नों के आधार पर, मैं इस धारणा के तहत था कि आप जानना चाहते हैं कि ट्रैफ़िक क्लस्टर में कैसे प्रविष्ट हुआ। यदि आप रुचि रखते हैं तो मैंने उस पर प्रश्नोत्तर बनाने के लिए स्वतंत्रता ली। stackoverflow.com/questions/52241501/…
neokyle

1
अरे, वास्तव में अच्छी व्याख्या, मैं LoadBalancer के बारे में सोच रहा हूं। LoadBalancer किसी भी ट्रैफ़िक को NodeIP: NodePort (वह नोड जो राउंड रॉबिन में अगला है) को फॉरवर्ड करेगा और कॉल उस नोड पर कैसे आगे बढ़ता है? नोड पोर्ट कैसे जानता है कि यह एक सेवा कॉल है और इसे इसे क्यूब-प्रॉक्सी के माध्यम से सेवा के आभासी आईपी में वितरित करना चाहिए? क्या क्यूब-प्रॉक्सी एक साधारण पोर्ट को आगे बढ़ाएगा?
ItFreak

क्यूब-प्रॉक्सी 3 मुख्य भूमिका निभाता है: 1. नोड पर आईपबल्स बनाकर सेवाएं उपलब्ध हैं / काम करते हैं। 2. पॉड की सेवा के लिए नोड पोर्ट को मैप करने के लिए जिम्मेदार है (मेरी समझ यह iptables के माध्यम से है) + पोर्ट रीमैपिंग 3. सुनिश्चित करें कि प्रत्येक पॉड में एक अद्वितीय आईपी है। नोडपोर्ट 1 नोड पर प्रवेश कर सकता है, सेवा की परिभाषा प्रत्येक नोड के iptables में मौजूद है / सेवाएं प्रत्येक नोड पर मौजूद हैं, फली आमतौर पर एक वर्चुअलाइज्ड ओवरले नेटवर्क पर होती हैं, और नोड्स को राउटर के रूप में दोगुना करते हैं, हालांकि यातायात 1 नोड पर आता है। दूसरे नोड पर मौजूदा पॉड में रूट किया जाता है।
नियोक्ले जूल

यह जानने के बाद कि यह किस स्तर से अधिक गहराई से काम करता है, यह व्यर्थ है, क्योंकि कुबेरनेट्स यह मॉड्यूलर टुकड़ों से बना है, और जैसे कि कैसे लिनक्स में फ्लेवर / डिस्ट्रोस हैं जो सभी कुछ ओवररचिंग थीम के साथ थोड़ा अलग काम करते हैं, प्रत्येक k8x डिस्ट्रो थोड़ा अलग है। उदाहरण cilium cni पूरी तरह से क्यूब-प्रॉक्सी को बदलने के लिए देख रहा है, जिसका अर्थ है कि यह पर्दे के पीछे कैसे काम करता है एक चलती लक्ष्य है, इस प्रकार समझने योग्य नहीं है जब तक कि आप वास्तव में परियोजना में योगदान नहीं दे रहे हैं / बग को ठीक करने की कोशिश कर रहे हैं।
नियोक्ले जूल

क्या आपसे संपर्क करने का कोई तरीका है? मैं k8s में सुरक्षा के बारे में एक स्नातक थीसिस लिख रहा हूं और प्रॉक्सी के आंतरिक कार्यों के बारे में सीखना पसंद करूंगा, जैसे कि वह आईपी एड्रेस को नोड्स और पॉड्स में कैसे वितरित करता है और सेवाओं को उनके वर्चुअल आईपी कैसे
मिलते हैं

45

मान लें कि आपने अपने स्थानीय मशीन पर एक उबंटू वीएम बनाया है। यह आईपी एड्रेस 192.168.1.104 है

आप VM में लॉगिन करें, और Kubernetes स्थापित करें। फिर आपने एक पॉड बनाया, जहां उस पर चलने वाली नग्नेक्स छवि।

1-यदि आप अपने वीएम के अंदर इस नगनेक्स फली का उपयोग करना चाहते हैं, तो आप उदाहरण के लिए उस फली से बंधा एक क्लस्टर बना सकते हैं :

$ kubectl expose deployment nginxapp --name=nginxclusterip --port=80 --target-port=8080

फिर अपने ब्राउज़र पर आप पोर्ट के साथ nginxclusterip का IP पता टाइप कर सकते हैं, जैसे:

http://10.152.183.2:80

2-अगर आप अपने होस्ट मशीन से इस नगनेक्स फली को एक्सेस करना चाहते हैं, तो आपको NodePort के साथ अपनी तैनाती को उजागर करना होगा । उदाहरण के लिए:

$ kubectl expose deployment nginxapp --name=nginxnodeport --port=80 --target-port=8080 --type=NodePort

अब अपने मेजबान मशीन से आप जैसे nginx तक पहुँच सकते हैं:

http://192.168.1.104:31865/

मेरे डैशबोर्ड में वे दिखाई देते हैं:

यहां छवि विवरण दर्ज करें

नीचे एक आरेख मूल संबंध दिखाता है।

यहां छवि विवरण दर्ज करें


31865 कहां से आया? उत्पन्न?
होपारण

1
@HoaPhan आप स्पष्ट रूप से अपने पोर्ट को 30000-32767 के बीच में निर्दिष्ट कर सकते हैं या इसे इस रेंज में कुबेरनेट्स द्वारा बेतरतीब ढंग से चुना जा सकता है
मोहम्मद टोरकशवंड

20

यहां तक ​​कि अगर इस सवाल का जवाब पहले से ही है, तो मैं एक और एक, शायद कुछ और चित्रों के साथ एक बेहतर समझ प्रदान करूंगा।

1. क्लस्टरर यह कुबेरनेट्स में डिफ़ॉल्ट प्रकार की सेवा है और यह प्रकार आपको क्लस्टर के अंदर एक सेवा प्रदान करता है। इसका उपयोग करके, क्लस्टर से अन्य एप्लिकेशन कुबेरनेट्स प्रॉक्सी के माध्यम से सेवा तक पहुंच सकते हैं।

मुझे यह उल्लेख करना चाहिए कि इस प्रकार की सेवा का उपयोग उत्पादन सेवाओं को उजागर करने के लिए नहीं किया जाना चाहिए। हालाँकि, इसका उपयोग किया जा सकता है

  • सेवाओं के बीच डिबगिंग एकीकरण;
  • उन आंतरिक सेवाओं तक पहुंच बनाना जो गैर-व्यवसाय से संबंधित डेटा (मॉनिटर डैशबोर्ड) को उजागर कर रहे हैं।

जिस तरह से यह अनुरोध होता है वह निम्नलिखित है: यातायात -> K8s प्रॉक्सी -> K8s सेवा (क्लस्टर) -> फली और यह निम्न चित्र में प्रदर्शित किया गया है।

यहां छवि विवरण दर्ज करें

2. NodePort बाहरी ट्रैफ़िक को स्वीकार करने और इसे कुबेरनेट सेवाओं के लिए अग्रेषित करने का सबसे प्रमुख तरीका है। जैसा कि नाम से प्रतीत होता है, NodePort सेवा प्रकार सभी वर्चुअल मशीनों पर एक विशिष्ट पोर्ट खोलता है, जो वास्तव में Kubernetes नोड्स हैं, ताकि उस विशिष्ट पोर्ट को सेवा में भेजे जाने वाले ट्रैफ़िक को जाने दिया जा सके।

NodePort सेवा प्रकार में कुछ डाउनसाइड हैं:

  • प्रति पोर्ट केवल एक सेवा होना आवश्यक है;
  • यदि वर्चुअल मशीन के आईपी को बदल दिया जाएगा, तो क्लस्टर में कुछ बदलाव किए जाने चाहिए;
  • केवल 3000-32767 के बीच के पोर्ट का उपयोग किया जा सकता है।

जिस तरह से यह अनुरोध किया जाता है वह निम्नलिखित है: ट्रैफ़िक -> पोर्ट वर्चुअल मशीन पर उजागर -> K8s सेवा (NodePort) -> पॉड्स और यह निम्न चित्र में प्रदर्शित होता है:

यहां छवि विवरण दर्ज करें

3. LoadBalancer इंटरनेट की एक सेवा को उजागर करने का मानक तरीका है। यदि आपकी इच्छा सीधे सेवा को उजागर करने की है और विशिष्ट पोर्ट पर सभी ट्रैफ़िक को सेवा के लिए अग्रसर होना है, तो यह ऐसा करने का तरीका है। इसके अलावा, LoadBalancer सेवा प्रकार में कोई फ़िल्टरिंग या राउटिंग शामिल नहीं है। इसके अलावा, आप इसे टीसीपी, यूडीपी, HTTP जीआरपीसी ट्रैफ़िक भेजते हैं।

डाउनसाइड: एक लोडबेलर के माध्यम से उजागर होने वाली प्रत्येक सेवा का अपना आईपी पता होगा और हर सेवा को एक एकल लोडबॉलर के माध्यम से उजागर किया जाएगा जो महंगा हो सकता है।

अनुरोध में निम्न पथ है: यातायात -> LoadBalancer -> K8s सेवा -> पॉड्स और यह निम्न चित्र में प्रदर्शित किया गया है।

यहां छवि विवरण दर्ज करें


7
  1. क्लस्टरआईपी: क्लस्टर के अंदर (डी क्लस्टर के भीतर नोड्स) आईपी सुलभ।
nodeA : pod1 => clusterIP1, pod2 => clusterIP2
nodeB : pod3 => clusterIP3.

पॉड 3 अपने क्लस्टरआईपी नेटवर्क के माध्यम से पॉड 1 से बात कर सकता है।

  1. नोडपोर्ट: नोड के माध्यम से क्लस्टर के बाहर से फली को सुलभ बनाने के लिए: नोडपोर्ट, यह अपने क्लस्टर नेटवर्क के रूप में ऊपर क्लस्टर बनाए / रखेगा।
nodeA => nodeIPA : nodeportX
nodeB => nodeIPB : nodeportX

आप पॉड 1 पर नोडपा: नोडपोर्टएक्स या नोडआईपीबी: नोडपोर्टएक्स के माध्यम से सेवा का उपयोग कर सकते हैं। किसी भी तरह से काम करेगा क्योंकि क्यूब-प्रॉक्सी (जो प्रत्येक नोड में स्थापित है) आपके अनुरोध को प्राप्त करेगा और इसे वितरित करेगा [इसे (अप्रत्यक्ष शब्द)] क्लस्टर डेटा का उपयोग करके नोड्स में।

  1. भार संतुलन

मूल रूप से सिर्फ LB को सामने रखना, ताकि इनबाउंड ट्रैफिक को नोडपा: नोडपोर्टएक्स और नोडआईपीबी: नोडपोर्टएक्स को वितरित किया जाए, फिर ऊपर की प्रक्रिया प्रवाह संख्या 2 के साथ जारी रखें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.