फली में एक कंटेनर के अंदर से पोड का अपना आईपी पता कैसे पता चलेगा?


96

कुबेरनेट प्रत्येक कंटेनर के लिए एक आईपी पता प्रदान करता है, लेकिन मैं पॉड में एक कंटेनर से आईपी पता कैसे प्राप्त कर सकता हूं? मुझे दस्तावेज़ों से रास्ता नहीं मिला।

संपादित करें: मैं कुबेरनेट्स में एयरोस्पेस क्लस्टर चलाने जा रहा हूं। और कॉन्फिग फाइलों को अपने आईपी एड्रेस की जरूरत होती है। और मैं hostname सेट करने के लिए confd उपयोग करने का प्रयास कर रहा हूं। अगर यह सेट किया गया था तो मैं पर्यावरण चर का उपयोग करूंगा।

जवाबों:


174

सबसे सरल उत्तर यह सुनिश्चित करना है कि आपके पॉड या प्रतिकृति नियंत्रक yaml / json फाइलें पॉड आईपी को पर्यावरण चर के रूप में नीचे परिभाषित ब्लॉक को जोड़कर जोड़ दें। (अतिरिक्त ब्लॉक नीचे फली को नाम और नाम स्थान उपलब्ध कराता है)

env:
- name: MY_POD_NAME
  valueFrom:
    fieldRef:
      fieldPath: metadata.name
- name: MY_POD_NAMESPACE
  valueFrom:
    fieldRef:
      fieldPath: metadata.namespace
- name: MY_POD_IP
  valueFrom:
    fieldRef:
      fieldPath: status.podIP

फली / आरसी को फिर से बनाएँ और फिर कोशिश करें

echo $MY_POD_IP

यह envदेखने के लिए भी दौड़ें कि कुबेरनेट आपको और क्या प्रदान करता है।

चियर्स


1
मैंने अभी आपके समाधान का परीक्षण किया है, और यह सुपर ठीक काम करता है। मुझे 100% यकीन है कि कुबेरनेट्स के पास ऐसा वातावरण चर नहीं है, क्योंकि printenv | grep '10.254.24.167'उपयोगकर्ता परिभाषित चर MY_POD_IP को छोड़कर कुछ भी वापस नहीं करता है। वैसे भी, मेरा वोट ले लीजिए सर :)
एलोआन केरेल-ईवन

1
क्या आपने कभी भी मेजबान के आईपी को लाने की कोशिश की है status.hostIP?
PEDroArthur

@PEdroArthur नहीं, मैंने नहीं किया है, इसे हाल ही में जोड़ा गया है। पुल अनुरोध यहां देखें - github.com/kubernetes/kubernetes/pull/42717
PiersyP

इसे "डाउनवाड एपीआई" कहा जाता है: kubernetes.io/docs/tasks/inject-data-application/…
एलेक

आपका बहुत-बहुत धन्यवाद, यह उत्तर वास्तव में मुझे बहुत बड़ा बना देता है।
लिपिंग हुआंग

27

कुछ स्पष्टीकरण (वास्तव में उत्तर नहीं)

कुबेरनेट्स में, हर पॉड को एक आईपी एड्रेस दिया जाता है, और पॉड में हर कंटेनर को उसी आईपी एड्रेस को असाइन किया जाता है। इस प्रकार, जैसा कि एलेक्स रॉबिन्सन ने अपने जवाब में कहा था , आप बस hostname -iअपने कंटेनर के अंदर उपयोग कर सकते हैं ताकि पॉड आईपी एड्रेस प्राप्त हो सके।

मैंने पॉड के साथ दो डंबल कंटेनरों का परीक्षण किया, और वास्तव hostname -iमें दोनों कंटेनरों के अंदर एक ही आईपी एड्रेस को आउटपुट कर रहा था। इसके अलावा, वह IP प्राप्त करने वाले उपयोग के बराबर थाkubectl describe pod बाहर से जाने वाले , जो पूरी बात IMO को मान्य करता है।

हालाँकि, PiersyP का जवाब मुझे ज्यादा साफ लगता है।

सूत्रों का कहना है

से Kubernetes डॉक्स :

एक फली में आवेदन सभी एक ही नेटवर्क नेमस्पेस (एक ही आईपी और पोर्ट स्पेस) का उपयोग करते हैं, और इस प्रकार एक दूसरे को "खोज" कर सकते हैं और स्थानीयहोस्ट का उपयोग करके संवाद कर सकते हैं। इस वजह से, एक फली में अनुप्रयोगों को बंदरगाहों के अपने उपयोग का समन्वय करना चाहिए। प्रत्येक पॉड में एक फ्लैट साझा नेटवर्किंग स्पेस में एक आईपी एड्रेस होता है जिसका नेटवर्क भर में अन्य भौतिक कंप्यूटरों और पॉड्स के साथ पूर्ण संचार होता है।

कुबेरनेट्स डॉक्स का एक और टुकड़ा :

अब तक इस दस्तावेज़ में कंटेनरों के बारे में बात की गई है। वास्तव में, कुबेरनेट्स पॉड के दायरे में आईपी पते लागू करते हैं - एक पॉड के भीतर कंटेनर अपने आईपी पते सहित अपने नेटवर्क नामस्थानों को साझा करते हैं। इसका मतलब है कि एक पॉड के भीतर कंटेनर सभी स्थानीयहोस्ट पर एक दूसरे के बंदरगाहों तक पहुंच सकते हैं।


25

kubectl describe pods <name of pod> आपको आईपी सहित कुछ जानकारी देगा


12
मुझे लगता है कि सवाल फली / कंटेनर के अंदर से आईपी प्राप्त करने के बारे में है, जहां kubectlउपलब्ध नहीं है।
एलुआन केरील-इवन

16
POD_HOST=$(kubectl get pod $POD_NAME --template={{.status.podIP}})

यह कमांड आपको एक आईपी लौटाएगा


3
आपके उत्तर के लिए धन्यवाद। लेकिन मैं एक पोड में एक कंटेनर में आईपी पता जानना चाहता हूं। इसलिए मैं इसका उपयोग किए बिना जानना चाहता हूं kubectl
याना

14

कंटेनर के आईपी पते को उसके नेटवर्क नेमस्पेस के अंदर ठीक से कॉन्फ़िगर किया जाना चाहिए, ताकि कोई भी मानक लिनक्स टूल इसे प्राप्त कर सके। उदाहरण के लिए, कोशिश के लिए ifconfig, ip addr show, hostname -I, आदि अपने कंटेनर में से एक के भीतर एक संलग्न खोल से इसे बाहर का परीक्षण करने के।


12

आप उपयोग कर सकते हैं

kubectl describe pod `hostname` | grep IP | sed -E 's/IP:[[:space:]]+//'

जो @mibbit के सुझाव पर आधारित है।

यह निम्नलिखित तथ्यों को ध्यान में रखता है:


पाइप न grepकरें sed: kubectl describe pod $POD | sed -nE '/IP/s/IP:[[:space:]]+//p' (लेकिन सेड की तुलना में इसके लिए बेहतर है)
विलियम पर्ससेल

4

sedउपयोग करने के लिए दृष्टिकोण की तुलना में याद रखना और भी सरल है awk

यहाँ एक उदाहरण है, जिसे आप अपने स्थानीय मशीन पर चला सकते हैं:

kubectl describe pod `<podName>` | grep IP | awk '{print $2}'

IP स्वयं आउटपुट के कॉलम 2 पर है, इसलिए $2


4
मुझे लगता है कि यह इसलिए है क्योंकि आप सवाल का जवाब नहीं दे रहे हैं। सवाल यह है कि but how can I acquire the IP address from a container in the Pod? आप मान रहे हैं कि प्रश्न में व्यक्ति kubectlपॉड पर ही है।
सीवान

4
जागने के लिए पाइप न करें:kubectl describe pod $POD | awk '/IP/{print $2}'
विलियम पर्सेल

1

कुछ मामलों में, डाउनवर्ड एपीआई पर निर्भर होने के बजाय, प्रोग्राम को कंटेनर के अंदर से स्थानीय आईपी पते (नेटवर्क इंटरफेस से) पढ़ना भी काम करता है।

उदाहरण के लिए, गोलंग में: https://stackoverflow.com/a/31551220/6247478


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