Kubernetes सेवा परिभाषा में targetPort और पोर्ट के बीच अंतर


130

Kubernetes Serviceमें एक targetPortऔर portसेवा की परिभाषा हो सकती है:

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9376

बीच क्या अंतर है portऔर targetPort?


आप इस सवाल का उल्लेख कर सकते हैं stackoverflow.com/questions/41963433/...
आदित्य Pawaskar

जवाबों:


81

सेवा: यह यातायात को एक फली तक ले जाता है।

TargetPort: यह वास्तविक पोर्ट है जिस पर आपका एप्लिकेशन कंटेनर के अंदर चल रहा है।

पोर्ट: कुछ बार कंटेनर के अंदर आपका एप्लिकेशन अलग पोर्ट पर अलग-अलग सेवाएं प्रदान करता है।

उदाहरण: वास्तविक एप्लिकेशन चल सकता है 8080और इस एप्लिकेशन के लिए स्वास्थ्य जांच 8089कंटेनर के बंदरगाह पर चल सकती है । इसलिए यदि आप पोर्ट के बिना सेवा को हिट करते हैं, तो यह नहीं पता है कि कंटेनर के किस पोर्ट को अनुरोध को रीडायरेक्ट करना चाहिए। सेवा के लिए एक मैपिंग की आवश्यकता होती है ताकि यह कंटेनर के विशिष्ट पोर्ट को हिट कर सके।

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - name: http
      nodePort: 30475
      port: 8089
      protocol: TCP
      targetPort: 8080
    - name: metrics
      nodePort: 31261
      port: 5555
      protocol: TCP
      targetPort: 5555
    - name: health
      nodePort: 30013
      port: 8443
      protocol: TCP
      targetPort: 8085 

यदि आप हिट करते हैं my-service:8089तो ट्रैफ़िक 8080कंटेनर (लक्ष्यपार्ट) पर भेजा जाता है। इसी तरह, यदि आप हिट करते हैं my-service:8443तो इसे 8085कंटेनर (लक्ष्यपॉर्ट) पर रीडायरेक्ट किया जाता है। लेकिन यह myservice:8089कुबेरनेट क्लस्टर के लिए आंतरिक है और इसका उपयोग तब किया जा सकता है जब कोई एप्लिकेशन किसी अन्य एप्लिकेशन के साथ संवाद करना चाहता है। तो क्लस्टर के बाहर से सेवा को हिट करने के लिए किसी को मेजबान मशीन पर पोर्ट को उजागर करने की आवश्यकता होती है, जिस पर कुबेरनेट चल रहा है ताकि कंटेनर के एक पोर्ट पर ट्रैफ़िक पुनर्निर्देशित हो। यह node port(होस्ट मशीन पर पोर्ट उजागर) है। उपरोक्त उदाहरण से, आप क्लस्टर (पोस्टमैन या किसी भी आराम-ग्राहक) के बाहर से सेवा को मार सकते हैंhost_ip:nodePort

अपने मेजबान मशीन आईपी है कहो 10.10.20.20आप द्वारा http, मैट्रिक्स, स्वास्थ्य सेवाओं हिट कर सकते हैं 10.10.20.20:30475, 10.10.20.20:31261, 10.10.20.20:30013

संपादन: रायडवाल की टिप्पणी के अनुसार संपादित ।


4
लाभ क्या है portऔर targetPortअलग होने की अनुमति देता है ? तो उदाहरण के लिए अपने healthउदाहरण को देखते हुए, port 8443इसके बजाय क्यों बनाते हैं 8085? मूल रूप से, targetPortसेवा पर सभी एस को उजागर करने के बजाय दो पैरामीटर क्यों हैं ?
Dan

हाय डैन, आप स्वास्थ्य के लिए पोर्ट और लक्ष्य पोर्ट के रूप में 8443 का उपयोग कर सकते हैं। मैंने बेहतर स्पष्टीकरण के लिए विभिन्न नंबरों का इस्तेमाल किया।
मणिकांत पी।

जवाब देने के लिए धन्यवाद। मेरा मतलब था, किन स्थितियों में उन्हें अलग बनाना उपयोगी होगा?
Dan

"कंटेनर पर चल रहा है" का मतलब है? पोर्ट जो कंटेनर के अंदर सर्वर का उपयोग करता है? या पोर्ट जो कंटेनर के बाहर क्लाइंट उपयोग करते हैं?
राडवल्ड

क्या हम क्लाउड सेवा में 10.10.20.20 की तरह मेजबान मशीन के लिए एक निश्चित आईपी मान सकते हैं? बहु नोड्स परिनियोजन स्थिति के साथ e, g, Azure AKS?
जैश मैथ्यूज

16

यह मुझे सेवा के दृष्टिकोण से चीजों को सोचने में मदद करता है ।

  • nodePort: नोड पर पोर्ट जहां बाहरी ट्रैफ़िक आएगा
  • port: इस सेवा का बंदरगाह
  • targetPort ट्रैफ़िक को अग्रेषित करने के लिए पॉड (ओं) पर लक्ष्य पोर्ट

ट्रैफिक उस सेवा पर nodePortआगे की ओर आता है , portजो फिर पॉड्स targetPortपर जाती है।

यह अधिक जोर देने के लायक nodePortहै जो बाहरी यातायात के लिए है। क्लस्टर में अन्य पॉड्स जिन्हें सेवा का उपयोग करने की आवश्यकता हो सकती है port, वे उपयोग nodePortकरेंगे , न कि यह केवल आंतरिक सेवा तक पहुंच है।

यह भी ध्यान देने योग्य है कि यदि targetPortसेट नहीं किया गया है, तो यह उसी मान के लिए डिफ़ॉल्ट होगा port। उदाहरण के 80:80लिए सर्विस पोर्ट 80लक्ष्य कंटेनर पोर्ट 80


4
अच्छा सारांश है कि कुछ शब्दों में अच्छी तरह से सवाल का जवाब है, धन्यवाद!
वोल्फसन

इस बात से सहमत। मुझे अन्य उत्तर भ्रामक लगे, लेकिन यह एक कील को हिट करता है।
निकोला मालेसीवीक

लोगों के बीच portऔर अंतर जानना चाहते हैं targetPort। आपने वास्तव में भ्रम को दूर किया।
अंकुर गौतम

1
मैं सहमत हूं, मुझे लगता है कि यह "उत्तर" है और ऊपर दिए गए उत्तर अतिरिक्त क्षेत्रों और व्यापक विषयों को खोलते हैं जिससे इसे समझना मुश्किल हो जाता है। चीयर्स जुल्ज़।
वर्प

10

@ मानिकांता पी द्वारा ऊपर दिया गया उत्तर सही है। हालाँकि, "पोर्ट" की व्याख्या पहले पढ़ने में थोड़ी अस्पष्ट हो सकती है। मैं एक उदाहरण के साथ समझाऊंगा:

HTTPc द्वारा होस्ट की गई स्थिर सामग्री (सामने का पृष्ठ, चित्र आदि) के साथ एक वेब-एप्लिकेशन पर विचार करें और tomcat द्वारा होस्ट की गई गतिशील सामग्री (जैसे अनुरोधों पर प्रतिक्रिया आदि)। वेबसर्वर (या स्टैटिक कंटेंट) httpd द्वारा पोर्ट पर परोसा जाता है 80जबकि Appserver (या डायनामिक कंटेंट) को पोर्ट पर tomcat द्वारा परोसा जाता है 8080

एक डेवलपर क्या चाहता है: उपयोगकर्ता को बाहर से वेबसर्वर का उपयोग करने में सक्षम होना चाहिए न कि बाहर से आने वाले को।

समाधान: इसकी सेवा में वेबसर्वर का सेवा-प्रकार। NlPode होगा, जबकि सेवा का प्रकार- Appserver अपनी सेवा में होगा। इसका नाम ClusterIP होगा।

वेबसर्वर की सेवा के लिए कोड ।ym:

spec:
  selector:
    app: Webserver
  type: NodePort        // written to make this service accessible from outside.
  ports:
    - nodePort: 30475   // To access from outside, type <host_IP>:30475 in browser.
      port: 5050        // (ignore for now, I will explain below).
      protocol: TCP
      targetPort: 80  // port where httpd runs inside the webserver pod.

Appserver's service.yml के लिए कोड

spec:
  selector:
    app: appserver
  type: ClusterIP        // written to make this service NOT accessible from outside.
  ports:
    - port: 5050         // port to access this container internally
      protocol: TCP
      targetPort: 8080   // port where tomcat runs inside the appserver pod.

यह भी ध्यान दें, httpd.confवेबसर्वर की फाइल में, हम आईपी को लिखेंगे जो उपयोगकर्ता के अनुरोध को अप्रत्यक्ष रूप से पुनर्निर्देशित करता है। यह IP हो जाएगा: host_IP:5050

यहाँ वास्तव में क्या हो रहा है? एक उपयोगकर्ता hostIP:30475वेबसर्वर के पेज को लिखता है और देखता है। ऐसा इसलिए है क्योंकि यह httpd पर पोर्ट 80(लक्ष्य) द्वारा परोसा जा रहा है । जब कोई उपयोगकर्ता एक बटन क्लिक करता है, तो एक अनुरोध किया जाता है। यह अनुरोध Appserver में पुनर्निर्देशित है क्योंकि httpd.confफ़ाइल में, पोर्ट 5050का उल्लेख किया गया है और यह वह पोर्ट है जहां Appserver के कंटेनर और Webserver के कॉनटेनर आंतरिक रूप से संवाद करते हैं। जब आब्जर्वर को अनुरोध प्राप्त होता है, तो वह पोर्ट में इसके अंदर चल रहे टेंकैट के कारण अनुरोध को पूरा करने में सक्षम होता है 8080


4
वेबसर्वर कल्पना 'पोर्ट: 5050' को क्यों परिभाषित करती है? अगर मुझे सही तरीके से समझ में आया, वेबसर्वर appserver को कॉल करता है: 5050, आसपास का दूसरा तरीका नहीं ...?
एवर्टन

1
एवर्टन के सवाल के अलावा, पोर्ट 8080 पर आंतरिक अनुरोधों की सेवा करने के लिए टॉमकैट को पोर्ट 8080 खोलने की आवश्यकता क्या है?
स्टीफन

यह उत्तर भ्रमित करने वाला है। इसके अलावा जहां httpd.conf"क्योंकि httpd.conf फ़ाइल में है, पोर्ट 5050 का उल्लेख किया गया है"
पॉलिमरेज़

@ पॉलीमरेज़ httpd.conf फ़ाइल आपके सिस्टम पर आपके द्वारा स्थापित httpd पैकेज के साथ आती है। यह एक आंतरिक फ़ाइल है जिसे आपको कॉन्फ़िगर करना होगा। पथ: /etc/httpd/conf/http.conf
matak8s

@ Tomcat / conf / server.xml में स्टीफन, हम एक पोर्ट निर्दिष्ट करते हैं, जिस पर टॉमकैट सेवा चलेगी। यह वही पोर्ट नंबर है जिसे हम टारगेट पोर्ट के रूप में लिखते हैं ताकि कुबेरनेट्स समझ जाए कि उसे उस पोर्ट पर टॉमकैट सर्विस को स्पिन करना है। अगर मैं ग़लत हूं तो मेरी गलती सुझाएं।
मटका 8

1

यह उत्तर अन्य उत्तरों के अलावा कुबेरनेट के दस्तावेज़ीकरण को संदर्भित करने के लिए है:

https://kubernetes.io/docs/concepts/services-networking/connect-applications-nervice/ :

targetPort: पोर्ट वह कंटेनर है जो ट्रैफ़िक स्वीकार करता है,

port: एब्स्ट्रक्टेड सर्विस पोर्ट है, जो सर्विस को एक्सेस करने के लिए किसी भी अन्य पोर्ट का उपयोग कर सकता है

https://kubernetes.io/docs/concepts/services-networking/connect-applications-nervice/ :

पॉड्स में पोर्ट परिभाषाओं के नाम हैं, और आप इन नामों targetPortको किसी सेवा की विशेषता में संदर्भित कर सकते हैं । यह तब भी काम करता है, जब किसी एकल कॉन्फ़िगर नाम का उपयोग करके सेवा में पॉड्स का मिश्रण हो, जिसमें समान पोर्ट प्रोटोकॉल विभिन्न पोर्ट नंबरों के माध्यम से उपलब्ध हो।


संक्षिप्त उत्तर के लिए धन्यवाद
अंकुर गौतम

1

संक्षेप में

nodeport: निटिप पर सभी कार्यकर्ता नोड्स पर बाहरी अनुरोध को सुनता है: पोर्ट के अनुरोध को पोर्ट करें।

port: कंटेनर के लिए आंतरिक क्लस्टर सेवा पोर्ट और नोडपोर्ट से आने वाले अनुरोध को सुनता है और टारगेटपोर्ट को फॉरवर्ड करता है।

targetPort:पोर्ट और फ़ॉरवर्ड से कंटेनर पॉड (पोर्ट) के लिए अनुरोध प्राप्त करें जहां यह सुन रहा है। यहां तक ​​कि अगर आप यह निर्दिष्ट नहीं करते हैं कि डिफ़ॉल्ट रूप से पोर्ट के समान पोर्ट नंबर दिए जाएंगे।


0

"लक्ष्य बंदरगाह" वह बंदरगाह है जिस पर आपका कंटेनर चल रहा है।

पोर्ट: पोर्ट सेवा से कंटेनर में ट्रैफ़िक पुनर्निर्देशित करता है।

परिनियोजन को उजागर करना

  master $ kubectl get deployments
NAME         READY   UP-TO-DATE   AVAILABLE   AGE

nginx        1/1     1            1           31s
master $ kubectl expose deployment nginx --name=nginx-svc --port=8080 --target-port=80
service/nginx-svc exposed

master $ kubectl get svc

NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE

nginx-svc    ClusterIP   10.107.209.151   <none>        8080/TCP   5s

NodePort: वह पोर्ट है जो सेवा को बाहरी रूप से एक्सेस करने में सक्षम बनाता है।

उम्मीद है कि यह जवाब


0

यदि कंटेनर पोर्ट 9376 पर सुनता है, तो लक्ष्य : 9376

यदि कोई सेवा पोर्ट 80 पर सुनती है, तो पोर्ट 80 पर

फिर सर्विस पोर्ट्स कॉन्फ़िगरेशन नीचे की तरह दिखता है

ports:
 - protocol: TCP
   port: 80
   targetPort: 9376

अंत में, अनुरोध सेवा के बंदरगाह को प्राप्त हुआ , और फली के लक्ष्य पर आगे बढ़ा दिया गया।

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