Variáveis de ambiente do serviço de Kubernetes

Quando você se comunica com outro serviço no mesmo cluster do Kubernetes, por exemplo, com uma solicitação HTTP, o nome do serviço codificado geralmente é usado na URL da solicitação, mas isso não funcionará em alguns cenários com o Bridge to Kubernetes. Este artigo descreve como usar as variáveis de ambiente do serviço de Kubernetes para especificar a URL de conexão.

Evitar falhas de redirecionamento

O Bridge to Kubernetes redireciona o tráfego modificando a resolução de nome do host para redirecionar o tráfego de rede para sua própria versão dos serviços. O redirecionamento funciona na maioria dos cenários, mas falha caso o processo de Bridge to Kubernetes tenha privilégio restrito, como quando a solicitação se origina de uma conta de usuário não elevada ou ao usar o SSH Remoto do VS Code. Isso ocorre porque, para habilitar a resolução de nomes para serviços redirecionados, o Bridge to Kubernetes precisa modificar o arquivo de hosts, mas isso não é possível quando o Bridge to Kubernetes é executado de uma conta de usuário sem privilégios elevados. Para contornar esse problema, você pode gravar o código para usar as variáveis de ambiente do serviço de Kubernetes em vez de um nome de serviço codificado.

Tabela de variáveis de ambiente

A tabela a seguir mostra as variáveis de ambiente do serviço de Kubernetes que estão disponíveis em qualquer serviço no cluster, para um serviço de exemplo usando o protocolo TCP em uma porta. servicename é o nome do serviço convertido em maiúsculas e com hifens convertidos em sublinhados. Dessa forma, por exemplo, um serviço chamado web-api produz uma variável de ambiente chamada WEB_API_SERVICE_HOST.

Nome Exemplo Descrição
servicename_SERVICE_HOST 10.0.0.11 O nome do host de serviço
servicename_SERVICE_PORT 6379 A porta para o serviço
servicename_PORT tcp://10.0.0.11:6379 A URL com protocolo, endereço IP e porta.
servicename_PORT_portnumber_protocol tcp://10.0.0.11:6379 A URL com protocolo, endereço IP e porta.
servicename_PORT_portnumber_protocol_PROTO TCP O identificador de protocolo.
servicename_PORT_portnumber_protocol_PORT 6379 O número da porta para TCP.
servicename_PORT_portnumber_protocol_ADDR 10.0.0.11 O endereço IP para TCP.

Portanto, se o serviço for nomeado web-api, as variáveis serão WEB_API_SERVICE_HOST e WEB_API_SERVICE_PORT e assim por diante. As variáveis de ambiente padrão criadas pelo Kubernetes estão descritas na Documentação do Kubernetes. Para obter informações sobre os protocolos com suporte, confira Protocolos com suporte.

Variáveis de ambiente no código-fonte

Para permitir que seus serviços sejam executados no Bridge to Kubernetes sem privilégios elevados, substitua quaisquer referências codificadas ao nome do host pela variável de ambiente. O exemplo a seguir mostra isso em um serviço .NET chamado mywebapi gravado em 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);

Um exemplo em Node.js tem esta aparência:

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

Para atualizar o código para usar as variáveis de ambiente, procure todas as ocorrências do nome do host e atualize para usar o valor obtido da variável de ambiente servicename_SERVICE_HOST.

Mesmo que você geralmente não especifique a porta usada pelo serviço de destino ao chamá-la, você precisará usar a variável de ambiente servicename_SERVICE_PORT. A especificação da porta permite que Bridge to Kubernetes evite que os conflitos ocorram quando uma porta específica não está disponível no computador de desenvolvimento. Você não precisa alterar a porta na qual seu serviço escuta para que isso funcione: você só precisa ter certeza de que, quando o serviço chama outros serviços, ele os chama usando as variáveis de ambiente servicename_SERVICE_HOST e servicename_SERVICE_PORT.

É possível reutilizar o mesmo código em outro lugar no cluster, pois essas variáveis de ambiente estão disponíveis em todos os pods do cluster. Se você reutilizar o mesmo código fora de um cluster do Kubernetes, será necessário configurar as variáveis de ambiente equivalentes ou modificar o código adequadamente para a nova plataforma ou serviço de hospedagem.

Definir o VS Code para usar variáveis de ambiente do serviço de Kubernetes

Se você estiver usando o VS Code com um computador remoto ou executando o VS Code como um usuário não administrador, também será necessário configurar o VS Code para usar as variáveis de ambiente do serviço de Kubernetes. Abra tasks.json, localize a tarefa com o rótulo bridge-to-kubernetes.service e adicione a propriedade usekubernetesServiceEnvironmentVariables com o valor true, conforme mostrado no seguinte código:

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

Definir o Visual Studio para usar variáveis de ambiente do serviço de Kubernetes

Se você estiver executando o Visual Studio como um usuário não administrador, também será necessário configurar o Visual Studio para usar as variáveis de ambiente do serviço de Kubernetes. Abra launchSettings.json, localize o perfil com o rótulo Bridge to Kubernetes e adicione a propriedade useKubeServiceEnvironmentVariables com o valor true, conforme mostrado no seguinte código:

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

A configuração só será necessária se você estiver executando o VS Code ou o Visual Studio como um usuário não administrador ou se estiver usando uma sessão remota, mas se você tiver modificado o código conforme descrito neste artigo, não haverá dano na configuração dessa propriedade.

Próximas etapas

Leia mais sobre a configuração do Bridge to Kubernetes em Como configurar o Bridge to Kubernetes.