Compartir a través de


Variables de entorno de servicio de Kubernetes

Cuando se comunica con otro servicio en el mismo clúster de Kubernetes, por ejemplo, con una solicitud HTTP, normalmente se usa el nombre de servicio codificado de forma rígida en la dirección URL de la solicitud, pero eso no funcionará en algunos escenarios con Bridge to Kubernetes En este artículo se describe cómo usar las variables de entorno del servicio de Kubernetes para especificar la dirección URL de conexión.

Impedimento de errores de redireccionamiento

Bridge to Kubernetes vuelve a enrutar el tráfico modificando la resolución de nombres de host para redirigir el tráfico de red a su propia versión de los servicios. El redireccionamiento funciona en la mayoría de los escenarios, pero produce un error en el caso de que el proceso de Bridge to Kubernetes tenga privilegios restringidos, como cuando la solicitud se origina en una cuenta de usuario sin privilegios elevados o cuando se usa SSH remoto de VS Code. Esto se debe a que, a fin de habilitar la resolución de nombres para los servicios redirigidos, Bridge to Kubernetes debe modificar el archivo de hosts, pero eso no es posible cuando Bridge to Kubernetes se ejecuta desde una cuenta de usuario sin privilegios elevados. Para solucionar este problema, puede escribir el código a fin de usar las variables de entorno de servicio de Kubernetes en lugar de un nombre de servicio codificado de forma rígida.

Tabla de variables de entorno

En la tabla siguiente se muestran las variables de entorno de servicio de Kubernetes disponibles desde cualquier servicio del clúster, para un servicio de ejemplo mediante el protocolo TCP en un puerto. El elemento servicename es el nombre del servicio, convertido en mayúsculas y con guiones convertidos en caracteres de subrayado, por lo que, por ejemplo, un servicio denominado web-api produce una variable de entorno denominada WEB_API_SERVICE_HOST.

Nombre Ejemplo Descripción
servicename_SERVICE_HOST 10.0.0.11 Nombre del host de servicios
servicename_SERVICE_PORT 6379 Puerto del servicio
servicename_PORT tcp://10.0.0.11:6379 Dirección URL con protocolo, dirección IP y puerto
servicename_PORT_portnumber_protocol tcp://10.0.0.11:6379 Dirección URL con protocolo, dirección IP y puerto
servicename_PORT_portnumber_protocol_PROTO tcp Identificador del protocolo
servicename_PORT_portnumber_protocol_PORT 6379 Número de puerto para TCP
servicename_PORT_portnumber_protocol_ADDR 10.0.0.11 Dirección IP para TCP

Por lo tanto, si el servicio se denomina web-api, las variables son WEB_API_SERVICE_HOST y WEB_API_SERVICE_PORT, etc. Las variables de entorno predeterminadas que crea Kubernetes se describen en la documentación de Kubernetes. Para obtener información sobre los protocolos admitidos, vea Protocolos admitidos.

Variables de entorno en el código fuente

Para permitir que los servicios se ejecuten en Bridge to Kubernetes sin privilegios elevados, reemplace las referencias codificadas de forma rígida en el nombre de host por la variable de entorno. En el ejemplo siguiente esto se muestra en un servicio .NET denominado mywebapi escrito 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);

Un ejemplo de Node.js tiene este aspecto:

    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 actualizar el código a fin de usar las variables de entorno, busque las apariciones del nombre de host y actualícelo para usar el valor obtenido de la variable de entorno servicename_SERVICE_HOST.

Aunque normalmente no especifique el puerto que usa el servicio de destino al llamarlo, deberá usar la variable de entorno servicename_SERVICE_PORT. Especificar el puerto permite que Bridge to Kubernetes evite los conflictos que se producen cuando un puerto específico no está disponible en la máquina de desarrollo. No es necesario cambiar el puerto en el que escucha el servicio para que funcione: solo tiene que asegurarse de que, cuando el servicio llama a otros servicios, los llame mediante las variables de entorno servicename_SERVICE_HOST y servicename_SERVICE_PORT.

Reutilizar el mismo código en otro lugar del clúster es una acción correcta, ya que estas variables de entorno están disponibles en todos los pods del clúster. Si reutiliza el mismo código fuera de un clúster de Kubernetes, debe configurar las variables de entorno equivalentes o modificar el código de forma adecuada para la nueva plataforma o servicio de hospedaje.

Establecimiento de VS Code para usar variables de entorno de servicio de Kubernetes

Si usa VS Code con un equipo remoto o ejecuta VS Code como usuario administrador normal, también debe configurarlo para usar las variables de entorno de servicio de Kubernetes. Abra tasks.json, busque la tarea con la etiqueta bridge-to-kubernetes.service y agregue la propiedad usekubernetesServiceEnvironmentVariables con el valor true, tal como se muestra en el código siguiente:

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

Establecimiento de Visual Studio para usar variables de entorno del servicio Kubernetes

Si ejecuta Visual Studio como usuario no administrador, también debe configurarlo para usar las variables de entorno del servicio Kubernetes. Abra launchSettings.json, busque el perfil con la etiqueta Bridge to Kubernetes y agregue la propiedad useKubeServiceEnvironmentVariables con el valor true, tal como se muestra en el código siguiente:

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

La configuración solo es necesaria si ejecuta VS Code o Visual Studio como usuario no administrador o si usa una sesión remota; pero si ha modificado el código como se describe en este artículo, configurar esta propiedad no hará ningún daño.

Pasos siguientes

Obtenga más información sobre la configuración de Bridge to Kubernetes en Procedimientos para configurar Bridge to Kubernetes.