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:

  1. Definieren serviceX service in namespaceA ohne eine Selektor - (da ich den POD auswählen möchten, die nicht in namespaceA).
  2. Einen service definieren (was ich auch als serviceX) in namespaceB, und dann
  3. Definieren Endpunkte Objekt in namespaceA zeigen serviceX im namespaceB.

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.

Schreibe einen Kommentar