您可以使用 Cloud Code 和 skaffold debug
,對部署至 Google Kubernetes Engine (GKE) 叢集的應用程式進行偵錯。
您可以對本機叢集 (例如 minikube 或 Docker Desktop)、GKE 或其他雲端服務供應商上的應用程式進行偵錯。
有了 Cloud Code 的偵錯支援,您就無須完成手動設定,例如設定通訊埠轉送或插入特定語言偵錯引數。進行偵錯作業需要具備 Cloud Code 就緒的 GKE 應用程式,其中包含 skaffold.yaml
設定檔和 cloudcode.kubernetes
啟動設定。
對 GKE 應用程式進行偵錯
如要開始對 GKE 應用程式偵錯,請按照下列步驟操作:
在 Cloud Code 狀態列中,按一下目前專案名稱。
在隨即顯示的「快速挑選」選單中,選取「在 Kubernetes 上偵錯」。
如果系統提示,請驗證憑證,以便在本機上執行及偵錯應用程式。
如果應用程式沒有必要的 Skaffold 設定或
cloudcode.kubernetes
啟動設定,Cloud Code 可協助您設定。確認是否要使用目前的 Kubernetes 結構定義來執行應用程式 (或切換至偏好的結構定義)。
如果您選擇遠端叢集做為背景,請在系統提示時,選擇要將圖片推送至的映像註冊中心。
如果專案已啟用 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 會自動將所有宣告的容器連接埠轉送至您的機器,並在輸出視窗中顯示網址,方便您瀏覽實際應用程式。
針對應用程式中的每個可偵錯的容器,確認或輸入遠端容器中的目錄,其中包含您要偵錯的程式。
或者,您也可以按下 ESC 鍵略過對容器進行偵錯。
Cloud Code 會為應用程式中的每個可偵錯容器連結偵錯工作階段。
對本機程式碼偵錯的同時,您可以依照平常的方式執行所有工作,例如設定中斷點和逐步完成程式碼,只是多了對使用中的 Kubernetes 叢集進行偵錯的附加優勢。
根據預設,當您儲存應用程式變更時,Cloud Code 會重新部署應用程式並設定新的偵錯工作階段。您可以在專案的啟動設定中使用
watch
標記切換這項功能。如果要觀察變數與堆疊資訊,請使用偵錯側欄。如要與偵錯工作階段互動,請使用底部窗格偵錯工具的「Debug Console」。
工作階段結束後,您可以使用下列內容功能表指令:
- 開啟部署記錄:使用 Cloud Code 記錄檔探索工具,開啟特定部署作業的應用程式記錄檔。
- 開啟服務網址:在網路瀏覽器中開啟特定服務的應用程式服務網址
如果您已在啟動設定中關閉監控模式,並且想要變更應用程式,以及重新建構及重新部署應用程式,請在「Development sessions」窗格中暫停執行動作,然後按一下
「Rebuild and redeploy the application」。
如要結束偵錯工作階段,請按一下「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
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」(偵錯) 面板新增這個檔案。
如要前往「Debug」面板,請按一下「活動」列中的
「Run and Debug」。
在下拉式選單中選取「新增設定」。
選取「Cloud Code: Kubernetes」做為環境。
選取「Attach to Kubernetes Pod」選項。
選取您使用的程式設計語言。
這會為專案建立並開啟
launch.json
檔案,並為您建立附加設定。更新
launch.json
檔案中的設定屬性,使設定屬性與專案的屬性相符。如要進一步瞭解設定屬性,請參閱「設定屬性」。
在 .vscode/launch.json 檔案中新增附加設定
如要在現有的 .vscode/launch.json
檔案中新增附加設定,請按照下列步驟操作:
- 開啟
launch.json
檔案。 - 如要叫用程式碼片段 Intellisense,請按一下「Add Configuration」。
- 如要新增附加設定,請針對您使用的語言選取 Cloud Code:附加至 Kubernetes Pod 程式碼片段。
- 更新設定中的屬性,使其與專案的屬性相符。如要進一步瞭解設定屬性,請參閱「設定屬性」。
設定屬性
屬性 | 說明 |
---|---|
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,請執行下列工作:
- 如要前往「Debug」面板,請按一下「活動」列中的
「Run and Debug」。
按下
F5
選取並啟動設定。localhost:${debugPort}
會在偵錯時由通訊埠轉送到容器上的debugPort
。
偵錯工作階段現已設定成功。您可以執行偵錯本機程式碼時通常會執行的工作,例如設定中斷點和逐步完成程式碼。
如果要觀察變數與堆疊資訊,請使用偵錯側欄。如要與偵錯工作階段互動,請使用底部窗格偵錯工具的「Debug Console」。
如要結束偵錯工作階段,請按一下「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 會在您儲存變更後重新啟動偵錯工具。 |
後續步驟
- 使用檔案同步和熱重新載入功能,加快開發速度。
- 在 Cloud Code 中設定持續開發環境。
- 在 Cloud Code 中查看 Kubernetes 記錄檔。