2017-01-29 5 views
2

Die Frage: Ich habe eine VOIP-Anwendung in einem kubernetes Pod ausgeführt. Ich muss in dem Code die öffentliche IP des Host-Computers festlegen, auf dem der Pod ausgeführt wird. Wie kann ich diese IP über einen API-Aufruf oder eine Umgebungsvariable in kubernetes bekommen? (Ich verwende Google Container Engine, falls dies relevant ist.) Vielen Dank!Wie bekomme ich öffentliche IP für kubernetes pod?

Warum brauche ich das? Die Anwendung ist eine SIP-basierte VOIP-Anwendung. Wenn eine SIP-Anforderung eingeht und einen Handshake durchführt, muss die Anwendung eine SIP-Einladungsanfrage zurücksenden, die die öffentliche IP und den Port enthält, den der Remoteserver verwenden muss, um eine RTP-Verbindung für den Audioteil des Aufrufs einzurichten.

Bitte beachten Sie: Ich bin mir dessen bewusst Kubernetes Dienstleistungen und die allgemeine empfohlene Vorgehensweise derer über einen Load-Balancer auszusetzen. Allerdings würde ich gerne HostNetwork = True verwenden und Ports auf dem Host für die Remote-Anwendung offen legen, um RTP-Audiopakete (via UDP) direkt zu senden. Dieses kubernetes-Problem (https://github.com/kubernetes/kubernetes/issues/23864) enthält eine Diskussion über verschiedene Leute, die SIP-basierte VOIP-Anwendungen auf Kubernetes laufen lassen und das allgemeine Konzessionsrecht ist, HostNetwork = true zu verwenden (hauptsächlich für die Leistung und aufgrund von Einschränkungen des UDP-Lastausgleichs glaube ich).

+0

Hallo - wie Sie an die Gemeinde neu sind Sie vielleicht zu Lesen Sie den Leitfaden [Was soll ich tun, wenn jemand meine Frage beantwortet?] (http://stackoverflow.com/help/someone-answers), um zu erfahren, wie Kommentare und Abstimmungs-/Akzeptanzsysteme hier funktionieren. – pagid

Antwort

1

Sie können den API-Server nach Informationen über den Knoten abfragen, der Ihren Pod wie seine Adressen ausführt. Da Sie hostNetwork = true verwenden, identifiziert die Umgebungsvariable $ HOSTNAME den Knoten bereits.

Es gibt ein Beispiel unten, das auf GCE getestet wurde.

Der Code muss in einem Pod ausgeführt werden. Sie müssen zunächst einige Python-Abhängigkeiten installieren (in der Schote):

pip install kubernetes 

Es siehe weitere Informationen verfügbar: https://github.com/kubernetes-incubator/client-python

import os 
from kubernetes import client, config 

config.load_incluster_config() 
v1=client.CoreV1Api() 
for address in v1.read_node(os.environ['HOSTNAME']).status.addresses: 
    if address.type == 'ExternalIP': 
     print address.address 
+0

Perfect danke Osci Ich kann bestätigen, dass das funktioniert. – mleonard

+0

Schnelle Folgefrage: Ich denke, ein guter Weg, die externe IP in meine App zu bekommen, wäre die Verwendung eines Init-Containers. (siehe https://kubernetes.io/docs/user-guide/pods/init-container/). Was ich nicht sicher bin ist, ob, wenn Sie die IP-Adresse als eine Umgebung var im Init-Container gespeichert haben, könnte der Hauptcontainer dann darauf zugreifen? – mleonard

+1

Auch für jeden, der dies liest: Ich bin sicher, dass dies auch mit dem Go-Client https://github.com/kubernetes/client-go erreicht werden könnte. Der Vorteil wäre, dass Sie dies an einer anderen Stelle in ein einziges Binärverzeichnis kompilieren könnten und daher Python oder andere Abhängigkeiten im Pod nicht benötigen. – mleonard

Verwandte Themen