将Visual Studio调试器与在Kubernetes中运行的ASP.NET Core Web应用一起使用吗?


9

我们的团队希望能够针对内部Kubernetes集群的ASP.NET应用程序的已部署实例运行Visual Studio调试器。我需要弄清楚如何完成拼图,但是我对Visual Studio 2019不太熟悉。

  • Docker映像使用官方的.NET Core映像进行编译,并且/ vsdbg填充了最新版本(不支持--attach)。
  • Visual Studio可与我的Docker桌面一起使用。
  • Kubectl已正确配置。我可以使用Docker Desktop随附的kubernetes集群或我们内部的kubernetes集群进行测试。
  • Azure当前不是一种选择。我从文档中了解到,这就是Microsoft希望我执行的操作。

我应该如何配置Visual Studio才能做到这一点?


你好 我想问一个问题,为什么在第一个列表项中说“ ... / vsdbg填充了最新版本(不支持--attach)。” ?如果您有vsdbg;它应该支持附加。
萨法克·乌鲁索伊

@SafakUlusoy我安装的vsdbg不支持--attach标志。
托尔比约恩Ravn的安徒生

Answers:


4

好。让我们开始吧。首先,请确保您以调试模式发布了您的应用程序!我更喜欢使用新的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 = kubectl get pods --selector=$Selector -o jsonpath='{.items[0].metadata.name}';

假设现在容器上只有一个容器,则可以在该容器上执行命令。默认情况下,容器未安装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>

-Fileparameter中,您需要指定我们之前创建的脚本文件的绝对路径。然后按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:作为奖励,您甚至可以在公共云中运行时以完全相同的方式调试应用程序。当将kubectl分配给公共云中的集群时,它只使用相同的脚本,并且由于内部集群实际进程ID不等于1而做出较少的假设回报


谢谢您的彻底回答。我看到--attach在用于附加调试器的kubectl命令中使用了该标志,这让我有些担心。在准备此答案时,您可以确认这对您有用吗?
托尔比约恩Ravn的安徒生

是的,真的为我工作!但我不知道为什么对您不起作用。
devcass

感谢您确认此操作对您有用。明天我会尝试的。
托尔比约恩Ravn的安徒生

别客气!祝好运!如果您需要什么,我在这里
devcass
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.