使用 Cloud Code for VS Code 调试 Kubernetes 应用

Cloud Code 可用于调试部署到 Google Kubernetes Engine (GKE)集群 skaffold debug

您可以在本地集群(如 minikubeDocker Desktop)、GKE 或任何其他云服务商上调试应用。

借助 Cloud Code 的调试支持,您无需完成 手动设置,例如设置端口转发或注入特定语言的 调试参数。调试需要一个支持 Cloud Code 的 GKE 应用,其中包含 skaffold.yaml 配置文件和 cloudcode.kubernetes 启动配置。

调试 GKE 应用

如需开始调试 GKE 应用,请按以下步骤操作:

  1. 在 Cloud Code 状态栏中,点击活跃项目名称。

    状态栏中的有效项目名称

  2. 在显示的“快速选择”菜单中,选择 Debug on Kubernetes

  3. 如果出现提示,请对您的凭据进行身份验证,以运行和调试 应用

  4. 如果您的应用没有必要的 Skaffold 配置或 cloudcode.kubernetes 启动配置,Cloud Code 将帮助您进行设置

  5. 确认要使用当前的 Kubernetes 上下文来运行应用(还是切换到首选 Kubernetes 上下文)。

  6. 如果您选择了远程集群作为上下文,请在出现提示时选择将映像推送到其中的映像注册数据库。如果您使用的是 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 代码库,请确保已正确进行身份验证
    AWS Container Repository (ECR) {aws_account_id}.dkr.ecr.{region}.amazonaws.com/{my-app}
    Azure Container Registry (ACR) {my_acr_name}.azurecr.io/{my-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. 如果您在启动配置中关闭了手表模式,并且想要 对应用进行更改并重新构建并重新部署应用 在“开发会话”窗格中暂停运行操作,然后点击 “重新构建和重新部署”图标 重新构建并重新部署应用

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

    结束调试会话后,所有部署的 Kubernetes 资源都会从集群中删除。

配置详情

Skaffold 提供支持的 Cloud Code 自动 处理所有受支持语言的以下配置详情:

  • 对调试端口执行端口转发,以便连接调试器。
  • 将调试器连接到应用中的一个或多个可调试容器。 如果您的应用有多个可调试容器( 指定语言) 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

  • 确保您的机器和容器中已安装 ptvsd 模块。
  • 通过 ptvsd 启动 Python 应用。将指定的端口与 debugPort 字段(在 连接配置。 例如:
    CMD ["python", "-m", "ptvsd", "--port", "", "app.py"]

Go

  • 请确保您拥有 dlv 软件包 您的机器以及 Go 容器中安装的应用。
  • 通过以下方式启动您的 Go 应用: dlv debug

    启动命令中指定的端口应与附加配置中的 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. 如需前往“调试”面板,请点击活动栏中的 “调试”图标Run and Debug(运行和调试)。

  2. 从下拉菜单中选择添加配置

  3. Cloud Code Kubernetes 设置为环境。

    将 Cloud Code Kubernetes 设置为环境

  4. 选择 Attach to 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 代码段 使用。
  4. 更新配置中的属性,以匹配项目的属性。如需详细了解配置属性,请参阅 配置属性

配置属性

属性 说明
debugPort 容器中使用的调试端口。
podSelector 用于选择调试 pod 的一组键值对。有关 请参阅 选择器指南)。 以下示例展示了典型的 podSelector

"podSelector": { "app": <deployment-name> }
localRoot 包含待调试程序的本地目录的路径。 默认为 ${workspaceFolder}。
remoteRoot 包含待调试程序的远程目录的绝对路径(在 Kubernetes 容器中)。

将调试程序连接到 Kubernetes Pod

Cloud Code for VS Code 支持将调试程序连接到 Kubernetes Pod, Node.js、Python、Go、Java 和 .NET。您只需要 可调试的容器“关联配置”类型 cloudcode.kubernetes

如需了解如何附加到 Kubernetes pod 与调试 Kubernetes 应用不同,请参阅将调试程序附加到 pod 与调试 Kubernetes 应用的区别

如需将调试程序附加到 Kubernetes pod,请执行以下任务:

  1. 如需前往“调试”面板,请点击活动栏中的 “调试”图标Run and Debug(运行和调试)。
  2. F5 选择并启动配置。

    • 在调试过程中,localhost:${debugPort} 会通过端口转发到容器中的 debugPort

    调试会话现已设置成功。您可以执行在调试本地代码时通常会执行的任务,例如设置断点和单步执行代码。

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

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

将调试程序附加到 pod 与调试 Kubernetes 应用的区别

附加到 Kubernetes Pod 调试 Kubernetes 应用
调试单个 Kubernetes pod。 调试应用中所有可调试的容器。
应用必须在 Kubernetes Pod 中运行才能进行调试。 在 Kubernetes 集群上运行应用并附加调试程序。
使用类型为 cloudcode.kubernetesconfiguration (.vscode/launch.json),并请求 attach 使用类型为 cloudcode.kubernetesconfiguration (.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 命令。
Watch 模式不可用,因此进行更改后,请手动重启调试程序。 Watch 模式允许 Cloud Code 在您保存更改后重启调试程序。

后续步骤

获取支持

如需发送反馈,请在 GitHub 上报告问题,或者在 Stack Overflow 上提问。