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