共用方式為


Kubernetes 服務環境變數

注意

Bridge to Kubernetes 將於 2025 年 4 月 30 日淘汰。 如需淘汰和開放原始碼替代方案的詳細資訊,請參閱 GitHub 問題

當您與相同 Kubernetes 叢集中的另一個服務進行通訊時,例如使用 HTTP 請求,您通常會在請求的 URL 中使用硬編碼的服務名稱,但在某些情況下,使用 Bridge to Kubernetes 可能無法正常運作。 本文說明如何使用 Kubernetes 服務環境變數來指定連線 URL。

避免重新導向失敗

透過修改主機名解析,將網路流量重新導向至自己的服務版本,以橋接至 Kubernetes 重新路由傳送流量。 重新導向適用於大部分案例,但在 Bridge to Kubernetes 進程具有限制許可權的情況下失敗,例如當要求來自未提高許可權的用戶帳戶或使用 VS Code 遠端 SSH 時。 這是因為為了啟用重新導向服務的名稱解析,Bridge to Kubernetes 需要修改 hosts 檔案,但當 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_通訊協定 tcp://10.0.0.11:6379 具有通訊協定、IP 位址和埠的 URL。
servicename_PORT_portnumber_通訊協定_PROTO 傳輸控制協定 (TCP) 通訊協議標識碼。
servicename_PORT_portnumber_通訊協定_PORT 6379 TCP 的埠號碼。
servicename_PORT_portnumber_通訊協定_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 的工作,然後新增屬性 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