Bridge to Kubernetes を使用する (VS Code)

Bridge to Kubernetes を使用すると、開発用のコンピューター上でコードの実行とデバッグを行いながら、残りのアプリケーションやサービスが置かれている Kubernetes クラスターとの接続を保つことができます。 このガイドでは、Bridge to Kubernetes を使用して、Kubernetes クラスターと、開発用コンピューター上で実行されているコードの間で、トラフィックをリダイレクトする方法を説明します。

開始する前に

この記事では、マイクロサービス アーキテクチャを持つ独自のクラスターが既に存在し、クラスター内のいずれかのポッドをデバッグする必要がある場合を想定しています。 既存のサンプル アプリケーションで Bridge to Kubernetes を使用する方法については、「サンプルで Bridge to Kubernetes を使用する」を参照してください。 Azure Kubernetes サービスを使用していて、より複雑なサンプル アプリケーションを使用したい場合は、Bridge to Kubernetes (AKS) に関する記事を参照してください。

前提条件

  • デバッグするアプリが含まれている Kubernetes クラスター。
  • macOS、Windows 10 以降、または Linux 上で実行されている Visual Studio Code

クラスターに接続してサービスをデバッグする

Bridge to Kubernetes を使用したデバッグ プロセスを開始するには、いくつかの異なる方法があります。 オープン ソースの Kubernetes 拡張機能から開始し、Bridge to Kubernetes がインストールされていない場合は、「ローカル トンネル デバッグをインストールして使用する」に移動してください。 既に Bridge to Kubernetes がインストールされている場合は、次の手順に進みます。

  1. 開発用コンピューター上で、現在のコンテキストが、アプリケーションが実行されているクラスターと名前空間に設定されている必要があります。

  2. Visual Studio Code でデバッグするアプリのワークスペースを開きます。 [クラスター] の下の Kubernetes 拡張機能ビューで、クラスターと名前空間が選択されている必要があります。 コマンド パレットを開き (Ctrl+Shift+P キーか、Mac の場合は Cmd+Shift+P キー)、コマンド Bridge to Kubernetes: Configure を実行して、構成プロセスを開始します。

  3. ローカル バージョンにリダイレクトする Kubernetes サービスを選択します。

    接続するサービスを選択する

    サービスに対する Kubernetes クラスター内のすべてのトラフィックが、お使いの開発用コンピューターで実行されているアプリケーションのバージョンにリダイレクトされます。 Bridge to Kubernetes ではまた、アプリケーションからのすべての送信トラフィックが、Kubernetes クラスターにルーティングされます。

    重要

    リダイレクトできるのは、ポッドが 1 つのサービスだけです。

  4. サービスを選択したら、次のセクションをスキップし、引き続き「Bridge to Kubernetes を使用したローカル トンネル デバッグ用にデバッガーを構成する」の手順に従ってください。

ローカル トンネル デバッグをインストールして使用する

オープンソースの Kubernetes 拡張機能がインストールされ、デバッグするサービスが含まれている Kubernete クラスターがある場合は、次の手順に従ってローカル トンネル デバッグの使用を開始します。 このセクションの手順では、Bridge to Kubernetes のインストールについて説明し、ローカル トンネル デバッグの構成プロセスを開始します。

Note

VS Code 用の Kubernetes 拡張機能には、拡張機能の作成者が VS Code Marketplace から他のローカル トンネル ソリューションを投稿できる、API エントリ ポイントが用意されています。 Bridge to Kubernetes は、ローカル トンネル デバッグ機能の実装の 1 つです。

VS Code でローカル トンネル デバッグの使用を開始するには、2 つの方法があります。 最初の方法は、コマンド パレットを開き (Ctrl+Shift+P キーか、Mac の場合は Cmd+Shift+P キー)、「Kubernetes: Debug (Local Tunnel) 」と入力することです。

VS Code での Debug (Local Tunnel) コマンドを示すスクリーンショット

または、Kubernetes クラスター エクスプローラーに移動します。 アクティブなクラスターのリソースを開き、デバッグするサービスまたはポッドを見つけて、そのサービスを右クリックし、[Debug: Local Tunnel]\(デバッグ: ローカル トンネル\) を選択します。

この時点で、ローカル デバッグ機能を提供する VS Code 拡張機能がインストールされていない場合は、ローカル デバッグが提供される拡張機能を選択するように Marketplace にリダイレクトされます。 Bridge to Kubernetes 拡張機能を選択します。

VS Code でのデバッグ ローカル トンネルのコンテキスト メニューを示すスクリーンショット

Bridge to Kubernetes 拡張機能がインストールされた後、次に [Debug: Local Tunnel](デバッグ: ローカル トンネル) を選択するときは、インストール手順をスキップし、次の手順「Bridge to Kubernetes を使用したローカル トンネル デバッグ用にデバッガーを構成する」に直接進みます。

Bridge to Kubernetes を使用したローカル トンネル デバッグ用にデバッガーを構成する

ローカル トンネル デバッグ用にデバッガーを構成する最初の手順として、ローカルで実行するためにアプリケーションで使用する TCP ポートの入力を求められます。

ポート番号の入力

アプリケーションをローカルで実行するときに通常使用するデバッグ起動構成を選択します。 起動構成がない場合は、Bridge to Kubernetes による作成を許可するか、作成しないことを選択できます。その場合は、アプリケーションまたはサービスを手動で起動する必要があります。 詳細については、起動構成に関するページを参照してください。

デバッガーの起動構成を選択する

分離して実行するか、または分離しないで実行するオプションがあります。 分離して実行すると、自分の要求だけがローカル プロセスにルーティングされます。他の開発者は影響を受けずにクラスターを使用できます。 分離して実行しない場合、すべてのトラフィックがローカル プロセスにリダイレクトされます。 このオプションの詳細については、「分離して開発するためのルーティング機能の使用」を参照してください。

分離を選択する

左側のデバッグ アイコンを選択し、上部にある新しく追加された Kubernetes 起動構成 ( [Launch via NPM with Kubernetes](Kubernetes での NPM による起動) など) を選択します。 この起動構成は Bridge to Kubernetes によって作成されます (そのオプションを選択した場合)。

デバッグ起動プロファイルを選択する

注意

EndpointManager が管理者特権で実行して hosts ファイルを変更することを許可するように求められます。

VS Code のステータス バーがオレンジに変わり、Kubernetes 拡張機能に接続されたことが示されたら、開発用コンピューターは接続されています。

Bridge to Kubernetes を使用したデバッグ

開発用コンピューターが接続されると、置き換えているサービスのトラフィックの、開発用コンピューターに対するリダイレクトが開始されます。

Note

以降の起動では、サービス名、ポート、起動タスク、または分離して実行するかどうかの指定を求められることはありません。 これらの値は .vscode/tasks.json に保存されます。 これらの設定を後で変更するには、コマンド パレットを開き (Ctrl+Shift+P キーか、Mac の場合は Cmd+Shift+P キー)、コマンド Bridge to Kubernetes: Configure を実行します。 .vscode/launch.json.vscode/tasks.json を開き、Bridge to Kubernetes によって起動プロファイルに追加された特定の構成設定を確認できます。

クラスターで gRPC C コア (c-ares を使用する gRPC の実装) が使用されている場合、起動プロファイルに値 native の環境変数 GRPC_DNS_RESOLVER が追加されます。 この変数により、接続時の 2 分間の遅延を回避するための回避策を使用することが指定されます。 詳細については、gRPC のイシューを参照してください。

ブレーク ポイントを設定する

F9 キーを使用してブレークポイントを設定するか、[実行][ブレークポイントの設定/解除] の順に選択します。

パブリック URL を開いて、サンプル アプリケーションに移動します。 コードがブレークポイントに到達すると、デバッガーで開かれます。 サービスを再開するには、Ctrl + F5 キーを押すか、[実行][続行] の順に選択します。 ブラウザーに戻り、自転車のプレースホルダー画像が表示されていることを確認します。

アプリケーションの更新

ローカルでコード変更を行う場合、それがクラスターを使用している他のユーザーに見えるかどうかは、分離して実行しているかどうかによって異なります。 分離して実行している場合は、他のユーザーに影響しない変更を加えることができます。

コードを編集し、変更内容を保存して、Ctrl+Shift+F5 キー (Mac の場合は ⇧⌘F5 キー) を押すか、[実行][Restart Debugging]\(デバッグの再起動\) の順に選択します。 再接続した後、ブラウザーを更新して変更を検証します。

[実行][デバッグの停止] の順に選択するか、Shift+F5 キーを押してデバッガーを停止します。

Note

既定では、デバッグ タスクを停止すると、開発用コンピューターも Kubernetes クラスターから切断されます。 この動作を変更するには、Visual Studio Code の設定で「Bridge to Kubernetes: Disconnect After Debugging」と検索し、[Disconnect automatically when debugging stops]\(デバッグの停止時に自動的に切断する\) の横にあるチェック ボックスをオフにします。 この設定を更新した後は、デバッグを停止して開始するとき、開発用コンピューターは接続されたままになります。 開発用コンピューターをクラスターから切断するには、ステータス バーの Bridge to Kubernetes 拡張機能をクリックし、[Disconnect current session]\(現在のセッションを切断する\) を選択します。

追加構成

Bridge to Kubernetes では、ルーティング トラフィックを処理し、追加の構成なしで環境変数をレプリケートできます。 ConfigMap ファイルなど、Kubernetes クラスターのコンテナーにマウントされているファイルをダウンロードする必要がある場合、KubernetesLocalProcessConfig.yaml を作成し、開発用コンピューターにそれらのファイルをダウンロードできます。 詳細については、「Bridge to Kubernetes を構成する」を参照してください。

マネージド ID (Microsoft Entra ID によって提供されるセキュリティ機能) を使用する AKS クラスターを使用している場合は、このシナリオに合わせて Bridge to Kubernetes を構成する方法の詳細について、「Bridge to Kubernetes でマネージド ID を使用する」を参照してください。

ログ記録と診断の使用

ログ出力は、開発用コンピューターが Kubernetes クラスターに接続された後、Bridge to Kubernetes ウィンドウに書き込まれます。

Kubernetes ステータス バーをクリックし、[Show connection diagnostics information]\(接続診断情報の表示\) を選択します。 このコマンドにより、現在の環境変数と DNS エントリがログ出力に出力されます。

また、診断ログは、開発用コンピューターの TEMP ディレクトリの Bridge to Kubernetes ディレクトリにあります。 Windows 10 の場合は、%TEMP%\Bridge to Kubernetes にあります。 Mac では、ターミナルウィンドウからecho $TMPDIRを実行すると、TEMP ディレクトリが見つかります。 Linux では、/tmp/Bridge to Kubernetes です。

分離モードでの実行

Bridge to Kubernetes を使用すると、作業しているサービスの分離バージョンを設定することもできます。つまり、クラスターを使用している他のユーザーは変更の影響を受けません。 影響を受ける各サービスのコピーに要求をルーティングし、他のすべてのトラフィックは通常どおりルーティングすることで、この分離モードは達成されます。 分離されたアプリのローカル エンドポイント URL にアクセスするには、分離モードでデバッガーを起動し、ステータス バーの Kubernetes メニューを開き、エンドポイント エントリを選択します。 分離モードでのルーティングのしくみについて詳しくは、Bridge to Kubernetes のしくみに関する記事を参照してください。

ヘッダーの伝達

Bridge to Kubernetes を設計どおりに使用するには、受信要求から、クラスター内の他のサービスに対する自分のサービスの要求に、Bridge to Kubernetes ヘッダーを伝達する必要があります。 すべての HTTP 要求 API には、言語に関係なく、これを行うフレームワーク固有の方法が用意されています。 たとえば、C# の .NET コードでは、次のようなコードを使用できます。

var request = new HttpRequestMessage();
request.RequestUri = new Uri("http://mywebapi/api/values/1");
if (this.Request.Headers.ContainsKey("kubernetes-route-as"))
{
    // Propagate the dev space routing header
    request.Headers.Add("kubernetes-route-as", this.Request.Headers["kubernetes-route-as"] as IEnumerable<string>);
}
var response = await client.SendAsync(request);

Note

すべての要求でコードに影響を与えるのを防ぐには、System.Net.Http.DelegatingHandler から継承したクラスを作成し、上記の例のようなコードで SendAsync メソッドをオーバーライドします。 この手法を使用したコードを Web 上で見つけることができます。1 つの例は、「Properly Propagating "kubernetes-route-as" in Bridge to Kubernetes (Bridge to Kubernetes で "kubernetes-route-as" を適切に伝達する)」です。

Node.js サービスの場合は、Bridge to Kubernetes リポジトリの todo-app サンプルから取得した次のようなコードを使用できます。

    server.get("/api/stats", function (req, res) {
        var options = {
            host: process.env.STATS_API_HOST,
            path: '/stats',
            method: 'GET'
        };
        const val = req.get('kubernetes-route-as');
        if (val) {
            console.log('Forwarding kubernetes-route-as header value - %s', val);
            options.headers = {
                'kubernetes-route-as': val
            }
        }
        var req = http.request(options, function(statResponse) {
            res.setHeader('Content-Type', 'application/json');
            var responseString = '';
            //another chunk of data has been received, so append it to `responseString`
            statResponse.on('data', function (chunk) {
                responseString += chunk;
            });
            statResponse.on('end', function () {
                res.send(responseString);
            });
        });

        req.on('error', function(e) {
            console.log('problem with request: ' + e.message);
          });

          req.end();
    });

他のサービスとの通信

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

トラブルシューティング

Bridge to Kubernetes 拡張機能をアクティブ化するときに次のエラーが表示される場合:

"Failed to update dependencies: maximum number of retries exceeded" (依存関係の更新に失敗しました: 再試行の最大回数を超えました)

まずは、ボタンを使用してもう一度アクティブ化してみます。 繰り返し失敗する場合は、https://github.com/microsoft/mindaro/issues/32 を参照してください。

リモート SSH セッションで Bridge to Kubernetes を使用しているときに EndpointManager が失敗する場合、アクセス許可の問題によって Bridge to Kubernetes が hosts ファイルを変更できないことが問題である可能性があります。 リモート SSH または管理者特権を持たないユーザーとしての実行を有効にするには、サービス環境変数に関するトピックで説明しているように、Kubernetes サービス環境変数を使用するようにコードを更新し、それらを使用するように VS Code を構成する必要があります。

次のステップ

Bridge to Kubernetes の詳細については、「Bridge to Kubernetes のしくみ」を参照してください。

複数のサービスを同時に並行してデバッグする必要がある場合は、複数のサービスを同時にデバッグする方法に関する記事を参照してください。

現在サポートされている機能と、Bridge to Kubernetes の今後のロードマップに関する情報は、Bridge to Kubernetes のロードマップを参照してください。