Kubernetes サービス環境変数

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

リダイレクトの失敗を回避する

Bridge to Kubernetes では、ネットワーク トラフィックを独自のバージョンのサービスにリダイレクトするようにホスト名の解決を変更することで、トラフィックが再ルーティングされます。 このリダイレクトはほとんどのシナリオで機能しますが、管理者特権を持たないユーザー アカウントから要求が送信されるときや VS Code リモート SSH を使用しているときなど、Bridge to Kubernetes プロセスの特権が制限されるケースでは失敗します。 その理由は、リダイレクトされたサービスの名前解決を可能にするには Bridge to Kubernetes で hosts ファイルを変更する必要がありますが、Bridge to Kubernetes が管理者特権を持たないユーザー アカウントから実行されるときはそれが不可能であるためです。 この問題を回避するには、ハードコーディングされたサービス名の代わりに Kubernetes サービス環境変数を使用するようにコードを記述することができます。

環境変数の表

以下の表に、クラスター内の任意のサービス (たとえば、ポートで TCP プロトコルを使用するサービス) から使用できる Kubernetes サービス環境変数を示します。 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 の両方の環境変数を使用して呼び出すようにすることだけです。

クラスター内の他の場所で同じコードを再利用する場合は、問題ありません。これらの環境変数はクラスター内のすべてのポッドで使用できるためです。 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 の構成方法に関する記事を参照してください。