我们的团队希望能够针对已部署到我们内部 Kubernetes 集群的 ASP.NET 应用程序实例运行 Visual Studio 调试器。我需要弄清楚如何完成拼图,但我对 Visual Studio 2019 不是很熟悉。
我应该如何配置 Visual Studio 才能做到这一点?
最佳答案
行。让我们开始吧。首先确保您已在 Debug模式下发布您的应用程序!我更喜欢使用新的 Docker 功能多阶段构建来构建我的图像,所以我会在 Dockerfile 的构建阶段结束时编写如下内容:
RUN dotnet publish -c Debug -o ./results
要将图像推送到 Minikube,我确实使用了此处所述的本地容器注册表。但是你可以像往常一样做。
当你的容器启动并运行时,我们就可以开始攻击它了。为此,我将使用 Powershell,但同样可以轻松地用任何其他终端语言重写。您可以按照教程一步一步地在终端中执行命令,并在必要时使用 echo 命令检查 var 的值。
在您的 *.yml 文件中,您应该有一个描述如下的选择器:
selector:
matchLabels:
app: mywebapp
捕获它并使用它在你的 Powershell 终端中定义一个 $Selector var:
$Selector = 'app=mywebapp'
您需要通过其选择器找到运行容器化应用程序的 pod:
$pod = kubectl get pods --selector=$Selector -o jsonpath='{.items[0].metadata.name}';
假设您现在在 pod 上只有一个容器,您可以在该容器上执行命令。默认情况下,容器没有安装 vsdbg,所以继续安装它:
kubectl exec $pod -i -- apt-get update;
kubectl exec $pod -i -- apt-get install -y unzip;
kubectl exec $pod -i -- curl -sSL https://aka.ms/getvsdbgsh -o '/root/getvsdbg.sh';
kubectl exec $pod -i -- bash /root/getvsdbg.sh -v latest -l /vsdbg;
接下来,您需要在容器内找到您的应用程序的 PID:
$prid = kubectl exec $pod -i -- pidof -s dotnet;
通常它等于 1,但最好少做一些假设。
而已。现在您可以启动调试器:
kubectl exec $pod -i -- /vsdbg/vsdbg --interpreter=mi --attach $prid;
在关闭窗口之前不要忘记执行以下命令,否则您的应用程序将永远卡住:
-target-detach
-gdb-exit
让我们把所有东西放在一起,创建一个可重用的脚本并将其保存在靠近根的地方,因为您可以将它用于所有 ASP.NET Core 项目:
param(
# the selector from your yml file
# selector:
# matchLabels:
# app: myweb
# -Selector app=myweb
[Parameter(Mandatory=$true)][string]$Selector
)
Write-Host '1. searching pod by selector:' $Selector '...';
$pod = kubectl get pods --selector=$Selector -o jsonpath='{.items[0].metadata.name}';
Write-Host '2. installing updates ...';
kubectl exec $pod -i -- apt-get update;
Write-Host '3. installing unzip ...';
kubectl exec $pod -i -- apt-get install -y --no-install-recommends unzip;
Write-Host '4. downloading getvsdbgsh ...';
kubectl exec $pod -i -- curl -sSL https://aka.ms/getvsdbgsh -o '/root/getvsdbg.sh';
Write-Host '5. installing vsdbg ...';
kubectl exec $pod -i -- bash /root/getvsdbg.sh -v latest -l /vsdbg;
$cmd = 'dotnet';
Write-Host '6. seaching for' $cmd 'process PID in pod:' $pod '...';
$prid = kubectl exec $pod -i -- pidof -s $cmd;
Write-Host '7. attaching debugger to process with PID:' $pid 'in pod:' $pod '...';
kubectl exec $pod -i -- /vsdbg/vsdbg --interpreter=mi --attach $prid;
现在,当终端从脚本文件夹运行时,您可以像这样执行此脚本:
powershell -ExecutionPolicy Bypass -File kubedbg.ps1 -Selector app=mywebapp
但是我们不应该从 Visual Studio 进行调试吗?是的!让我们更进一步,从 Visual Studio MIEngine 启动我们的终端进程。
在 Visual Studio 中打开您的项目。添加具有以下内容的新 XML 文件并将其命名为 kubedbg.xml:
<PipeLaunchOptions xmlns="http://schemas.microsoft.com/vstudio/MDDDebuggerOptions/2014"
PipePath="powershell" TargetArchitecture="x64" MIMode="clrdbg"
PipeArguments="
-ExecutionPolicy Bypass
-File C:\kube\kubedbg.ps1
-Selector app=mywebapp">
<LaunchCompleteCommand>None</LaunchCompleteCommand>
</PipeLaunchOptions>
在
-File
参数中,您需要指定我们之前创建的脚本文件的绝对路径。然后按 Ctrl+Alt+A 打开命令行窗口并运行以下命令:Debug.MIDebugLaunch /Executable:dotnet /OptionsFile:absolute_path_to_kubedbg_xml
此命令将在 Visual Studio 中启动调试过程,并具有您期望的所有标准优势。但是,除了从 Debug 菜单中按 Detach All 之外,不要以任何其他方式停止调试!虽然这个命令一直写起来不是很方便。幸运的是,在 Visual Studio 中,您可以为带参数的命令指定别名。最终,每个项目都需要一个新的
kubedbg.xml
文件。考虑到这一点,通过在命令行窗口中键入以下命令来创建您的第一个别名:alias kubedbg.mywebapp Debug.MIDebugLaunch /Executable:dotnet
/OptionsFile:absolute_path_to_kubedbg.xml
之后,您只需在命令行窗口中执行 kubedbg.mywebapp 即可开始调试。更好的是,您可以从“查找”工具栏组合框中运行相同的命令,但带有前缀:
>kubedbg.mywebapp.
这并不困难,因为也有文本完成。您可以在此处阅读有关命令别名的更多信息。调试愉快!
PS:作为奖励,即使在公共(public)云中运行时,您也可以以完全相同的方式调试应用程序。当 kubectl 被分配到公共(public)云中的集群时,它只使用相同的脚本工作,并且由于内部真实的集群进程 ID 不等于 1,因此做出更少的假设返回
原作者:https://medium.com/@pavel.agarkov/debugging-asp-net-core-app-running-in-kubernetes-minikube-from-visual-studio-2017-on-windows-6671ddc23d93
关于c# - 将 Visual Studio 调试器与在 Kubernetes 中运行的 ASP.NET Core Web 应用程序一起使用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60929805/