使用 Cloud Code for VS 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 上下文来运行应用(还是切换到首选 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 跳过对容器的调试。

    远程根目录提示

    Cloud Code 会为应用中的每个可调试容器连接一个调试会话。

    现在您可以执行在调试本地代码时通常会执行的任务,例如针对实时 Kubernetes 集群设置断点和单步执行代码。

    默认情况下,当您保存对应用的更改时,Cloud Code 会重新部署应用并设置新的调试会话。您可以使用项目的启动配置中的 watch 标志切换此功能。

  8. 如需检查变量和堆栈信息,请使用调试边栏。 如需与调试会话进行交互,请使用底部窗格调试器中的调试控制台

  9. 会话完成后,您可以使用以下上下文菜单命令:

    • 打开部署日志:使用 Cloud Code 日志浏览器打开特定部署的应用日志。
    • 打开服务网址:在 Web 浏览器中打开特定服务的应用服务网址
  10. 如果您在启动配置中关闭了监视模式,并且您希望更改应用并重新构建和重新部署应用,请在“开发会话”(Development sessions) 窗格中暂停运行操作,然后点击 “重新构建和重新部署”图标 重新构建和重新部署应用 (Rebuild and redeploy the application)。

  11. 如需结束调试会话,请点击调试工具栏中的 调试停止图标 停止

    结束调试会话后,所有部署的 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> --