Cloud Code 可用于调试部署到
Google Kubernetes Engine (GKE)集群
skaffold debug
。
您可以在本地集群(如 minikube 或 Docker Desktop)、GKE 或任何其他云服务商上调试应用。
借助 Cloud Code 的调试支持,您无需完成任何手动设置,例如设置端口转发或注入特定于语言的调试参数。要进行调试,需要准备 Cloud Code
包含 skaffold.yaml
的 GKE 应用
配置文件和 cloudcode.kubernetes
启动配置。
调试 GKE 应用
如需开始调试 GKE 应用,请按照以下说明操作 步骤:
在 Cloud Code 状态栏中,点击当前项目名称。
在显示的“快速选择”菜单中,选择 Debug on Kubernetes。
如果您的应用不具备必要的 Skaffold 配置或
cloudcode.kubernetes
启动配置、Cloud Code 可帮助您进行设置。确认要使用当前的 Kubernetes 上下文来运行应用(还是切换到首选 Kubernetes 上下文)。
如果您选择了远程集群作为上下文,请在出现提示时选择将映像推送到其中的映像注册数据库。如果您使用的是 Container Registry,则可以浏览至现有注册数据库,或指定要创建的注册数据库的名称。如果您的项目已启用 Artifact Registry API 并且至少有一个 Artifact Registry 代码库,则可以浏览并选择现有的 Artifact Registry 代码库。
以下示例展示了如何为一些常用的注册表指定容器映像的存储位置:
Artifact Registry {region}-docker.pkg.dev/{project_id}/{repo-name} Container Registry gcr.io/{project_id} Docker 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 Logs Explorer 部署。
- 打开服务网址:在 Web 浏览器中打开特定服务的应用服务网址
如果您在启动配置中关闭了监视模式,并且您希望更改应用并重新构建和重新部署应用,请在“开发会话”(Development sessions) 窗格中暂停运行操作,然后点击 重新构建和重新部署应用 (Rebuild and redeploy the application)。
如需结束调试会话,请点击调试工具栏中的 停止。
结束调试会话后,所有部署的 Kubernetes 资源都会从集群中删除。
配置详情
Cloud Code 由 Skaffold 提供技术支持,该服务会自动为所有受支持的语言处理以下配置详情:
- 对调试端口执行端口转发,以便连接调试器。
- 将调试器连接到应用中的一个或多个可调试容器。
如果您的应用有多个可调试容器(
指定语言)
skaffold.yaml
,则系统会将调试程序连接到每个可调试容器。 - 跨会话保留源映射定义;您可以直接修改
.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
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。
从下拉菜单中选择添加配置。
将 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 应用,请参阅 将调试程序连接到 Pod 与调试 Kubernetes 应用有何不同。
如需将调试程序附加到 Kubernetes pod,请执行以下任务:
- 要前往“调试”面板,请点击 调试 。
按
F5
选择并启动配置。- 在调试过程中,
localhost:${debugPort}
会通过端口转发到容器中的debugPort
。
调试会话现已设置成功。您可以使用 例如设置断点和 逐步执行代码。
- 在调试过程中,
如需结束调试会话,请点击调试工具栏中的 停止。
将调试程序附加到 pod 与调试 Kubernetes 应用的区别
附加到 Kubernetes Pod | 调试 Kubernetes 应用 |
---|---|
调试单个 Kubernetes pod。 | 调试应用中所有可调试的容器。 |
应用必须在 Kubernetes Pod 中运行才能进行调试。 | 在 Kubernetes 集群上运行应用并附加调试程序。 |
使用类型为 cloudcode.kubernetes 的配置 (.vscode/launch.json) 并请求 attach 。
|
使用类型为 cloudcode.kubernetes 的 configuration (.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 } |
此配置不能用于运行应用。 | 此配置可用于运行或调试应用。 |
此配置特定于语言。 | 此配置与语言无关。 |
无专用命令。 | Debug on Kubernetes 命令。 |
后续步骤
- 使用文件同步和热重载加快开发速度。
- 在 Cloud Code 中设置持续开发环境。
- 查看 Kubernetes 日志 编写代码。