Kubernetes 服务环境变量

注意

Bridge to Kubernetes 将于 2025 年 4 月 30 日停用。 有关停用和开源替代项的详细信息,请参阅 GitHub 问题

当在同一 Kubernetes 群集中与另一个服务通信时,例如通过 HTTP 请求,通常会在请求的 URL 中使用硬编码的服务名称,但在某些场景下,Bridge to Kubernetes 无法正常工作。 本文介绍如何使用 Kubernetes 服务环境变量来指定连接 URL。

避免重定向失败

Bridge to Kubernetes 通过修改主机名解析将网络流量重定向到其自己的服务版本来重新路由流量。 重定向在大多数情况下有效,但在 Bridge to Kubernetes 进程具有受限权限的情况下(例如请求源自非提升的用户帐户或使用 VS Code 远程 SSH 时)失败。 原因是,为了启用重定向服务的名称解析,Bridge to Kubernetes 需要更改主机文件,但 Bridge to Kubernetes 以非提升用户帐户运行时不可行。 若要解决此问题,可以编写代码以使用 Kubernetes 服务环境变量,而不是硬编码的服务名称。

环境变量表

下表显示了可从群集中的任何服务获取的 Kubernetes 服务环境变量,例如在端口上使用 TCP 协议的示例服务。 servicename 是服务的名称(已转换成大写,并将连字符转换为下划线),例如,名为 web-api 的服务生成名为 WEB_API_SERVICE_HOST 的环境变量。

名字 描述
servicename_SERVICE_HOST 10.0.0.11 服务主机的名称
servicename_SERVICE_PORT 6379 服务的端口
servicename_PORT tcp://10.0.0.11:6379 具有协议、IP 地址和端口的 URL。
servicename_PORT_portnumber_protocol tcp://10.0.0.11:6379 具有协议、IP 地址和端口的 URL。
servicename_PORT_portnumber_protocol_PROTO tcp 协议标识符。
servicename_PORT_portnumber_protocol_PORT 6379 TCP 的端口号。
servicename_PORT_portnumber_protocol_ADDR 10.0.0.11 TCP 的 IP 地址。

因此,如果服务命名为 Web API,则变量WEB_API_SERVICE_HOST和WEB_API_SERVICE_PORT等。 kubernetes 创建的默认环境变量在 Kubernetes 文档中介绍。 有关支持的协议的信息,请参阅 支持的协议

源代码中的环境变量

若要使服务能够在 Bridge to Kubernetes 中运行,而无需提升的权限,请将对主机名的任何硬编码引用替换为环境变量。 以下示例在用 C# 编写的名为 mywebapi 的 .NET 服务中演示了这一点:

    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。

即使通常在调用目标服务时未指定目标服务使用的端口,也需要使用 servicename_SERVICE_PORT 环境变量。 通过指定端口,Bridge to Kubernetes 可以避免在开发计算机上因特定端口不可用而导致的冲突。 无需更改服务对其进行侦听以正常工作的端口:只需要确保在服务调用其它服务时,它使用 servicename_SERVICE_HOST 和 servicename_SERVICE_PORT 环境变量进行调用。

如果在群集中的其他位置重复使用相同的代码,则没问题,因为这些环境变量在群集中的每个 Pod 中都可用。 如果在 Kubernetes 群集之外重复使用相同的代码,则必须设置等效的环境变量,或者相应地为新平台或托管服务修改代码。

将 VS Code 设置为使用 Kubernetes 服务环境变量

如果将 VS Code 与远程计算机一起使用,或者以非管理员用户身份运行 VS Code,则还需要将 VS Code 配置为使用 Kubernetes 服务环境变量。 打开 tasks.json,找到标签 bridge-to-kubernetes.service 的任务,并使用值 true添加属性 usekubernetesServiceEnvironmentVariables,如以下代码所示:

    "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 的配置文件,并添加具有 true 值的 useKubeServiceEnvironmentVariables 属性,如以下代码所示:

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

仅当以非管理员用户身份运行 VS Code 或 Visual Studio 时,或者使用的是远程会话,但如果已按照本文中所述修改了代码,则设置此属性不会造成任何损害。

后续步骤

若要详细了解 Bridge to Kubernetes 配置,请参阅 如何配置 Bridge to Kubernetes