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を構成する方法」を参照してください。