次の方法で共有


Kubernetes サービス環境変数

手記

Bridge to Kubernetes は、2025 年 4 月 30 日に廃止されます。 提供終了とオープンソースの代替方法の詳細については、GitHub の問題を参照してください。

HTTP 要求など、同じ Kubernetes クラスター内の別のサービスと通信する場合は、通常、要求の URL でハードコーディングされたサービス名を使用しますが、Bridge to Kubernetes の一部のシナリオでは機能しません。 この記事では、Kubernetes サービス環境変数を使用して接続 URL を指定する方法について説明します。

リダイレクトエラーを回避する

Bridge to 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 サービス ホストの名前
<サービス名>_SERVICE_PORT 6379 サービスのポート
servicename_PORT tcp://10.0.0.11:6379 プロトコル、IP アドレス、およびポートを含む URL。
<サービス名>_PORT_<ポート番号>_<プロトコル> tcp://10.0.0.11:6379 プロトコル、IP アドレス、ポートを含む URL。
<サービス名>_PORT_<ポート番号>_<プロトコル>_PROTO TCP プロトコル識別子。
<サービス名>_PORT_<ポート番号>_<プロトコル>_PORT 6379 TCP のポート番号。
<サービス名>_PORT_<ポート番号>_<プロトコル>_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 は、開発用マシンで特定のポートが使用できない場合に発生する競合を回避できます。 これを機能させるためにサービスがリッスンするポートを変更する必要はありません。必要なのは、サービスが他のサービスを呼び出す際に、サービス名_SERVICE_HOST と サービス名_SERVICE_PORT の両方の環境変数を使用して呼び出すことです。

クラスター内の別の場所で同じコードを再利用する場合は、クラスター内のすべてのポッドでこれらの環境変数を使用できるため、問題ありません。 Kubernetes クラスターの外部で同じコードを再利用する場合は、同等の環境変数を設定するか、新しいプラットフォームまたはホスティング サービスに合わせてコードを適切に変更する必要があります。

Kubernetes サービス環境変数を使用するように VS Code を設定する

リモート コンピューターで VS Code を使用している場合、または管理者以外のユーザーとして VS Code を実行している場合は、Kubernetes サービス環境変数を使用するように VS Code を構成する必要もあります。 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
        }
    ]

Kubernetes サービス環境変数を使用するように Visual Studio を設定する

管理者以外のユーザーとして Visual Studio を実行している場合は、Kubernetes サービス環境変数を使用するように Visual Studio を構成する必要もあります。 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を構成する方法」を参照してください。