Bagaimana cara mengetahui alamat IP Pod sendiri dari dalam container di dalam Pod?

96

Kubernetes memberikan alamat IP untuk setiap container, tetapi bagaimana saya bisa mendapatkan alamat IP dari container di Pod? Saya tidak dapat menemukan jalan dari dokumentasi.

Sunting: Saya akan menjalankan cluster Aerospike di Kubernetes. dan file konfigurasi membutuhkan alamat IP-nya sendiri. Dan saya mencoba menggunakan confd untuk menyetel nama host. Saya akan menggunakan variabel lingkungan jika sudah diatur.

yanana
sumber

Jawaban:

174

Jawaban paling sederhana adalah memastikan pod atau pengontrol replikasi file yaml / json Anda menambahkan IP pod sebagai variabel lingkungan dengan menambahkan blok konfigurasi yang ditentukan di bawah. (blok di bawah ini juga membuat nama dan namespace tersedia untuk pod)

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

Buat kembali pod / rc dan kemudian coba

echo $MY_POD_IP

juga jalankan envuntuk melihat apa lagi yang kubernetes sediakan untuk Anda.

Bersulang

PiersyP
sumber
1
Saya baru saja menguji solusi Anda, dan berfungsi dengan sangat baik. Saya 100% yakin kubernetes tidak memiliki variabel lingkungan seperti itu, karena printenv | grep '10.254.24.167'tidak mengembalikan apa pun kecuali variabel yang ditentukan pengguna MY_POD_IP. Pokoknya, ambil suaraku Pak :)
Elouan Keryell-Even
1
Pernahkah Anda mencoba mengambil IP dari host melalui status.hostIP?
PEdroArthur
@PEdroArthur Tidak, saya belum, afaik itu tambahan baru-baru ini. Lihat pull request di sini - github.com/kubernetes/kubernetes/pull/42717
PiersyP
Ini disebut "Downwad API": kubernetes.io/docs/tasks/inject-data-application/…
Alec Istomin
Terima kasih banyak, jawaban ini benar-benar membuat saya menjadi faver yang besar.
Liping Huang
27

Beberapa klarifikasi (bukan jawaban yang sebenarnya)

Di kubernetes, setiap pod diberi alamat IP, dan setiap container di pod diberi alamat IP yang sama. Jadi, seperti yang dinyatakan Alex Robinson dalam jawabannya , Anda bisa menggunakan hostname -idi dalam container Anda untuk mendapatkan alamat IP pod.

Saya menguji dengan pod yang menjalankan dua kontainer bodoh, dan memang hostname -imengeluarkan alamat IP yang sama di dalam kedua kontainer. Selain itu, IP itu setara dengan yang diperoleh menggunakan kubectl describe poddari luar, yang memvalidasi semuanya IMO.

Namun, jawaban PiersyP tampaknya lebih bersih bagi saya.

Sumber

Dari kubernetes docs :

Semua aplikasi di dalam pod menggunakan namespace jaringan yang sama (IP dan ruang port yang sama), dan dengan demikian dapat “menemukan” satu sama lain dan berkomunikasi menggunakan localhost. Karenanya, aplikasi di dalam pod harus mengoordinasikan penggunaan portnya. Setiap pod memiliki alamat IP dalam ruang jaringan bersama yang datar yang memiliki komunikasi penuh dengan komputer fisik dan pod lain di seluruh jaringan.

Bagian lain dari kubernetes docs :

Sampai saat ini dokumen tersebut telah membahas tentang container. Pada kenyataannya, Kubernetes menerapkan alamat IP di lingkup Pod - container di dalam Pod membagikan namespace jaringan mereka - termasuk alamat IP-nya. Ini berarti bahwa kontainer dalam sebuah Pod dapat menjangkau port satu sama lain di localhost.

Elouan Keryell-Even
sumber
25

kubectl describe pods <name of pod> akan memberi Anda beberapa informasi termasuk IP

mibbit
sumber
12
Saya pikir pertanyaannya adalah tentang mendapatkan IP dari dalam pod / container, jika kubectltidak tersedia.
Elouan Keryell-Even
16
POD_HOST=$(kubectl get pod $POD_NAME --template={{.status.podIP}})

Perintah ini akan mengembalikan Anda IP

Anton
sumber
3
Terima kasih atas jawaban anda. Tapi saya ingin tahu alamat IP dalam container di Pod. Jadi saya ingin mengetahuinya tanpa menggunakan kubectl.
yanana
14

Alamat IP penampung harus dikonfigurasi dengan benar di dalam namespace jaringannya, sehingga alat linux standar mana pun bisa mendapatkannya. Misalnya, mencoba ifconfig, ip addr show, hostname -I, dll dari shell yang melekat dalam salah satu wadah untuk menguji itu.

Alex Robinson
sumber
12

Anda bisa menggunakan

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

yang didasarkan pada apa yang disarankan @mibbit.

Ini memperhitungkan fakta-fakta berikut:

Adam Romanek
sumber
Jangan menyalurkan grepke sed: kubectl describe pod $POD | sed -nE '/IP/s/IP:[[:space:]]+//p' (tapi awk lebih baik untuk ini daripada sed)
William Pursell
4

Bahkan lebih sederhana untuk diingat daripada sedpendekatan yang digunakan awk.

Berikut ini contohnya, yang dapat Anda jalankan di komputer lokal Anda:

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

Oleh karena itu, IP itu sendiri ada di kolom 2 output $2.

pusaran angin
sumber
4
Saya berasumsi itu karena Anda tidak menjawab pertanyaan itu. Pertanyaannya adalah but how can I acquire the IP address from a container in the Pod? Anda menganggap orang tersebut memiliki akses ke kubectlpod itu sendiri.
Seivan
4
Jangan menyalurkan grep ke awk:kubectl describe pod $POD | awk '/IP/{print $2}'
William Pursell
1

Dalam beberapa kasus, alih-alih mengandalkan API ke bawah, membaca secara terprogram alamat IP lokal (dari antarmuka jaringan) dari dalam penampung juga berfungsi.

Misalnya, di golang: https://stackoverflow.com/a/31551220/6247478

Kevin
sumber
1
kubectl get pods -o wide

Memberi Anda daftar pod dengan nama, status, ip, node ...

Belen Martin
sumber