Cloud Code for Cloud Shell で Kubernetes アプリケーションをデバッグする

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

Cloud Code を使用すると、skaffold debug を活用することで、Kubernetes クラスタにデプロイされたアプリケーションを簡単にデバッグできます。

ローカル クラスタ(Minikube や Docker Desktop など)、Google Kubernetes Engine(GKE)、その他のクラウド プロバイダでアプリケーションをデバッグできます。

Cloud Code のデバッグ サポートにより、ポート転送の設定や言語固有のデバッグ引数の挿入のような、手動設定を完了する必要はありません。デバッグには、skaffold.yaml 構成ファイルと cloudcode.kubernetes 起動構成を含む Cloud Code 対応の Kubernetes アプリケーションが必要です。

アプリケーションのデバッグ

  1. ステータスバーで Cloud Code のステータスバー [Cloud Code] をクリックし、[Debug on Kubernetes] をクリックします。
  2. アプリケーションに必要な skaffold 構成または cloudcode.kubernetes 起動構成が含まれていない場合は、Cloud Code によりそうした構成を設定できます
  3. 現在の Kubernetes コンテキストを使用してアプリを実行する(または目的のアプリに切り替える)かどうかを確認します。
  4. リモート クラスタをコンテキストとして選択した場合は、プロンプトが表示されたら、イメージを push するイメージ レジストリを選択します。Container Registry を使用している場合は、既存のレジストリを参照するか、作成するレジストリの名前を指定できます。プロジェクトで Artifact Registry API が有効で、1 つ以上の Artifact Registry リポジトリが有効になっている場合は、既存の Artifact Registry リポジトリを参照して選択できます。

    次のサンプルは、一般的なレジストリの場合にコンテナ イメージの保存場所を指定する方法を示しています。

    Artifact Registry {region}-docker.pkg.dev/{project_id}/{repo-name}
    Container Registry gcr.io/{project_id}
    Docker Hub docker.io/{account}
    非公開 Docker Hub リポジトリを使用している場合は、適切に認証されるようにしてください。

    最終的なイメージ リポジトリ名を生成するには、Cloud Code によってこのイメージ レジストリを Kubernetes マニフェストで指定されたイメージ名に連結します。この選択は、cloudcode.kubernetes 起動構成(.vscode/launch.json にあります)に保存されます。

    詳細については、イメージ レジストリ取り扱いガイドをご覧ください。

    次に、Cloud Code はコンテナをビルドして、レジストリに push し、Kubernetes 構成をクラスタに適用して、ロールアウトを待ちます。

    ロールアウト後、Cloud Code は宣言されたすべてのコンテナポートをマシンに自動的にポート転送します。また、ライブ アプリケーションをブラウジングできるように、出力ウィンドウに URL を表示します。

  5. アプリケーションのデバッグ可能なコンテナごとに、デバッグするプログラムが存在するリモート コンテナのディレクトリを確認または入力します。

    または、ESC キーを押すと、コンテナのデバッグをスキップできます。

    Remote Root プロンプト

    Cloud Code は、アプリケーションのデバッグ可能なコンテナごとにデバッグ セッションをアタッチします。

    ブレークポイントの設定、コードのステップ実行など、ローカルコードのデバッグ時に普段行うのと同じタスクをライブの Kubernetes クラスタに対して実行できるようになりました。

    デフォルトでは、アプリケーションへの変更が自動保存されると、Cloud Code はアプリケーションを再デプロイして、新しいデバッグ セッションを設定します。この機能を切り換えるには、プロジェクトの起動構成で watch フラグを指定します。

  6. 変数とスタック情報を調べるには、デバッグ サイドバーを使用します。デバッグ セッションをインタラクティブに操作するには、下部ペインのデバッガにあるデバッグ コンソールを使用します。

  7. セッションが完了すると、次のコンテキスト メニュー コマンドを使用できます。

    • デプロイログを開く: Cloud Code ログ エクスプローラで特定のデプロイのアプリケーション ログを開きます。
    • Open Service URL: 特定サービスのアプリケーション サービス URL をウェブブラウザで開きます。
  8. 起動構成でウォッチモードをオフにし、アプリケーションを変更して再ビルドと再デプロイを行う場合は、[Development sessions] ペインで、実行アクションを一時停止し、再ビルドと再デプロイのアイコン [Rebuild and redeploy the application] をクリックします。

  9. デバッグ セッションを終了するには、デバッグ ツールバーで デバッグ停止アイコン [停止] をクリックします。

    デバッグ セッションを終了すると、デプロイされたすべての Kubernetes リソースがクラスタから削除されます。

構成の詳細

Skaffold を使用した Cloud Code は、サポートされているすべての言語で、次の構成を自動的に処理します。

  • デバッガをアタッチできるように、デバッグポートのポート転送を行います。
  • アプリケーション内の 1 つ以上のデバッグ可能なコンテナにデバッガを接続します。 アプリケーションに、skaffold.yaml で構成されている複数のデバッグ可能なコンテナ(Cloud Code デバッグでサポートされているコンテナ)がある場合、デバッガ可能な各コンテナにデバッガがアタッチされます。
  • セッション間でのソース マッピング定義を永続化します。.vscode/launch.json を直接編集して、定義をカスタマイズできます。

Cloud Code は、次の言語固有の構成の詳細も処理します。

Node.js

呼び出すエントリポイントを書き換えます。

node --inspect=localhost:9229

Python

Init コンテナを使用して、ptvsd モジュールをインストールし、呼び出すエントリポイントを書き換えます。

python -m ptvsd --host localhost --port 5678

Go

Init コンテナを使用して dlv デバッガをインストールし、エントリ ポイントを書き換えて、起動したデバッグ セッションがデバッグ サーバーのみで(ヘッドレス モードで)実行され、起動時のデバッグ プロセスを継続し、複数のクライアント接続を受け入れ、localhost:56268 でリッスンできるようにします。

dlv exec --headless --continue --accept-multiclient --listen=localhost:56268 --api-version=2, <app> --

Java

適切な Java Debug Wire Protocol(JDWP)構成を使用して環境 JAVA_TOOLS_OPTIONS を追加し、JDWP デバッグ エージェントがポート 5005 のソケット接続をリッスンすることで、デバッガがアタッチする前に VM の実行を開始できるようにします。

jdwp=transport=dt_socket,server=y,suspend=n,address=5005,quiet=y

Skaffold を使用したデバッグの詳細については skaffold debug ドキュメントをご覧ください。

Kubernetes Pod へのデバッガのアタッチ

VS Code 用の Cloud Code は、Kubernetes Pod へのデバッガのアタッチもサポートします。比較については、Kubernetes Pod へのアタッチと Kubernetes アプリケーションのデバッグをご覧ください。