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

标签 c# visual-studio kubernetes visual-studio-debugging

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

  • Docker 镜像是使用官方 .NET Core 镜像编译的,并在/vsdbg 中填充了最新版本(不支持 --attach)。
  • Visual Studio 适用于我的 Docker 桌面。
  • Kubectl 已正确配置。我可以使用 Docker Desktop 附带的 kubernetes 集群或我们内部的 kubernetes 集群进行测试。
  • Azure 目前不是一个选项。我从文档中了解到这是微软更喜欢我做的事情。

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

    最佳答案

    行。让我们开始吧。首先确保你已经在 Debug模式下发布了你的应用程序!我更喜欢使用新的 Docker 功能多阶段构建来构建我的图像,所以我会在 Dockerfile 的构建阶段结束时编写类似这样的内容:

    RUN dotnet publish -c Debug -o ./results
    

    要将图像推送到 Minikube,我确实使用了这里描述的本地容器注册表。但是你可以像往常一样做。
    当你的容器启动并运行时,我们就可以开始破解它了。我将为此目的使用 Powershell,但同样可以轻松地用任何其他终端语言重写。您可以按照教程一步一步地在终端中执行命令,并在必要时使用 echo 命令一一检查 var 的值。
    在您的 *.yml 文件中,您应该有一个描述如下的选择器:
    selector:
      matchLabels:
        app: mywebapp
    

    捕获它并在你的 Powershell 终端中定义一个 $Selector 变量:
    $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 文件并将其命名为 kubdbg.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
    

    之后,您只需在命令行窗口中执行 kubebg.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/

    相关文章:

    c# - iTextSharp 如何读取 PDF 文件中的表格

    c# - 在使用 Visual Studio 进行调试时保持辅助线程运行

    visual-studio - 如何在普通 PowerShell session (不在 Visual Studio 中)运行 Nuget PowerShell cmdlet Install-Package?

    docker - 在 docker-for-desktop kubernetes 中哪里可以找到 ca.crt?

    docker - 尝试在 kubernetes 上的生命周期标签下使用命令时出现错误

    kubernetes - 在虚拟机上运行kubectl

    c# - 如何获取 WinForm 应用程序中最顶层窗体的句柄?

    c# - 如何将 DataAdapter 的超时时间增加到 3 分钟?

    c# - Asp.NET MVC 应用程序上的 MySQLRoleProvider 错误但仅使用 SQLServer

    c++ - Visual Studio 2008,错误 c2039 : 'set_new_handler' : is not a member of 'std'