Variables d’environnement du service Kubernetes

Lorsque vous communiquez avec un autre service dans le même cluster Kubernetes, par exemple avec une requête HTTP, vous utilisez généralement le nom du service codé en dur dans l’URL de la requête, mais cela ne fonctionne pas dans certains scénarios avec Bridge to Kubernetes. Cet article explique comment utiliser les variables d’environnement du service Kubernetes pour spécifier l’URL de connexion.

Éviter les échecs de redirection

Bridge to Kubernetes redirige le trafic en modifiant la résolution de noms d’hôte pour rediriger le trafic réseau vers sa propre version des services. La redirection fonctionne dans la plupart des scénarios, mais échoue dans le cas où le processus Bridge to Kubernetes a des privilèges restreints, par exemple lorsque la demande provient d’un compte d’utilisateur non élevé ou lors de l’utilisation du SSH distant VS Code. En effet, pour activer la résolution de noms pour les services redirigés, Bridge to Kubernetes doit modifier le fichier hosts, mais cela n’est pas possible lorsque Bridge to Kubernetes s’exécute à partir d’un compte d’utilisateur non élevé. Pour contourner ce problème, vous pouvez écrire votre code pour utiliser les variables d’environnement du service Kubernetes au lieu d’un nom de service codé en dur.

Table des variables d’environnement

Le tableau suivant montre les variables d’environnement du service Kubernetes disponibles à partir de n’importe quel service du cluster, pour un exemple de service utilisant le protocole TCP sur un port. servicename est le nom du service, converti en majuscules et avec les traits d’union convertis en traits de soulignement, par exemple, un service nommé web-api génère une variable d’environnement nommée WEB_API_SERVICE_HOST.

Nom Exemple Description
servicename_SERVICE_HOST 10.0.0.11 Le nom de l’hôte de service.
servicename_SERVICE_PORT 6379 Port du service
servicename_PORT tcp://10.0.0.11:6379 URL avec le protocole, l’adresse IP et le port.
servicename_PORT_portnumber_protocol tcp://10.0.0.11:6379 URL avec le protocole, l’adresse IP et le port.
servicename_PORT_portnumber_protocol_PROTO tcp Identificateur de protocole.
servicename_PORT_portnumber_protocol_PORT 6379 Numéro de port pour TCP.
servicename_PORT_portnumber_protocol_ADDR 10.0.0.11 Adresse IP pour TCP.

Par conséquent, si le service est nommé web-api, les variables sont WEB_API_SERVICE_HOST et WEB_API_SERVICE_PORT, et ainsi de suite. Les variables d’environnement par défaut créées par Kubernetes sont décrites dans la documentation Kubernetes. Pour plus d’informations sur les protocoles pris en charge, consultez Protocoles pris en charge.

Variables d’environnement dans le code source

Pour permettre à vos services de s’exécuter dans Bridge to Kubernetes sans privilèges élevés, remplacez toutes les références codées en dur au nom d’hôte par la variable d’environnement. L’exemple suivant montre cela dans un service .NET nommé mywebapi écrit en C# :

    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);

Voici un exemple Node.js :

    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();
    });

Pour mettre à jour votre code afin d’utiliser les variables d’environnement, recherchez les occurrences du nom d’hôte et mettez le code à jour pour utiliser la valeur obtenue à partir de la variable d’environnement servicename_SERVICE_HOST.

Même si vous ne spécifiez généralement pas le port utilisé par le service cible lors de l’appel, vous devez utiliser la variable d’environnement servicename_SERVICE_PORT. La spécification du port permet à Bridge to Kubernetes d’éviter les conflits qui se produisent lorsqu’un port spécifique n’est pas disponible sur l’ordinateur de développement. Vous n’avez pas besoin de modifier le port sur lequel votre service écoute pour que cela fonctionne : vous devez simplement vous assurer que lorsque votre service appelle d’autres services, il les appelle à l’aide des variables d’environnement servicename_SERVICE_HOST et servicename_SERVICE_PORT.

Si vous réutilisez le même code ailleurs dans le cluster, aucun problème, car ces variables d’environnement sont disponibles dans chaque pod du cluster. Si vous réutilisez le même code en dehors d’un cluster Kubernetes, vous devez configurer les variables d’environnement équivalentes ou modifier le code de manière appropriée pour la nouvelle plateforme ou le nouveau service d’hébergement.

Définir VS Code pour utiliser des variables d’environnement de service Kubernetes

Si vous utilisez VS Code avec un ordinateur distant ou exécutez VS Code en tant qu’utilisateur non administrateur, vous devez également configurer VS Code pour utiliser les variables d’environnement du service Kubernetes. Ouvrez tasks.json, recherchez la tâche avec l’étiquette bridge-to-kubernetes.service et ajoutez la propriété usekubernetesServiceEnvironmentVariables avec la valeur true, comme indiqué dans le code suivant :

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

Définir Visual Studio pour utiliser les variables d’environnement de service Kubernetes

Si vous exécutez Visual Studio en tant qu’utilisateur non administrateur, vous devez également configurer Visual Studio pour utiliser les variables d’environnement du service Kubernetes. Ouvrez launchSettings.json, recherchez le profil avec l’étiquette Bridge to Kubernetes et ajoutez la propriété useKubeServiceEnvironmentVariables avec la valeur true, comme indiqué dans le code suivant :

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

Le paramètre n’est nécessaire que si vous exécutez VS Code ou Visual Studio en tant qu’utilisateur non administrateur, ou si vous utilisez une session à distance, mais si vous avez modifié votre code comme décrit dans cet article, la définition de cette propriété ne présente aucun risque.

Étapes suivantes

Pour en savoir plus sur la configuration de Bridge to Kubernetes, consultez le Guide pratique pour configurer Bridge vers Kubernetes.