Compartilhar via


Variáveis de ambiente de serviço do Kubernetes

Nota

O Bridge to Kubernetes será desativado em 30 de abril de 2025. Para obter detalhes sobre a aposentadoria e alternativas de código aberto, consulte o problema do 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.

Evitar falhas de redirecionamento

Bridge to Kubernetes redireciona o tráfego ao modificar a resolução de nomes de host para direcionar 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 de Ponte para 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 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 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. 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
nome_do_serviço_SERVICE_HOST 10.0.0.11 O nome do host de serviço
servicename_SERVICE_PORT 6379 A porta do 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 do TCP.

Portanto, se o serviço for denominado 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 sã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 possam ser executados no Bridge to Kubernetes sem privilégios elevados, substitua as 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 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 seu 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 o nome do serviço _SERVICE_PORT variável de ambiente. Especificar a porta permite que o Bridge to Kubernetes evite os conflitos que ocorrem 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 garantir que, quando o serviço chamar outros serviços, ele os chame usando as variáveis de ambiente nome_de_serviço_SERVICE_HOST e nome_de_serviço_SERVICE_PORT.

Se você reutilizar o mesmo código em outro lugar no cluster, isso é bom, 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 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ó será necessária se você estiver executando o VS Code ou o Visual Studio como um usuário não administrador ou se você estiver usando uma sessão remota, mas se você tiver modificado seu código conforme descrito neste artigo, não haverá nenhum dano na configuração dessa propriedade.

Próximas etapas

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