Переменные среды службы Kubernetes

При взаимодействии с другой службой в том же кластере Kubernetes, например, с помощью HTTP-запроса, вы обычно указываете жестко заданное имя службы в URL-адресе для запроса, но в некоторых сценариях, например, при использовании расширения Bridge to Kubernetes, это не работает. В этой статье описывается, как использовать переменные среды службы Kubernetes для указания URL-адреса подключения.

Предотвращение сбоев перенаправления

Bridge to Kubernetes изменяет маршрут трафика, модифицируя разрешение имен узлов для перенаправления сетевого трафика в собственную версию служб. В большинстве сценариев такое перенаправление работает, но не в случае, когда процесс Bridge to Kubernetes имеет ограниченные привилегии, например, когда запрос поступает из учетной записи пользователя без повышенных привилегий, или при использовании удаленного сеанса SSH VS Code. Это связано с тем, что Bridge to Kubernetes необходимо изменить файл hosts, чтобы включить разрешение имен для перенаправленных служб, но это невозможно, если Bridge to Kubernetes выполняется из учетной записи пользователя без повышенных привилегий. Чтобы обойти эту проблему, можно написать код для использования переменных среды службы Kubernetes вместо жестко заданного имени службы.

Таблица переменных среды

В следующей таблице приведены переменные среды службы Kubernetes, доступные из любой службы в кластере, такие как служба, использующая в порту протокол TCP. имяСлужбы — это имя службы с буквами, преобразованными в прописные, и дефисами, преобразованными в символы подчеркивания. Например, служба с именем web-api даст переменную среды с именем WEB_API_SERVICE_HOST.

Имя. Пример Description
имяСлужбы_SERVICE_HOST 10.0.0.11 Имя узла службы.
имяСлужбы_SERVICE_PORT 6379 Порт для службы.
имяСлужбы_PORT tcp://10.0.0.11:6379 URL-адрес с протоколом, IP-адресом и портом.
имяСлужбы_PORT_номерПорта_протокол tcp://10.0.0.11:6379 URL-адрес с протоколом, IP-адресом и портом.
имяСлужбы_PORT_номерПорта_протокол_PROTO tcp Идентификатор протокола.
имяСлужбы_PORT_номерПорта_протокол_PORT 6379 Номер порта для TCP.
имяСлужбы_PORT_номерПорта_протокол_ADDR 10.0.0.11 IP-адрес для TCP.

Таким образом, если служба называется web-api, она даст переменные WEB_API_SERVICE_HOST и WEB_API_SERVICE_PORT, и т. д. Переменные среды по умолчанию, созданные Kubernetes, описаны в документации Kubernetes. Сведения о поддерживаемых протоколах см. в разделе Поддерживаемые протоколы.

Переменные среды в исходном коде

Чтобы службы могли работать в Bridge to Kubernetes без повышенных привилегий, замените все жестко заданные ссылки на имя узла на переменные среды. В следующем примере это показано в службе .NET с именем mywebapi, написанной на 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);

Пример в 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();
    });

Чтобы выполнить замену на переменные среды в коде, найдите все вхождения имени узла и измените его, чтобы использовалось значение, полученное из переменной среды имяСлужбы_SERVICE_HOST.

Даже если при вызове целевой службы вы обычно не указываете используемый ею порт, необходимо включить переменную среды имяСлужбы_SERVICE_PORT. Указание порта позволяет Bridge to Kubernetes предотвращать конфликты, возникающие при недоступности определенного порта на компьютере разработки. Чтобы это работало, не нужно изменять порт, который прослушивает служба. Достаточно обеспечить, чтобы ваша служба вызывала другие службы с помощью переменных среды имяСлужбы_SERVICE_HOST и имяСлужбы_SERVICE_PORT.

Вы можете повторно использовать тот же код в другом месте кластера, так как эти переменные среды доступны в каждом модуле pod в кластере. Если вы повторно используете тот же код за пределами кластера Kubernetes, необходимо либо настроить аналогичные переменные среды, либо соответствующим образом изменить код для новой платформы или службы размещения.

Настройка VS Code для использования переменных среды службы Kubernetes

Если вы используете VS Code с удаленным компьютером или выполняете VS Code в качестве пользователя, не являющегося администратором, также необходимо настроить VS Code для использования переменных среды службы Kubernetes. Откройте tasks.json, найдите задачу с меткой bridge-to-kubernetes.service и добавьте свойство usekubernetesServiceEnvironmentVariables со значением true, как показано в следующем коде.

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

Настройка Visual Studio для использования переменных среды службы Kubernetes

Если вы используете Visual Studio в качестве пользователя, не являющегося администратором, также необходимо настроить Visual Studio для использования переменных среды службы Kubernetes. Откройте файл launch Параметры.json, найдите профиль с меткой Bridge to Kubernetes и добавьте свойство useKubeServiceEnvironmentVariables со значениемtrue, как показано в следующем коде:

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

Этот параметр необходим только в том случае, если вы используете VS Code или Visual Studio в качестве пользователя, не являющегося администратором, или если вы используете удаленный сеанс, но если вы изменили код, как описано в этой статье, это свойство не вредно.

Следующие шаги

Дополнительные сведения о конфигурации Bridge to Kubernetes см. в разделе Настройка Bridge to Kubernetes.