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

Cloud Code を使用すると、skaffold debug を活用することで、Kubernetes クラスタにデプロイされたアプリケーションを簡単にデバッグできます。ローカル クラスタ(Minikube や Docker Desktop など)、Google Kubernetes Engine、その他のクラウド プロバイダでアプリケーションをデバッグできます。

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

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

  1. Cloud Code のステータスバーを使用して [Debug on Kubernetes] コマンドを選択します。
  2. アプリケーションに必要な Skaffold 構成または cloudcode.kubernetes 起動構成が含まれていない場合は、Cloud Code によりそうした構成を設定できます
  3. 現在の Kubernetes コンテキストを使用してアプリを実行する(または目的のアプリに切り替える)かどうかを確認します。
  4. 選択したコンテキストがリモート クラスタである場合、イメージの push 先となるイメージ レジストリを指定するように求められます。

    次に示すのは、一般的なレジストリの場合にコンテナ イメージの保存場所を指定する方法の例です。

    Docker Hub docker.io/{account}
    非公開の Docker Hub リポジトリを使用している場合は、適切に認証されるようにしてください。
    Google Container Repository(GCR) gcr.io/{project_id}

    Cloud Code により、このイメージ レジストリと Kubernetes マニフェストで指定されたイメージ名が連結され、最終的なイメージ リポジトリ名が生成されます。

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

    この選択は cloudcode.kubernetes 起動構成(.vscode/launch.json 内)に保存されます。

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

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

    ポート転送して出力ウィンドウに URL を表示する

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

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

    Remote Root プロンプト

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

    ブレークポイントの設定やコードのステップ実行など、ローカルコードのデバッグ時に普段行うすべてのタスクを実行できるようになります。ただし、ライブの Kubernetes クラスタに対する高度なデバッグ機能は実行できません。

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

    ブレークポイントと変数でアプリを一時停止し、スコープ内の値が入力されたコールスタック セクション

  9. セッションが完了したら、Cloud Code のステータスバーを使用して、アプリケーションとコンテキスト リソースを監視するための追加のコンテキスト メニュー オプションを使用できるようになります。

    • Open Deployment Logs: Cloud Code ログビューアで特定のデプロイメントのアプリケーション ログを開きます。
    • Open Service URL: 特定サービスのアプリケーション サービス URL をウェブブラウザで開きます。
    • Turn on/off watch mode: 現在のセッションのウォッチモードを切り替えます(デバッグ セッションでは使用できません)。

      Cloud Code のステータスバーから選択できるオプション: 通常の Cloud Code アクションに加えて、Open Logs ログ、Open Service URL、Watch Mode をオンにします

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

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

構成の詳細

Cloud Code は内部の Skaffold を活用して次の構成の詳細を自動的に処理します。

  • デバッガをアタッチできるように、デバッグポートのポート転送を行います。
  • アプリケーション内の 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

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

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

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

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

Cloud Code の VS Code は、Kubernetes Pod へのデバッガのアタッチもサポートします。相違点については、こちらのをご覧ください。