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

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

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

若是使用 Cloud Code 的偵錯支援,您就無須完成設定通訊埠轉送,或插入特定語言偵錯引數等手動設定。如要進行偵錯,您需要具備 Cloud Code 且包含 skaffold.yaml 設定檔和 cloudcode.kubernetes 啟動設定在內的 GKE 應用程式。

對 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. 如果您已在啟動設定中關閉監看模式,且想要變更應用程式、重建並重新部署應用程式,請在「開發工作階段」窗格中暫停執行動作,然後按一下「重建並重新部署應用程式」重新建構及重新部署圖示

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

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

設定詳細資料

Cloud Code 採用 Skaffold,可自動處理所有支援語言的下列設定詳細資料:

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

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

Node.js

重新編寫進入點以叫用:

node --inspect=localhost:9229

Python

使用 Init Container 安裝 ptvsd 模組,並重新編寫進入點來叫用:

python -m ptvsd --host localhost --port 5678

Go

使用 Init Container 安裝 dlv 偵錯工具,並重新編寫進入點,讓啟動的偵錯工作階段只使用偵錯伺服器 (無周邊模式),繼續偵錯程序 (啟動時)、接受多個用戶端連線,並在 localhost:56268 監聽:

  dlv exec --headless --continue --accept-multiclient --listen=localhost:56268 --api-version=2, <app> --

Java

新增環境 JAVA_TOOLS_OPTIONS,並使用適當的 Java 偵錯線路通訊協定 (JDWP) 設定,讓 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 Pod) 選項

    選取 Kubernetes 設定選項

  5. 選取您使用的程式設計語言。

    這會建立並開啟專案的 launch.json 檔案,並為您建立附加設定。

  6. 更新 launch.json 檔案中的設定屬性,使設定屬性與您專案的屬性相符。如要進一步瞭解設定屬性,請參閱「設定屬性」。

在 .vscode/launch.json 檔案中新增附加設定

如要在現有的 .vscode/launch.json 檔案中新增附加設定,請按照下列步驟操作:

  1. 開啟 launch.json 檔案。
  2. 如要叫用程式碼片段 Intellisense,請按一下「新增設定」
  3. 如要新增附加設定,請選取您使用的語言適用的「Cloud Code: Attach to Kubernetes Pod」(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。您只需要可偵錯的容器attach 設定 (類型為 cloudcode.kubernetes)。

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

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

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

    • 偵錯時,localhost:${debugPort} 會轉送至容器上的 debugPort

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

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

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

將偵錯工具附加至 Pod 與偵錯 Kubernetes 應用程式的差異

連結至 Kubernetes Pod 對 Kubernetes 應用程式進行偵錯
對單一 Kubernetes Pod 進行偵錯。 偵錯應用程式中所有可偵錯的容器。
應用程式必須在 Kubernetes Pod 中執行,才能進行偵錯。 在 Kubernetes 叢集上執行應用程式,並附加偵錯工具。
使用類型為 cloudcode.kubernetes 和要求 attach設定 (.vscode/launch.json) 使用類型為 cloudcode.kubernetes 且要求為 launch設定 (.vscode/launch.json)
詳情請參閱「啟動與附加設定」。
設定範例:
{
  "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 會在監看模式下重新啟動偵錯工具。

後續步驟

取得支援

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