Переменные среды службы Kubernetes
Заметка
Мост к Kubernetes будет прекращен 30 апреля 2025 года. Дополнительные сведения о прекращении использования и альтернативах с открытым исходным кодом см. в GitHub, вопрос .
При взаимодействии с другой службой в том же кластере Kubernetes, например с HTTP-запросом, обычно используется жестко закодированное имя службы в URL-адресе запроса, но это не будет работать в некоторых сценариях с Bridge to Kubernetes. В этой статье описывается, как использовать переменные среды службы Kubernetes для указания URL-адреса подключения.
Избегайте сбоев перенаправления
Мост к Kubernetes перенаправляет трафик, изменяя разрешение имен узла для перенаправления сетевого трафика в собственную версию служб. Перенаправление работает в большинстве сценариев, но завершается сбоем в случае, когда процесс Bridge to Kubernetes имеет ограниченные привилегии, например, когда запрос поступает из учетной записи пользователя без повышенных привилегий или при использовании удаленного SSH в VS Code. Это связано с тем, что для включения разрешения имен для перенаправленных служб Bridge to Kubernetes необходимо изменить файл hosts, но это невозможно, когда Bridge to Kubernetes запускается из пользовательской учетной записи без повышенных привилегий. Чтобы обойти эту проблему, можно написать код для использования переменных среды службы Kubernetes вместо жестко закодированного имени службы.
Таблица переменных среды
В следующей таблице показаны переменные среды службы Kubernetes, доступные из любой службы в кластере, например служба с помощью протокола TCP через порт. Имя службы — это имя службы, преобразованное в верхний регистр и с дефисами, преобразованными в символы подчеркивания, так что, например, служба с именем веб-API дает переменную среды с именем WEB_API_SERVICE_HOST.
Имя | Пример | Описание |
---|---|---|
[название_службы]_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();
});
Чтобы обновить код для использования переменных среды, найдите все вхождения имени узла и обновите до значения, полученного из переменной среды servicename_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. Откройте launchSettings.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.