借助 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 状态栏中,点击活跃项目名称。

在显示的快速选择菜单中,选择 Debug on Kubernetes 。
如果您的应用没有必要的 Skaffold 配置或
cloudcode.kubernetes启动配置,Cloud Code 将帮助您进行设置。确认要使用当前的 Kubernetes 上下文 来运行应用(还是切换到首选 Kubernetes 上下文)。
如果您选择了远程集群作为上下文,请在出现提示时选择将映像推送到其中的映像注册数据库。
如果您的项目已启用 Artifact Registry API 并且至少有 一个 Artifact Registry 代码库,则 可以浏览并选择现有的 Artifact Registry 代码库。
以下示例展示了如何为一些常用的注册表指定容器映像的存储位置:
Artifact Registry REGION-docker.pkg.dev/PROJECT_ID/REPO_NAMEDocker Hub docker.io/ ACCOUNT
如果您使用的是专用 Docker Hub 代码库,请确保已 正确进行身份验证 。如需生成最终映像存储库名称,Cloud Code 会将此映像注册表与 Kubernetes 清单中指定的映像名称进行连接。您的选择会存储在
cloudcode.kubernetes启动配置(可在.vscode/launch.json中找到)中。如需了解详情,请参阅 映像注册表处理指南。
Cloud Code 会构建您的容器,将其推送到注册表,将 Kubernetes 配置应用到集群,并等待发布。
发布完成后,Cloud Code 会自动将所有声明的容器端口转发到您的机器,并在输出窗口中显示网址,以便您可以浏览正在运行的应用。
对于应用中的每个可调试容器,确认或输入您要调试的程序所在的远程容器目录。
或者,您可以按 ESC 跳过对容器的调试。

Cloud Code 会为应用中的每个可调试容器连接一个调试会话。
现在您可以执行在调试本地代码时通常会执行的任务,例如针对实时 Kubernetes 集群设置断点和单步执行代码。
默认情况下,当对应用的更改自动保存时,Cloud Code 会重新部署应用并设置新的调试会话。您可以使用项目的启动配置中的
watch标志切换此功能。会话完成后,您可以使用以下上下文菜单命令:
- 打开部署日志 :使用 Cloud Code 日志浏览器打开特定部署的应用日志。
- 打开服务网址 :在 Web 浏览器中打开特定服务的应用服务网址
如果您在启动配置中关闭了监视模式,并且您希望更改应用并重新构建和重新部署应用,请在“开发会话”(Development sessions) 窗格中暂停运行操作,然后点击
重新构建和重新部署应用 (Rebuild and redeploy the application)。如需结束调试会话,请点击调试工具栏中的
停止。结束调试会话后,所有部署的 Kubernetes 资源都会从集群中删除。
配置详情
Cloud Code 由 Skaffold 提供技术支持,该服务会自动 为所有受支持的语言处理以下配置详情:
- 对调试端口执行端口转发,以便连接调试器。
- 将调试器连接到应用中的一个或多个可调试容器。
如果您的应用的
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 调试连接协议 (JDWP) 配置添加环境 JAVA_TOOLS_OPTIONS,以便 JDWP 调试代理在端口 5005 上侦听套接字连接,并允许虚拟机在连接调试程序之前开始执行:
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
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”面板,请点击
Debug
活动栏中的。从下拉菜单中选择添加配置 。
将 Cloud Code: Kubernetes 设置为环境。

选择 Attach to Kubernetes Pod 选项。

选择您使用的编程语言。
这样将为您的项目创建并打开一个
launch.json文件,并为您创建一项连接配置。更新
launch.json文件中的配置属性,以匹配项目的配置属性。如需详细了解配置属性,请参阅 配置属性。
向 .vscode/launch.json 文件添加连接配置
如需向现有 .vscode/launch.json 文件添加新的连接配置,请按以下步骤操作:
- 打开
launch.json文件。 - 如要调用代码段 Intellisense,请点击添加配置 。
- 如需添加连接配置,请选择与您使用的语言对应的 Cloud Code: Attach to Kubernetes Pod 代码段。
- 更新配置中的属性,以匹配项目的属性。如需详细了解配置属性,请参阅 配置属性。
配置属性
| 属性 | 说明 |
|---|---|
| debugPort | 容器中使用的调试端口。 |
| podSelector | 用于选择调试 pod 的一组键值对。如需了解详情,请参阅选择器指南。以下示例展示了一个典型的 podSelector:
"podSelector": {
"app": <deployment-name>
}
|
| localRoot | 包含待调试程序的本地目录的路径。 默认为 ${workspaceFolder}。 |
| remoteRoot | 包含待调试程序的远程目录的绝对路径(在 Kubernetes 容器中)。 |
将调试器连接到 Kubernetes pod
Cloud Shell 版 Cloud Code 支持将调试器连接到
Node.js、Python、Go、Java 和 .NET 版 Kubernetes pod。您只需要一个
可调试的容器以及一个
连接配置,其类型为
cloudcode.kubernetes。
如需了解如何连接到 Kubernetes pod 与 调试 Kubernetes 应用不同,请参阅 连接调试器到 pod 与调试 Kubernetes 应用有何不同。
如需将调试器连接到 Kubernetes pod,请执行以下任务:
- 如需前往“Debug”面板,请点击
Debug
活动栏中的。 按
F5选择并启动这项配置。localhost:${debugPort}在调试过程中将通过端口转发到容器中的debugPort。
调试会话现已设置成功。您可以执行在调试本地代码时通常会执行的任务,例如设置断点和单步执行代码。
如需结束调试会话,请点击调试工具栏中的
停止
。
连接调试器到 pod 与调试 Kubernetes 应用有何不同
| 连接到 Kubernetes pod | 调试 Kubernetes 应用 |
|---|---|
| 调试单个 Kubernetes pod。 | 调试应用中所有可调试的容器。 |
| 应用必须在 Kubernetes Pod 中运行才能进行调试。 | 在 Kubernetes 集群上运行应用并附加调试程序。 |
使用类型为cloudcode.kubernetes的配置 (.vscode/launch.json) 并请求attach。
|
使用配置 (.vscode/launch.json),类型为cloudcode.kubernetes,请求为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
}
|
| 此配置不能用于运行应用。 | 此配置可用于运行或调试应用。 |
| 此配置特定于语言。 | 此配置与语言无关。 |
| 无专用命令。 | Debug on Kubernetes 命令。 |
后续步骤
- 使用 文件同步和热重载 来加快开发速度。
- 在 Cloud Code 中设置 持续开发 环境。
- 在 Cloud Code 中 查看 Kubernetes 日志。