使用 VS Code 適用的 Cloud Code 偵錯 Kubernetes 應用程式

您可以使用 Cloud Code 和 skaffold debug,對部署至 Google Kubernetes Engine (GKE) 叢集的應用程式進行偵錯。

您可以對本機叢集 (例如 minikubeDocker Desktop)、GKE 或其他雲端服務供應商上的應用程式進行偵錯。

有了 Cloud Code 的偵錯支援,您就無須完成手動設定,例如設定通訊埠轉送或插入特定語言偵錯引數。進行偵錯作業需要具備 Cloud Code 就緒的 GKE 應用程式,其中包含 skaffold.yaml 設定檔和 cloudcode.kubernetes 啟動設定。

對 GKE 應用程式進行偵錯

如要開始對 GKE 應用程式偵錯,請按照下列步驟操作:

  1. 在 Cloud Code 狀態列中,按一下目前專案名稱。

    狀態列中的有效專案名稱

  2. 在隨即顯示的「快速挑選」選單中,選取「在 Kubernetes 上偵錯」

  3. 如果系統提示,請驗證憑證,以便在本機上執行及偵錯應用程式

  4. 如果應用程式沒有必要的 Skaffold 設定或 cloudcode.kubernetes 啟動設定,Cloud Code 可協助您設定

  5. 確認是否要使用目前的 Kubernetes 結構定義來執行應用程式 (或切換至偏好的結構定義)。

  6. 如果您選擇遠端叢集做為背景,請在系統提示時,選擇要將圖片推送至的映像註冊中心。

    如果專案已啟用 Artifact Registry API,且至少有一個 Artifact Registry 存放區,您可以瀏覽並選取現有的 Artifact Registry 存放區。

    以下範例說明如何為一些常見的註冊資料庫指定容器映像檔的儲存位置:

    Artifact Registry REGION-docker.pkg.dev/PROJECT_ID/REPO_NAME
    Docker Hub docker.io/ACCOUNT
    如果您使用的是私人 Docker Hub 存放區,請務必正確驗證
    AWS Container Repository (ECR) AWS_ACCOUNT_ID.dkr.ecr.REGION.amazonaws.com/APP
    Azure Container Registry (ACR) ACR_NAME.azurecr.io/APP

    為了產生最終的映像檔存放區名稱,Cloud Code 會將這個映像檔註冊資料庫與 Kubernetes 資訊清單中指定的映像檔名稱串連。這個選項會儲存在 cloudcode.kubernetes 啟動設定中 (位於 .vscode/launch.json)。

    詳情請參閱圖片註冊資料庫處理指南

    Cloud Code 會建構容器、將容器推送至註冊資料庫,並將 Kubernetes 設定套用至叢集,然後等待部署作業。

    推出後,Cloud Code 會自動將所有宣告的容器連接埠轉送至您的機器,並在輸出視窗中顯示網址,方便您瀏覽實際應用程式。

  7. 針對應用程式中的每個可偵錯的容器,確認或輸入遠端容器中的目錄,其中包含您要偵錯的程式。

    或者,您也可以按下 ESC 鍵略過對容器進行偵錯。

    遠端 Root 提示

    Cloud Code 會為應用程式中的每個可偵錯容器連結偵錯工作階段。

    對本機程式碼偵錯的同時,您可以依照平常的方式執行所有工作,例如設定中斷點和逐步完成程式碼,只是多了對使用中的 Kubernetes 叢集進行偵錯的附加優勢。

    根據預設,當您儲存應用程式變更時,Cloud Code 會重新部署應用程式並設定新的偵錯工作階段。您可以在專案的啟動設定中使用 watch 標記切換這項功能。

  8. 如果要觀察變數與堆疊資訊,請使用偵錯側欄。如要與偵錯工作階段互動,請使用底部窗格偵錯工具的「Debug Console」。

  9. 工作階段結束後,您可以使用下列內容功能表指令:

    • 開啟部署記錄:使用 Cloud Code 記錄檔探索工具,開啟特定部署作業的應用程式記錄檔。
    • 開啟服務網址:在網路瀏覽器中開啟特定服務的應用程式服務網址
  10. 如果您已在啟動設定中關閉監控模式,並且想要變更應用程式,以及重新建構及重新部署應用程式,請在「Development sessions」窗格中暫停執行動作,然後按一下 「重新建構並重新部署」圖示「Rebuild and redeploy the application」

  11. 如要結束偵錯工作階段,請按一下「Debug」工具列中的 偵錯停止圖示「Stop」

    結束偵錯工作階段後,叢集會刪除所有已部署的 Kubernetes 資源。

設定詳細資料

Skaffold 提供技術支援的 Cloud Code,會自動處理所有支援語言的下列設定詳細資料:

  • 通訊埠轉送偵錯通訊埠,才可使偵錯工具連上系統。
  • 將偵錯工具與應用程式中的一個或多個可偵錯容器相連結。如果您的應用程式在 skaffold.yaml 中設定了多個可偵錯的容器 (Cloud Code 偵錯工具支援的語言容器),則偵錯工具會與每個可偵錯的容器個別相互連結。
  • 跨工作階段保留來源對應定義;您可以直接編輯 .vscode/launch.json 檔案,自訂這些定義。

Cloud Code 也會處理下列特定語言的設定詳細資料:

Node.js

改寫要叫用的進入點:

node --inspect=localhost:9229

Python

使用初始化容器安裝 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 連接埠上的通訊 socket 連線,並在偵錯工具附加之前,讓 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

  • 請確認您已在電腦和 Go 容器上安裝 dlv 套件。
  • 透過 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

  • 請確認您已在 Kubernetes 容器上安裝 vsdbg,這是 Microsoft 的 .NET Core 指令列偵錯工具。

    例如:

    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 檔案,您可以使用「Debug」(偵錯) 面板新增這個檔案。

  1. 如要前往「Debug」面板,請按一下「活動」列中的 偵錯圖示「Run and Debug」

  2. 在下拉式選單中選取「新增設定」

  3. 選取「Cloud Code: Kubernetes」做為環境。

    將 Cloud Code 設為 Kubernetes 環境

  4. 選取「Attach to 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:附加至 Kubernetes Pod 程式碼片段。
  4. 更新設定中的屬性,使其與專案的屬性相符。如要進一步瞭解設定屬性,請參閱「設定屬性」。

設定屬性

屬性 說明
debugPort 容器上使用的偵錯通訊埠。
podSelector 用來選取偵錯 Pod 的鍵/值組合。詳情請參閱選取器指南。以下範例顯示典型的 podSelector

"podSelector": { "app": <deployment-name> }
localRoot 包含要偵錯程式的本機目錄路徑。預設值為 ${workspaceFolder}。
remoteRoot 包含要偵錯程式的遠端目錄絕對路徑 (在 Kubernetes 容器上)。

將偵錯工具連結至 Kubernetes pod

Cloud Code for VS Code 支援將偵錯工具連結至 Node.js、Python、Go、Java 和 .NET 的 Kubernetes pod。您只需要可偵錯的容器cloudcode.kubernetes 類型的連結設定

如要瞭解附加至 Kubernetes Pod 與偵錯 Kubernetes 應用程式的差異,請參閱「將偵錯工具附加至 Pod 與偵錯 Kubernetes 應用程式的差異」。

如要將偵錯工具附加至 Kubernetes pod,請執行下列工作:

  1. 如要前往「Debug」面板,請按一下「活動」列中的 偵錯圖示「Run and Debug」
  2. 按下 F5 選取並啟動設定。

    • localhost:${debugPort} 會在偵錯時由通訊埠轉送到容器上的 debugPort

    偵錯工作階段現已設定成功。您可以執行偵錯本機程式碼時通常會執行的工作,例如設定中斷點和逐步完成程式碼。

  3. 如果要觀察變數與堆疊資訊,請使用偵錯側欄。如要與偵錯工作階段互動,請使用底部窗格偵錯工具的「Debug Console」。

  4. 如要結束偵錯工作階段,請按一下「Debug」工具列中的 偵錯停止圖示「Stop」

將偵錯工具連接至 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
}
這項設定無法用於執行應用程式。 您可以使用這項設定來執行或偵錯應用程式。
這項設定會因語言而異。 這項設定不限於特定語言。
沒有專屬指令。 在 Kubernetes 上偵錯指令。
無法使用監看模式,因此在變更後,請手動重新啟動偵錯工具。 在監控模式下,Cloud Code 會在您儲存變更後重新啟動偵錯工具。

後續步驟

取得支援

如要提供意見回饋,請前往 GitHub 回報問題,或在 Stack Overflow 上提問。