Bir Kapsülün kendi IP adresini Bölmedeki bir kapsayıcıdan nasıl öğrenebilirim?


96

Kubernetes, her bir kapsayıcı için bir IP adresi atar, ancak IP adresini Kapsüldeki bir kapsayıcıdan nasıl alabilirim? Belgelerden yolu bulamadım.

Düzenleme: Kubernetes'te Aerospike kümesini çalıştıracağım. ve yapılandırma dosyalarının kendi IP adresine ihtiyacı vardır. Ve ana bilgisayar adını ayarlamak için confd kullanmaya çalışıyorum. Ayarlanmış olsaydı ortam değişkenini kullanırdım.

Yanıtlar:


175

En basit cevap, pod veya replikasyon denetleyici yaml / json dosyalarınızın, aşağıda tanımlanan yapılandırma bloğunu ekleyerek pod IP'yi bir ortam değişkeni olarak eklemesini sağlamaktır. (aşağıdaki blok ayrıca adı ve ad alanını kapsül için kullanılabilir hale getirir)

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

Pod / rc'yi yeniden oluşturun ve ardından deneyin

echo $MY_POD_IP

ayrıca envkubernetes'in size başka neler sağladığını görmek için çalıştırın .

Şerefe


1
Çözümünüzü az önce test ettim ve çok iyi çalışıyor. Kubernet'lerin böyle bir ortam değişkenine sahip olmadığından% 100 eminim, çünkü printenv | grep '10.254.24.167'kullanıcı tanımlı MY_POD_IP değişkeni dışında hiçbir şey döndürmez. Her neyse, oyumu alın efendim :)
Elouan Keryell-Hatta

1
Hiç ana bilgisayarın IP'sini üzerinden almayı denediniz status.hostIPmi?
PEdroArthur

@PEdroArthur Hayır yok, afaik bu yeni bir ekleme. Çekme talebine buradan bakın - github.com/kubernetes/kubernetes/pull/42717
PiersyP


Çok teşekkür ederim, bu cevap beni gerçekten çok faver yapıyor.
Liping Huang

27

Bazı açıklamalar (gerçekten bir cevap değil)

Kubernetes'te her bölmeye bir IP adresi atanır ve bölmedeki her kapsayıcıya aynı IP adresi atanır. Böylece, Alex Robinson'ın cevabında belirttiği gibi hostname -i, pod IP adresini almak için konteynerinizin içinde kullanabilirsiniz .

İki aptal kapsayıcı çalıştıran bir bölmeyle test ettim ve aslında hostname -iher iki kapsayıcıda da aynı IP adresini veriyordu. Dahası, bu IP, kubectl describe poddışarıdan elde edilene eşdeğerdi ve bu da IMO'nun tamamını doğruluyor.

Ancak PiersyP'nin cevabı bana daha temiz görünüyor.

Kaynaklar

Gönderen Kubernetes docs :

Bir bölmedeki uygulamaların tümü aynı ağ ad alanını (aynı IP ve bağlantı noktası alanı) kullanır ve böylece birbirlerini "bulabilir" ve localhost kullanarak iletişim kurabilir. Bu nedenle, bir bölmedeki uygulamalar bağlantı noktası kullanımlarını koordine etmelidir. Her bölmenin, ağdaki diğer fiziksel bilgisayarlar ve bölmelerle tam iletişim kuran düz bir paylaşılan ağ alanında bir IP adresi vardır.

Kubernetes belgelerinden bir başka parça :

Şimdiye kadar bu belge konteynerlerden bahsetti. Gerçekte, Kubernetes, Kapsül kapsamında IP adreslerini uygular - bir Kapsül içindeki kapsayıcılar, IP adresleri de dahil olmak üzere ağ ad alanlarını paylaşır. Bu, bir Kapsül içindeki konteynerlerin tümünün localhost'ta birbirlerinin bağlantı noktalarına ulaşabileceği anlamına gelir.


25

kubectl describe pods <name of pod> size IP dahil olmak üzere bazı bilgiler verecek


12
Bence soru, IP'yi kubectlmevcut olmayan pod / konteynerin içinden almakla ilgili .
Elouan Keryell-Even

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

Bu komut size bir IP verecektir


3
Cevabınız için teşekkürler. Ancak bir Kapsüldeki kapsayıcıdaki IP adresini bilmek istiyorum. Bu yüzden kullanmadan bilmek istiyorum kubectl.
yanana

14

Konteynerin IP adresi kendi ağ ad alanı içinde uygun şekilde yapılandırılmalıdır, böylece standart linux araçlarından herhangi biri onu alabilir. Örneğin, deneme için ifconfig, ip addr show, hostname -Isenin kapların birinin içinde ekli kabuğundan vb bunu test etmek.


12

Kullanabilirsin

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

@ mibbit'in önerdiği şeye dayanmaktadır.

Bu, aşağıdaki gerçekleri dikkate alır:

  • ana bilgisayar adı, POD'un adına ayarlanmış ancak bu gelecekte değişebilir
  • kubectl konteynere manuel olarak yerleştirildi (muhtemelen görüntü oluşturulduğunda)
  • Kubernetes, Kümeye Erişme / Bir Kapsülden API'ye Erişme , yani /var/run/secrets/kubernetes.io/serviceaccountkapsayıcıda açıklandığı gibi kapsayıcıya bir hizmet hesabı kimlik bilgisi sağlar.

Değil boruyu Do grepiçin sed: kubectl describe pod $POD | sed -nE '/IP/s/IP:[[:space:]]+//p' (ama awk daha iyi bunun için sed daha)
William Pursell

4

sedYaklaşımı kullanmaktan daha hatırlaması daha basit awk.

İşte yerel makinenizde çalıştırabileceğiniz bir örnek:

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

Dolayısıyla IP'nin kendisi çıktının 2. sütunundadır $2.


4
Sanırım soruyu cevaplamadığın için. Buradaki soru, söz but how can I acquire the IP address from a container in the Pod? konusu kişinin kubectlbölmenin kendisine erişimi olduğunu varsaymanızdır .
Seivan

4
Grep'i awk'a göndermeyin:kubectl describe pod $POD | awk '/IP/{print $2}'
William Pursell


1
kubectl get pods -o wide

Size ad, durum, ip, düğüm içeren bir kapsül listesi verin ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.