Service befindet sich in einem anderen namespace
Ich habe versucht, einen Weg zu finden, um einen service definieren, die in einem Namensraum liegen, dass links zu a-Pod läuft in einem anderen Namensraum. Ich weiß, dass die Behälter in einem Pod läuft in namespaceA
zugreifen können serviceX
definiert in namespaceB
durch Referenzierung in die cluster-DNS als serviceX.namespaceB.svc.cluster.local
, aber ich würde lieber nicht den code in den container benötigen, um wissen über die Lage des serviceX
. Das heißt, ich will den code einfach lookup serviceX
und dann in der Lage sein, darauf zuzugreifen.
Den Kubernetes-Dokumentation deutet darauf hin, dass dies möglich ist. Es sagt, dass einer der Gründe, dass Sie einen service definieren, ohne ein Selektor ist, dass Sie wollen, um Ihren service um eine Dienstleistung in einem anderen Namespace oder auf einem anderen cluster.
Dass bedeutet für mich, dass ich sollte:
- Definieren
serviceX
service innamespaceA
ohne eine Selektor - (da ich den POD auswählen möchten, die nicht innamespaceA
). - Einen service definieren (was ich auch als
serviceX
) innamespaceB
, und dann - Definieren Endpunkte Objekt in
namespaceA
zeigenserviceX
imnamespaceB
.
Es ist dieser Dritte Schritt, dass ich nicht in der Lage zu erreichen.
Erste, ich habe versucht, die Definition der Endpunkte Objekt so:
kind: Endpoints
apiVersion: v1
metadata:
name: serviceX
namespace: namespaceA
subsets:
- addresses:
- targetRef:
kind: Service
namespace: namespaceB
name: serviceX
apiVersion: v1
ports:
- name: http
port: 3000
Schien der logische Ansatz, und offensichtlich was die targetRef
war. Aber, dies führte zu einer Fehlermeldung, dass die ip
Feld in der addresses
array war obligatorisch. So, mein Nächster Versuch war das zuweisen einer festen ClusterIP-Adresse auf serviceX
im namespaceB
und legte es in das IP-Feld (beachten Sie, dass die service_cluster_ip_range
konfiguriert ist, wie 192.168.0.0/16
, und 192.168.1.1
zugewiesen wurde, als die ClusterIP für serviceX
im namespaceB
; serviceX
im namespaceA
wurde automatisch zugewiesen eine andere ClusterIP auf die 192.168.0.0/16
Subnetz):
kind: Endpoints
apiVersion: v1
metadata:
name: serviceX
namespace: namespaceA
subsets:
- addresses:
- ip: 192.168.1.1
targetRef:
kind: Service
namespace: namespaceB
name: serviceX
apiVersion: v1
ports:
- name: http
port: 3000
Angenommen wurde, aber Zugriffe auf serviceX
im namespaceA
nicht weitergeleitet bekommen, um die Hülse in namespaceB
- Sie timed out. Blick auf die iptables einrichten, dass es aussieht wie es wäre zu tun hatte NAT pre-routing zweimal, um zu erreichen, dass.
Das einzige, was ich gefunden habe, die funktioniert, aber ist keine zufriedenstellende Lösung - ist auf Suche die tatsächliche IP-Adresse des Pod bietet serviceX
im namespaceB
und setzen Sie die Adresse in die Endpunkte Objekt in namespaceA
. Das ist nicht zufriedenstellend, weil natürlich der Pod IP-Adresse kann im Laufe der Zeit ändern. Das ist das problem-IPs sind da, um gelöst zu werden.
Gibt es also einen Weg zu treffen, was zu sein scheint das Versprechen der Dokumentation, die ich verweisen kann, der einen Dienst in einen namespace zu einem service läuft in einem anderen namespace?
Einem Kommentator die Frage gestellt, warum würden Sie wollen, dies zu tun - hier ist eine Anwendung, die Sinn macht für mich zumindest:
Sagen, Sie haben ein multi-tenant-system, das umfasst auch eine gemeinsame Daten-access-Funktion, die geteilt werden können zwischen den Mietern. Jetzt Stell dir vor, es gibt verschiedene Varianten von diesem Daten-access-Funktion mit gemeinsamen APIs, aber unterschiedliche Leistungsmerkmale. Einige Mieter erhalten einen Zugang zu einer von Ihnen, die anderen Mieter haben Zugang zu einem anderen.
Jeder Mieter seine Schoten laufen in eigenen namespaces, aber jeder muss Zugang einer dieser common-data-access-Dienste, die unbedingt in einem anderen namespace, da es den Zugriff durch mehrere Mieter). Aber Sie würden nicht wollen, dass der Mieter zu ändern, Ihren code, wenn Sie Ihre Abonnements ändern, um den Zugriff auf die leistungsfähigerer service.
Eine mögliche Lösung (die sauberste eine, die ich an denken kann, wenn es nur so ging) ist, um eine service-definition in jeder Mieter Namensraum für die Daten-Zugriffs-Dienst, mit jeweils konfiguriert für den entsprechenden Endpunkt. Diese service-definition könnte wie folgt konfiguriert werden, um die richtigen Daten-access service jeder Mieter ist berechtigt, zu verwenden.
- der Punkt von Namensräumen ist, zu isolieren, also ich denke, wenn Sie müssen gehen über namespaces, die Sie brauchen, zu wissen, zumindest wo es sich befindet!
- Also, was macht Sie in der Dokumentation zu bedeuten, wenn es vorschlägt, können Sie direkt einen service definiert einen Namensraum für Zugriff auf einen Dienst in einem anderen namespace, indem Sie nicht die Definition eines Auswahl - und, durch Implikation definieren einen Endpunkt? Es gibt sicherlich gültige Anwendungsfälle für diese - eine, die ich Hinzugefügt, um die Frage. Ist die Dokumentation nur irreführend, oder gibt es einen Weg, es zu tun, dass ich noch nicht herausgefunden?
- ich bin mir nicht sicher, sorry. was ich weiß ist, dass ich Zugang zu Dienstleistungen, die in mehreren namespaces mit Ihren fqdn. Ich mache dies vor allem mit vpn, da ich 1 vpn-pod und ich die Verbindung über alle services von der it. jedoch müssen Sie wissen, den namespace und bieten fqdn. ich würde vorschlagen, du fragst auf der slack-Kanal.
- Fqdn ist die Lösung, die ich derzeit benutze. Mein Anwendungsfall wäre besser gedient werden, wenn, (jetzt in Frage zu stellen), wenn dies nicht nötig war.
- Ich Frage mich auch, was die Dokumentation bezieht sich auch, jedoch kann ich die Verwendung von fqdn-eine zufriedenstellende Lösung für meinen Anwendungsfall.
- Ich brauche das genaue Gegenteil! Verhindern namespace-traversal.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stolperte ich über das gleiche Problem und fand eine schöne Lösung, die braucht keine statische ip-Konfiguration:
Können Sie auf einen Dienst zugreifen über DNS-name (wie von dir erwähnte): servicename.namespace.svc.cluster.lokale
Können Sie den DNS-Namen verweisen, in ein weiterer namespace über einen lokalen service:
Es ist so einfach, es zu tun
wenn Sie es verwenden möchten als Gastgeber und möchten, es zu beheben
wird es werden wie :
servicename.namespacename.svc.cluster.local
wird diese Anfrage senden, um bestimmten Dienst innerhalb des namespace, die Sie haben zu erwähnen.
Ex
Hier ersetzen die
<servicename>
und<namespace>
mit dem entsprechenden Wert.In kubernetes namespaces verwenden Sie zum erstellen der virtuellen Umgebung, sondern alle sind miteinander verbunden.
Können Sie erreichen dies durch die Bereitstellung etwas auf einer höheren Ebene als Namespace-Services, wie der service loadbalancer https://github.com/kubernetes/contrib/tree/master/service-loadbalancer. Wenn Sie verhindern möchten, dass es zu einem einzigen namespace, verwenden Sie "--namespace=ns" - argument (standardmäßig alle namespaces: https://github.com/kubernetes/contrib/blob/master/service-loadbalancer/service_loadbalancer.go#L715). Dies funktioniert gut für L7, aber ist ein wenig chaotisch für L4.