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

Cloud Code を使用すると、skaffold debug を利用して Google Kubernetes Engine(GKE)クラスタにデプロイされたアプリケーションをデバッグできます。

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

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

GKE アプリケーションをデバッグする

GKE アプリケーションのデバッグを開始するには、次の手順を行います。

  1. Cloud Code のステータスバーで、アクティブなプロジェクト名をクリックします。

    ステータスバーでアクティブなプロジェクト名

  2. 表示されたクイック選択メニューで、[Kubernetes 上でデバッグする] を選択します。

  3. アプリケーションに必要な skaffold 構成または cloudcode.kubernetes 起動構成が含まれていない場合は、Cloud Code によりそうした構成を設定できます

  4. 現在の Kubernetes コンテキストを使用してアプリを実行する(または目的のアプリに切り替える)かどうかを確認します。

  5. リモート クラスタをコンテキストとして選択した場合は、プロンプトが表示されたら、イメージの 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 を表示します。

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

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

    Remote Root プロンプト

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

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

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

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

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

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

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

    デバッグ セッションを終了すると、デプロイされたすべての 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

  • ptvsd モジュールがマシンとコンテナにインストールされていることを確認します。
  • ptvsd から Python アプリケーションを起動します。アタッチ構成debugPort フィールドに指定されたポートを一致させます。次に例を示します。
    CMD ["python", "-m", "ptvsd", "--port", "", "app.py"]
    

Go

  • dlv パッケージがマシンと Go コンテナにインストールされていることを確認します。
  • dlv debug から Go アプリケーションを起動します。

    開始コマンドで指定されたポートは、アタッチ構成debugPort 属性値と同じである必要があります。 次に例を示します。

    CMD ["dlv", "debug", "--headless", "--listen=:<debugPort>", "--log"]
    

    トラブルシューティングのヒント: 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 ファイルがない場合は、[デバッグ] パネルを使用して追加できます。

  1. [デバッグ] パネルに移動するには、アクティビティ バーで デバッグ アイコン [デバッグ] をクリックします。

  2. プルダウン メニューから [構成を追加] を選択します。

  3. 環境として [Cloud Code: Kubernetes] を選択します。

    環境として Cloud Code: Kubernetes の設定

  4. [Kubernetes Pod にアタッチする] オプションを選択します。

    Kubernetes 構成オプションの選択

  5. 使用しているプログラミング言語を選択します。

    これにより、プロジェクトの launch.json ファイルが作成され、開かれて、接続構成が作成されます。

  6. プロジェクトの構成属性に合わせて、launch.json ファイル内の構成属性を更新します。構成属性の詳細については、構成属性をご覧ください。

.vscode/launch.json ファイルにアタッチ構成を追加する

既存の .vscode/launch.json ファイルに新しいアタッチ構成を追加するには:

  1. launch.json ファイルを開きます。
  2. Intellisense スニペットを起動するには、[Add Configuration] をクリックします。
  3. アタッチ構成を追加するには、使用している言語の [Cloud Code: Attach to Kubernetes Pod] スニペットを選択します。
  4. プロジェクトの属性に合わせて構成内の属性を更新します。構成属性の詳細については、構成属性をご覧ください。

構成属性

属性 説明
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 にアタッチするには、次のタスクを実行します。

  1. [デバッグ] パネルに移動するには、アクティビティ バーで デバッグ アイコン [デバッグ] をクリックします。
  2. F5 を押して、構成を選択して起動します。

    • localhost:${debugPort} は、デバッグ中にコンテナの debugPort にポート転送されます。

    これで、デバッグ セッションが正常に設定されました。 ブレークポイントの設定やコードのステップ実行など、ローカルコードのデバッグ時に普段行うタスクを実行できます。

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

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

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コマンド

次のステップ