Partilhar via


Variáveis de ambiente de serviço do Kubernetes

Observação

Bridge to Kubernetes será aposentado em 30 de abril de 2025. Para obter detalhes sobre a descontinuação e as alternativas open-source, consulte a questão no GitHub.

Quando você se comunica com outro serviço no mesmo cluster do Kubernetes, por exemplo, com uma solicitação HTTP, normalmente usa o nome do serviço codificado 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 de serviço do Kubernetes para especificar a URL de conexão.

Evite falhas de redirecionamento

O Bridge to Kubernetes redireciona o tráfego modificando a resolução de nomes de 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 no caso em que o processo Bridge to Kubernetes tem privilégio restrito, como quando a solicitação se origina de uma conta de usuário não elevada ou ao usar o VS Code Remote SSH. Isso ocorre porque, para habilitar a resolução de nomes para serviços redirecionados, o Bridge to Kubernetes precisa modificar o arquivo hosts, mas isso não é possível quando o Bridge to Kubernetes é executado a partir de uma conta de usuário não elevada. Para contornar esse problema, você pode escrever seu código para usar as variáveis de ambiente de serviço do 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 de serviço do 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. O servicename é o nome do serviço, convertido para maiúsculas e com hífenes convertidos em sublinhados, assim, por exemplo, um serviço chamado web-api produz uma variável de ambiente denominada WEB_API_SERVICE_HOST.

Nome Exemplo Descrição
nome do serviço_SERVICE_HOST 10.0.0.11 O nome do host de serviço
nome do serviço_SERVICE_PORT 6379 A porta para o serviço
nome do serviço_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 O 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 do TCP.

Portanto, se o serviço é chamado web-api, as variáveis são WEB_API_SERVICE_HOST e WEB_API_SERVICE_PORT, e assim por diante. As variáveis de ambiente padrão criadas pelo Kubernetes são descritas na documentação do Kubernetes. Para obter informações sobre os protocolos suportados, consulte Protocolos suportados.

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 escrito 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 se parece com isto:

    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 seu código para usar as variáveis de ambiente, procure por todas as ocorrências do nome do host e atualize para utilizar 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á-lo, você precisará usar o servicename_SERVICE_PORT variável de ambiente. A especificação da porta permite que o Bridge to Kubernetes evite os conflitos que acontecem quando uma porta específica não está disponível na máquina de desenvolvimento. Você não precisa alterar a porta na qual o seu serviço escuta para que isso funcione: só precisa se certificar de que, quando o seu serviço chama outros serviços, ele os chama usando as variáveis de ambiente servicename_SERVICE_HOST e servicename_SERVICE_PORT.

Se você reutilizar o mesmo código em outro lugar do cluster, tudo bem, porque 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 Kubernetes, terá que 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 de serviço do 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 precisará configurar o VS Code para usar as variáveis de ambiente de serviço do 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 código a seguir:

    "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 de serviço do Kubernetes

Se você estiver executando o Visual Studio como um usuário não administrador, também precisará configurar o Visual Studio para usar as variáveis de ambiente de serviço do 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 código a seguir:

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

A configuração só é 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 seu código conforme descrito neste artigo, não há nenhum dano em definir essa propriedade.

Próximos passos

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