จะทราบที่อยู่ IP ของ Pod จากภายในคอนเทนเนอร์ใน Pod ได้อย่างไร


96

Kubernetes กำหนดที่อยู่ IP สำหรับแต่ละคอนเทนเนอร์ แต่ฉันจะรับที่อยู่ IP จากคอนเทนเนอร์ใน Pod ได้อย่างไร ฉันไม่พบวิธีจากเอกสาร

แก้ไข: ฉันจะเรียกใช้คลัสเตอร์ Aerospike ใน Kubernetes และไฟล์กำหนดค่าต้องการที่อยู่ IP ของตัวเอง และฉันกำลังพยายามใช้ confd เพื่อตั้งชื่อโฮสต์ ฉันจะใช้ตัวแปรสภาพแวดล้อมหากตั้งค่าไว้

คำตอบ:


175

คำตอบที่ง่ายที่สุดคือตรวจสอบให้แน่ใจว่าไฟล์ pod หรือตัวควบคุมการจำลองของคุณ yaml / json เพิ่ม pod IP เป็นตัวแปรสภาพแวดล้อมโดยการเพิ่มบล็อก config ที่กำหนดไว้ด้านล่าง (บล็อกด้านล่างยังทำให้ชื่อและเนมสเปซพร้อมใช้งานในพ็อด)

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

สร้างพ็อด / rc ใหม่แล้วลอง

echo $MY_POD_IP

ยังวิ่งenvเพื่อดูว่า kubernetes มีอะไรให้คุณอีกบ้าง

ไชโย


1
ฉันเพิ่งทดสอบโซลูชันของคุณและใช้งานได้ดีมาก ฉันแน่ใจ 100% ว่า kubernetes ไม่มีตัวแปรสภาพแวดล้อมดังกล่าวเพราะprintenv | grep '10.254.24.167'จะไม่ส่งคืนอะไรเลยยกเว้นตัวแปรที่ผู้ใช้กำหนดเอง MY_POD_IP ยังไงก็ใช้คะแนนของฉันนะ :)
Elouan Keryell-Even

1
คุณเคยพยายามดึง IP ของโฮสต์ผ่านstatus.hostIPหรือไม่?
PEdroArthur

@PEdroArthur ไม่ฉันไม่มี afaik มันเป็นการเพิ่มล่าสุด ดูคำขอดึงที่นี่ - github.com/kubernetes/kubernetes/pull/42717
PiersyP

เรียกว่า "Downwad API": kubernetes.io/docs/tasks/inject-data-application/…
Alec Istomin

ขอบคุณมากคำตอบนี้ทำให้ฉันรู้สึกแย่มาก
Liping Huang

27

คำชี้แจงบางอย่าง (ไม่ใช่คำตอบจริงๆ)

ใน kubernetes ทุกพ็อดจะได้รับการกำหนดที่อยู่ IP และทุกคอนเทนเนอร์ในพ็อดจะได้รับการกำหนดที่อยู่ IP เดียวกันนั้น ดังนั้นตามที่ Alex Robinson ระบุไว้ในคำตอบของเขาคุณสามารถใช้hostname -iภายในคอนเทนเนอร์ของคุณเพื่อรับที่อยู่ IP ของพ็อด

ฉันทดสอบด้วยพ็อดที่ใช้คอนเทนเนอร์ใบ้สองตัวและแน่นอนว่าhostname -iกำลังส่งออกที่อยู่ IP เดียวกันภายในทั้งสองคอนเทนเนอร์ นอกจากนี้ IP นั้นเทียบเท่ากับ IP ที่ได้รับkubectl describe podจากภายนอกซึ่งตรวจสอบความถูกต้องของ IMO ทั้งหมด

อย่างไรก็ตามคำตอบของ PiersyPดูเหมือนจะสะอาดสำหรับฉันมากขึ้น

แหล่งที่มา

จากkubernetes docs :

แอปพลิเคชันในพ็อดทั้งหมดใช้เนมสเปซเครือข่ายเดียวกัน (IP และพื้นที่พอร์ตเดียวกัน) จึงสามารถ "ค้นหา" ซึ่งกันและกันและสื่อสารโดยใช้ localhost ด้วยเหตุนี้แอปพลิเคชันในพ็อดจึงต้องประสานการใช้งานพอร์ต แต่ละพ็อดมีที่อยู่ IP ในพื้นที่เครือข่ายที่ใช้ร่วมกันแบบแบนซึ่งมีการสื่อสารเต็มรูปแบบกับคอมพิวเตอร์และพ็อดอื่น ๆ ในเครือข่าย

อีกชิ้นจากkubernetes docs :

จนถึงตอนนี้เอกสารนี้ได้พูดถึงตู้คอนเทนเนอร์ ในความเป็นจริง Kubernetes ใช้ที่อยู่ IP ที่ขอบเขต Pod - คอนเทนเนอร์ภายใน Pod จะแชร์เนมสเปซเครือข่ายรวมถึงที่อยู่ IP ด้วย ซึ่งหมายความว่าคอนเทนเนอร์ภายใน Pod สามารถเข้าถึงพอร์ตของกันและกันบน localhost ได้


25

kubectl describe pods <name of pod> จะให้ข้อมูลบางอย่างรวมถึง IP


12
ฉันคิดว่าคำถามเกี่ยวกับการรับ IP จากภายในพ็อด / คอนเทนเนอร์ซึ่งkubectlไม่มีอยู่
Elouan Keryell-Even

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

คำสั่งนี้จะส่งคืน IP ให้คุณ


3
ขอบคุณสำหรับคำตอบ. แต่ฉันต้องการทราบที่อยู่ IP ในคอนเทนเนอร์ใน Pod kubectlดังนั้นผมจึงต้องการที่จะรู้ว่ามันไม่ต้องใช้
yanana

14

ที่อยู่ IP ของคอนเทนเนอร์ควรได้รับการกำหนดค่าอย่างเหมาะสมภายในเนมสเปซเครือข่ายดังนั้นเครื่องมือลินุกซ์มาตรฐานใด ๆ ก็สามารถรับได้ ตัวอย่างเช่นลอง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' (แต่ awk ดีกว่าสำหรับสิ่งนี้)
William Pursell

4

แม้จะจำง่ายกว่าวิธีการคือการใช้งานsedawk

นี่คือตัวอย่างที่คุณสามารถเรียกใช้บนเครื่องของคุณ:

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พ็อดได้
Seivan

4
อย่าท่อ grep ไปที่ awk:kubectl describe pod $POD | awk '/IP/{print $2}'
William Pursell

1

ในบางกรณีแทนที่จะใช้ API ขาลงการอ่านที่อยู่ IP ในเครื่อง (จากอินเทอร์เฟซเครือข่าย) จากภายในคอนเทนเนอร์จะใช้งานได้

ตัวอย่างเช่นใน golang: https://stackoverflow.com/a/31551220/6247478


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.