Cloud Code を使用すると、skaffold debug
を利用して Google Kubernetes Engine(GKE)クラスタにデプロイされたアプリケーションをデバッグできます。
ローカル クラスタ(minikube や Docker Desktop など)、GKE、その他のクラウド プロバイダ上でアプリケーションをデバッグできます。
Cloud Code のデバッグ サポートの場合、手動設定(ポート転送の設定や言語固有のデバッグ引数の挿入など)を完了する必要はありません。デバッグには、skaffold.yaml
構成ファイルと cloudcode.kubernetes
起動構成を含む Cloud Code 対応の GKE アプリケーションが必要です。
GKE アプリケーションをデバッグする
GKE アプリケーションのデバッグを開始するには、次の手順を行います。
Cloud Code のステータスバーで、アクティブなプロジェクト名をクリックします。
表示されたクイック選択メニューで、[Kubernetes 上でデバッグする] を選択します。
アプリケーションに必要な skaffold 構成または
cloudcode.kubernetes
起動構成が含まれていない場合は、Cloud Code によりそうした構成を設定できます。現在の Kubernetes コンテキストを使用してアプリを実行する(または目的のアプリに切り替える)かどうかを確認します。
リモート クラスタをコンテキストとして選択した場合は、プロンプトが表示されたら、イメージの 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 を表示します。
アプリケーションのデバッグ可能なコンテナごとに、デバッグするプログラムが存在するリモート コンテナのディレクトリを確認または入力します。
または、ESC キーを押すと、コンテナのデバッグをスキップできます。
Cloud Code は、アプリケーションのデバッグ可能なコンテナごとにデバッグ セッションをアタッチします。
ブレークポイントの設定、コードのステップ実行など、ローカルコードのデバッグ時に普段行うのと同じタスクをライブの Kubernetes クラスタに対して実行できるようになりました。
デフォルトでは、アプリケーションへの変更が自動保存されると、Cloud Code はアプリケーションを再デプロイして、新しいデバッグ セッションを設定します。この機能を切り換えるには、プロジェクトの起動構成で
watch
フラグを指定します。変数とスタック情報を調べるには、デバッグ サイドバーを使用します。デバッグ セッションをインタラクティブに操作するには、下部ペインのデバッガにあるデバッグ コンソールを使用します。
セッションが完了したら、次のコンテキスト メニュー コマンドを使用できます。
- デプロイログを開く: Cloud Code ログ エクスプローラで特定のデプロイのアプリケーション ログを開きます。
- Open Service URL: 特定サービスのアプリケーション サービス URL をウェブブラウザで開きます。
起動構成でウォッチモードをオフにし、アプリケーションを変更して再ビルドと再デプロイを行う場合は、[Development sessions] ペインで、実行アクションを一時停止し、 [Rebuild and redeploy the application] をクリックします。
デバッグ セッションを終了するには、デバッグ ツールバーで [停止] をクリックします。
デバッグ セッションを終了すると、デプロイされたすべての 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
ドキュメントをご覧ください。
コンテナを設定する
デバッグ用のコンテナを準備するには、使用している言語の手順に従います。
Node.js
--inspect=<debugPort>
で Node.js アプリケーションを起動します。debugPort
はアタッチ構成から取得します。例:CMD ["node", "--inspect=9229", "index.js"]
Python
Go
Java
- JVM がマシンにインストールされていることを確認します。
次のオプションで Java アプリケーションを起動します。
debugPort
はアタッチ構成から取得します。-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=
,quiet=y たとえば、Java アプリケーションをデバッグモードで起動し、ポート
debugPort
でアタッチをリッスンします。ENTRYPOINT ["java","-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=<debugPort>,quiet=y", "-jar", "my-app-1.0.jar"]
.NET Core
vsdbg
(Microsoft の .NET Core コマンドライン デバッガ)が Kubernetes コンテナに インストールされていることを確認します。次に例を示します。
RUN apt-get update
&& apt-get install -y --no-install-recommends unzip
&& apt-get install -y procps
&& rm -rf /var/lib/apt/lists/*
&& curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v latest -l /dbg/netcore/vsdbg
アタッチ構成を設定する
デバッグ可能なコンテナにアタッチするには、cloudcode.kubernetes
タイプのアタッチ構成が必要です。
.vscode/launch.json ファイルを追加する
プロジェクトの .vscode
フォルダに launch.json
ファイルがない場合は、[デバッグ] パネルを使用して追加できます。
[デバッグ] パネルに移動するには、アクティビティ バーで [デバッグ] をクリックします。
プルダウン メニューから [構成を追加] を選択します。
環境として [Cloud Code: Kubernetes] を選択します。
[Kubernetes Pod にアタッチする] オプションを選択します。
使用しているプログラミング言語を選択します。
これにより、プロジェクトの
launch.json
ファイルが作成され、開かれて、接続構成が作成されます。プロジェクトの構成属性に合わせて、
launch.json
ファイル内の構成属性を更新します。構成属性の詳細については、構成属性をご覧ください。
.vscode/launch.json ファイルにアタッチ構成を追加する
既存の .vscode/launch.json
ファイルに新しいアタッチ構成を追加するには:
launch.json
ファイルを開きます。- Intellisense スニペットを起動するには、[Add Configuration] をクリックします。
- アタッチ構成を追加するには、使用している言語の [Cloud Code: Attach to Kubernetes Pod] スニペットを選択します。
- プロジェクトの属性に合わせて構成内の属性を更新します。構成属性の詳細については、構成属性をご覧ください。
構成属性
属性 | 説明 |
---|---|
debugPort | コンテナで使用されるデバッグポート。 |
podSelector | デバッグ Pod の選択に使用される Key-Value ペアのセット。詳細については、セレクタに関するガイドをご覧ください。
次のサンプルは、一般的な podSelector を示しています。
"podSelector": {
"app": <deployment-name>
}
|
localRoot | デバッグするプログラムが存在するローカル ディレクトリのパス。 デフォルトは ${workspaceFolder} です。 |
remoteRoot | デバッグするプログラムが存在するリモート ディレクトリの絶対パス(Kubernetes コンテナ上のパス)。 |
Kubernetes Pod にデバッガをアタッチする
Cloud Shell 用 Cloud Code では、Node.js、Python、Go、Java、.NET の Kubernetes Pod にデバッガを接続できます。必要なのは、デバッグ可能なコンテナと cloudcode.kubernetes
タイプのアタッチ構成のみです。
Kubernetes Pod へのアタッチと Kubernetes アプリケーションのデバッグの違いについては、Pod へのデバッガのアタッチと Kubernetes アプリケーションのデバッグの違いをご覧ください。
デバッガを Kubernetes Pod にアタッチするには、次のタスクを実行します。
- [デバッグ] パネルに移動するには、アクティビティ バーで [デバッグ] をクリックします。
F5
を押して、構成を選択して起動します。localhost:${debugPort}
は、デバッグ中にコンテナのdebugPort
にポート転送されます。
これで、デバッグ セッションが正常に設定されました。 ブレークポイントの設定やコードのステップ実行など、ローカルコードのデバッグ時に普段行うタスクを実行できます。
変数とスタック情報を調べるには、デバッグ サイドバーを使用します。デバッグ セッションをインタラクティブに操作するには、下部ペインのデバッガにあるデバッグ コンソールを使用します。
デバッグ セッションを終了するには、デバッグ ツールバーで [停止] をクリックします。
Pod にデバッガをアタッチすることと Kubernetes アプリケーションをデバッグすることがどう違うか
Kubernetes Pod にアタッチする | Kubernetes アプリケーションをデバッグする |
---|---|
単一の Kubernetes Pod をデバッグします。 | アプリケーション内のすべてのデバッグ可能なコンテナをデバッグします。 |
デバッグする前に、アプリケーションを Kubernetes Pod で実行する必要があります。 | Kubernetes クラスタでアプリケーションを実行し、デバッガをアタッチします。 |
タイプ cloudcode.kubernetes の構成(.vscode/launch.json)を使用し、attach をリクエストします。 |
タイプ cloudcode.kubernetes の構成(.vscode/launch.json)を使用し、launch をリクエストします。詳細については、構成の開始とアタッチをご覧ください。 |
サンプル構成:
{ "name": "Attach to Kubernetes Pod (NodeJS)", "type": "cloudcode.kubernetes", "request": "attach", "language": "Node", "debugPort": 9229, "podSelector": { "app": "hello-world" }, "localRoot": "${workspaceFolder}", "remoteRoot": "/app" } |
サンプル構成:
{ "name": "Run/Debug on Kubernetes", "type": "cloudcode.kubernetes", "request": "launch", "skaffoldConfig": "${workspaceFolder}/skaffold.yaml", "watch": true, "cleanUp": true, "portForward": true } |
この構成を使用してアプリケーションを実行することはできません。 | この構成を使用して、アプリケーションを実行またはデバッグできます。 |
この構成は言語固有のものです | この構成は言語固有のものではありません。 |
専用のコマンドを使用しません | Debug on Kubernetesコマンド |
次のステップ
- ファイルの同期とホットリロードを使用して開発を高速化する。
- Cloud Code で継続的な開発環境を設定する。
- Cloud Code で Kubernetes ログを表示します。