Freigeben über


Kubernetes-Dienstumgebungsvariablen

Wenn Sie mit einem anderen Dienst im selben Kubernetes-Cluster kommunizieren, z.B. mit einer HTTP-Anfrage, verwenden Sie normalerweise den fest kodierten Dienstnamen in der URL für die Anfrage, aber das funktioniert in einigen Szenarien mit Bridge to Kubernetes nicht. In diesem Artikel wird beschrieben, wie Sie die Umgebungsvariablen des Kubernetes-Diensts verwenden, um die Verbindungs-URL für anzugeben.

Vermeiden von Umleitungsfehlern

Bridge to Kubernetes leitet Datenverkehr um, indem Sie die Hostnamenauflösung ändern, um den Netzwerkdatenverkehr in ihre eigene Version der Dienste umzuleiten. Die Umleitung funktioniert in den meisten Szenarien, schlägt jedoch fehl, wenn der Bridge to Kubernetes-Prozess eingeschränkte Berechtigungen hat, z. B. wenn die Anforderung aus einem nicht erhöhten Benutzerkonto stammt oder wenn Sie VS Code Remote SSH verwenden. Dies liegt daran, dass die Namensauflösung für umgeleitete Dienste aktiviert werden kann, muss Bridge to Kubernetes die Hosts-Datei ändern, aber das ist nicht möglich, wenn Bridge to Kubernetes von einem nicht erhöhten Benutzerkonto ausgeführt wird. Um dieses Problem zu umgehen, können Sie Ihren Code schreiben, um die Kubernetes-Dienstumgebungsvariablen anstelle eines hartcodierten-Dienstnamens zu verwenden.

Umgebungvariablentabelle

Die folgende Tabelle zeigt die Kubernetes-Dienstumgebungsvariablen, die von jedem Dienst im Cluster verfügbar sind, z. B. einen Dienst mit dem TCP-Protokoll auf einem Port. Der Dienstname ist der Name des Diensts, der in Großbuchstaben konvertiert wird, und mit Bindestrichen, die in Unterstriche konvertiert werden, so dass beispielsweise ein Dienst namens Web-API eine Umgebungsvariable mit dem Namen "WEB_API_SERVICE_HOST" darstellt.

Name Beispiel Beschreibung
servicename_SERVICE_HOST 10.0.0.11 Der Name des Diensts
servicename_SERVICE_PORT 6379 Der Port für den Dienst
servicename_PORT tcp://10.0.0.11:6379 Die URL mit Protokoll, IP-Adresse und Port.
servicename_PORT_portnumber_protocol tcp://10.0.0.11:6379 Die URL mit Protokoll, IP-Adresse und Port.
servicename_PORT_portnumber_protocol_PROTO tcp Die Protokollbezeichnung.
servicename_PORT_portnumber_protocol_PORT 6379 Die Portnummer für TCP.
servicename_PORT_portnumber_protocol_ADDR 10.0.0.11 Die IP-Adresse für TCP.

Wenn der Dienst also web-api genannt wird, sind die Variablen WEB_API_SERVICE_HOST und WEB_API_SERVICE_PORT usw. Die von Kubernetes erstellten Standardumgebungsvariablen werden in der Kubernetes-Dokumentation beschrieben. Informationen zu den unterstützten Protokollen finden Sie unter Unterstützte Protokolle.

Umgebungsvariablen im Quellcode

Wenn Ihre Dienste in Bridge to Kubernetes ohne erhöhte Berechtigungen ausgeführt werden können, ersetzen Sie alle hartcodierten Verweise auf den Hostnamen durch die Umgebungsvariable. Im folgenden Beispiel wird dies in einem .NET-Dienst mit dem Namen "mywebapi" in C# gezeigt:

    using var client = new HttpClient();
    var host = Environment.GetEnvironmentVariable("MYWEBAPI_SERVICE_HOST");
    var port = Environment.GetEnvironmentVariable("MYWEBAPI_SERVICE_PORT");
    var request = new HttpRequestMessage();
    request.RequestUri = new Uri($"http://{host}:{port}/api/data");
    var response = await client.SendAsync(request);

Ein Beispiel in Node.js sieht wie folgt aus:

    server.get("/api/data", function (req, res) {
        var options = {
            host: process.env.MYWEBAPI_SERVICE_HOST,
            port: process.env.MYWEBAPI_SERVICE_PORT,
            path: '/api/data',
            method: 'GET'
        };
        var req = http.request(options, function(response) {
            res.setHeader('Content-Type', 'application/json');
            var responseString = '';
            //another chunk of data has been received, so append it to `responseString`
            response.on('data', function (chunk) {
                responseString += chunk;
            });
            response.on('end', function () {
                res.send(responseString);
            });
        });

        req.on('error', function(e) {
            console.log('problem with request: ' + e.message);
          });

          req.end();
    });

Um Ihren Code für die Verwendung der Umgebungsvariablen zu aktualisieren, suchen Sie nach allen Vorkommen des Hostnamens und aktualisieren Sie ihn, um den Wert aus der Umgebungsvariablen Dienstname _SERVICE_HOST zu verwenden.

Auch wenn Sie den vom Zieldienst verwendeten Port beim Aufrufen normalerweise nicht angeben, müssen Sie die Dienstname_SERVICE_PORT Umgebungsvariable verwenden. Das Angeben des Portes ermöglicht es Bridge to Kubernetes, die Konflikte zu vermeiden, wenn ein bestimmter Port nicht auf dem Entwicklungscomputer verfügbar ist. Sie müssen den Port nicht ändern, auf dem Ihr Dienst dies anhört: Sie müssen nur sicherstellen, dass sie beim Aufrufen anderer Dienste mithilfe des Dienstnamens_SERVICE_HOST und Dienstname_SERVICE_PORT Umgebungsvariablen aufgerufen werden.

Wenn Sie denselben Code an anderer Stelle im Cluster wiederverwenden, ist das gut, da diese Umgebungsvariablen in jedem Pod im Cluster verfügbar sind. Wenn Sie denselben Code außerhalb eines Kubernetes-Clusters wiederverwenden, müssen Sie entweder die entsprechenden Umgebungsvariablen einrichten oder den Code entsprechend für die neue Plattform oder den Hostingdienst ändern.

Legen Sie VS-Code auf die Verwendung von Kubernetes-Dienstumgebungsvariablen fest

Wenn Sie VS Code mit einem Remotecomputer verwenden oder VS Code nicht als Administrator ausführen, müssen Sie VS Code auch zur Verwendung der Kubernetes-Dienstumgebungsvariablen konfigurieren. Öffnen Sie tasks.json, suchen Sie die Aufgabe mit der Bezeichnung bridge-to-kubernetes.service, und fügen Sie die Eigenschaft usekubernetesServiceEnvironmentVariables mit dem Wert truehinzu, wie im folgenden Code dargestellt:

    "tasks": [
        {
            "label": "bridge-to-kubernetes.service",
            "type": "bridge-to-kubernetes.service",
            "service": "bikes",
            "ports": [
                3000
            ],
            "useKubernetesServiceEnvironmentVariables": true
        }
    ]

Einrichten von Visual Studio zur Verwendung von Kubernetes-Dienstumgebungsvariablen

Wenn Sie Visual Studio nicht als Administrator ausführen, müssen Sie Visual Studio auch zur Verwendung der Kubernetes-Dienstumgebungsvariablen konfigurieren. Öffnen Sie die Datei „launchSettings.json“, suchen Sie das Profil Bridge to Kubernetes, und fügen Sie die Eigenschaft useKubeServiceEnvironmentVariables mit dem Wert true hinzu, wie im folgenden Code gezeigt:

   "Bridge to Kubernetes": {
      "commandName": "AzureDevSpacesLocal",
      "launchBrowser": true,
      "useKubeServiceEnvironmentVariables": true
    }

Die Einstellung ist nur erforderlich, wenn Sie VS Code oder Visual Studio nicht als Administrator ausführen oder eine Remotesitzung verwenden. Aber auch wenn Sie Ihren Code wie in diesem Artikel beschrieben geändert haben, schadet es nicht, diese Eigenschaft festzulegen.

Nächste Schritte

Weitere Informationen zur Konfiguration von Bridge to Kubernetes finden Sie unter Konfigurieren von Bridge to Kubernetes.