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

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

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

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

  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 内)に保存されます。

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

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

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

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

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

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

    Remote Root プロンプト

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

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

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

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

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

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

    • Open Deployment Logs: Cloud Code ログビューアで特定のデプロイメントのアプリケーション ログを開きます。
    • Open Service URL: 特定サービスのアプリケーション サービス URL をウェブブラウザで開きます。
    • Turn on/off watch mode: 現在のセッションのウォッチモードを切り替えます。デフォルトでは、Cloud Code はファイル システム(Kubernetes 構成やコードなど)の変更を継続的に監視し、コンテナを再ビルドしてアプリケーションをクラスタに再デプロイします。これにより編集は、ほぼリアルタイムで反映されます。

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

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

    デバッグ セッションを終了すると、デプロイされたすべての 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 アプリケーションのデバッグをご覧ください。