在 Kubernetes 中调试
PyCharm 支持以下 Kubernetes 调试流程:使用临时容器对 Pod 进行即时故障排查,以及使用 Telepresence 进行远程调试,从而使您无需离开您的 IDE 即可诊断各种问题。
临时容器
PyCharm 支持将 临时容器 附加到正在运行的 Pod,而无需重启 Pod。 通过这种方式,您可以检查实时的 Kubernetes 环境、运行诊断命令,并直接在正在运行的 Pod 内排查问题。
临时容器会为调试而临时添加到现有的 Pod 中,并与您的应用程序容器同时运行。 为此,PyCharm 会在后台运行 kubectl debug 命令。 您可以附加自定义调试容器,或使用轻量级的 BusyBox 镜像,其开箱即用地提供了诸如 ping、 netstat、 wget 和 top 等常用工具。
有关调试正在运行的 Pod 的详细信息,请参阅 Kubernetes 文档。
将 BusyBox 附加到正在运行的 Pod
打开 Services 工具窗口:选择 或按 Alt+8。
展开列出正在运行的 Pod 的节点,右键点击您要调试的 Pod,然后在上下文菜单中选择 。
或者,选择所需的 Pod,点击工具栏中的
,然后在下拉列表中选择 Attach Busybox。
将自定义容器附加到正在运行的 Pod
打开 Services 工具窗口:选择 或按 Alt+8。
展开列出正在运行的 Pod 的节点,右键点击您要调试的 Pod,然后在上下文菜单中选择 。
或者,选择所需的 Pod,点击工具栏中的
,然后在下拉列表中选择 附加自定义。在 Attach Custom Debug Container 对话框中,使用以下字段自定义用于启动并附加临时容器的
kubectl debug命令:Pod :在下拉列表中选择您要调试的 Pod。
Target :指定所选 Pod 内的目标容器。
Image :开始键入要用于调试的镜像名称,然后从建议列表中选择它。
可执行文件 :指定临时容器启动后要在其中运行的 shell 的绝对路径(例如,
/bin/sh适用于 BusyBox,或/bin/bash适用于 Ubuntu)。选项 :为调试容器提供其他配置参数。 有关示例,请参阅 Kubernetes 文档。

点击 Attach to Pod。
PyCharm 启动新的临时容器并成功将其附加到 Pod 后,会打开 控制台 选项卡,您可以在其中运行命令并检查 Pod。

如果您 附加 BusyBox ,PyCharm 会自动使用 sh。 对于 自定义镜像 ,IDE 使用在 可执行文件 字段中指定的 shell。
当您删除其附加的 Pod 时,该容器会被移除。
最近的命令
使用 临时调试容器 菜单附加临时容器时,PyCharm 会自动保存相应的 kubectl debug 命令。 您可以稍后在 最近 部分访问并重新运行它。

使用最近的命令启动临时容器
打开 Services 工具窗口:选择 或按 Alt+8。
展开列出正在运行的 Pod 的节点,然后右键点击您要调试的 Pod。 在上下文菜单中选择 Ephemeral Debug Containers ,并选择所需的最近的命令。
或者,选择所需的 Pod,点击工具栏中的
,然后在下拉列表中选择最近的命令。
管理最近的命令
访问最近的命令:
在 设置 对话框(Ctrl+Alt+S )中,选择 。
打开 服务 工具窗口(Alt+8)。 右键点击任意正在运行的 Pod,并从上下文菜单中选择 。
转到 临时调试容器 部分。
要添加一个可预先配置并快速启动新临时容器的新命令,请点击
。 在 添加调试参数 对话框中,您可以为
kubectl debug命令指定镜像、可执行文件和选项。要从最近的命令中移除某个命令,请在表格中选择它并点击
。
要编辑现有命令,请在表格中选择它并点击
。 在 添加调试参数 对话框中,更改
kubectl debug命令的镜像、可执行文件和选项。
Telepresence
Telepresence 是一款工具,使您能够访问 Kubernetes 集群中的服务、调试它们、进行并测试更改,就像这些服务在您的本地计算机上运行一样。
Kubernetes 插件提供与 Telepresence 的集成,可让您:
连接到 Telepresence ,以通过其 DNS 名称访问集群中的服务。
拦截服务 ,将来自集群的流量路由到您的本地环境。
连接到 Telepresence
打开 Services 工具窗口:选择 或按 Alt+8。
右键点击您的 Kubernetes 集群,并选择 连接Telepresence。 或者,点击工具栏中的
。 出现提示时,输入启动 Telepresence 守护程序所需的管理员帐户密码。 在 Windows 上,允许执行 telepresence.exe 。
安装 Telepresence 和 Traffic Manager 后,请再次点击 连接Telepresence。
现在,您可以通过服务的 DNS 名称访问 Kubernetes 集群中的服务,仿佛该集群在您的工作站上运行。 例如,如果您有一个接受对 hello-node:9001 发出的请求的应用程序,您可以通过其名称进行访问。

拦截来自集群的流量
拦截允许您将发往 Kubernetes 集群中某个服务的流量路由到本地服务。
在工具栏上,点击
(创建新拦截 ),然后点击 创建新拦截。
在打开的窗口中,在 服务 列表中选择要拦截的工作负载。 这可以是 Deployment、ReplicaSet 或 StatefulSet。
在 端口 字段中,指定您的服务本地实例正在运行的端口。

如果成功拦截该服务,您可以在本地访问它,并使用 IDE 功能来尝试、调试和分析性能您的集群中运行的应用程序。
退出 Telepresence
Telepresence 一次只能与一个集群交互,因此在连接到其他集群之前,您可能需要先将其停止。 退出 Telepresence 将停止所有活动的拦截。
打开 Services 工具窗口:选择 或按 Alt+8。
右键点击您的 Kubernetes 集群,并选择 退出Telepresence。 或者,点击工具栏中的
。
使用拦截运行应用程序
在 PyCharm 中,您只需点击一次即可运行本地应用程序,同时将发往您的 Kubernetes 集群中某个服务的流量重定向到该本地应用程序。
这是通过为您的 Kubernetes 集群配置隧道(一个 Telepresence 拦截),并 将其添加为运行配置的 启动前任务来实现的。 每次您 运行此运行配置 时,PyCharm 都会创建一个 Telepresence 拦截,使您能够像在本地运行一样调试远程应用程序。
将拦截添加到您的运行配置
请确保:
您的服务的原始实例已在您的 Kubernetes 集群中部署并正在运行,且其本地实例的源代码已在编辑器中打开。
您的 PyCharm 实例已 连接到您的 Kubernetes 集群。
在主类声明附近的装订区域中点击
,并选择 为远程调试添加隧道。 如果您在 PyCharm 中至少连接了一个集群,则可以使用此操作。

或者,如果您的应用程序已存在运行/调试配置,请在运行小部件中点击
,并选择 为远程调试添加隧道。
在打开的 将Kubernetes 隧道添加到运行配置 窗口中,选择集群和命名空间,然后点击 连接到集群。 出现提示时,输入启动 Telepresence 守护程序所需的管理员帐户密码。
如果已成功连接到集群,请配置拦截参数:
在 服务 列表中,选择要拦截的工作负载。
在 端口 字段中,指定您的服务本地实例正在运行的端口。
可选地,为
telepresence intercept命令指定其他选项。

如果您想查看 Telepresence 命令的输出,请展开 输出 部分。 如果在连接到 Telepresence 时遇到任何错误,将自动展开此部分。
点击 保存配置。 为检查拦截参数,PyCharm 将创建一个拦截,然后退出该拦截。
拦截参数将作为新的运行配置中的 添加调试隧道 启动前任务保存。 为将其与其他运行配置区分开来,此运行配置名称将包含 (Telepresence) 后缀,例如 MyApp (Telepresence)。
现在,您已准备好 运行您的应用程序并拦截其远程版本。
使用拦截运行应用程序
在运行小部件中,选择带有 (Telepresence) 后缀的运行配置。

点击
以运行它,或点击
以启动调试器会话。
这将运行您的本地应用程序,同时按上述参数运行 telepresence intercept 命令。
Telepresence 现在会拦截发往您的集群中某个服务的所有流量,并将其路由到您的本地应用程序。 您可以在本地编写并调试已拦截的服务。
在 服务 工具窗口中,创建的拦截将显示在 Telepresence 拦截 节点下。 您的 Kubernetes 集群的根节点还会显示生成的 telepresence 命令及相关日志。

当您停止此应用程序(点击 )时,PyCharm 也会停止拦截(
telepresence leave)。