好。让我们开始吧。首先,请确保您以调试模式发布了您的应用程序!我更喜欢使用新的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>
在-File
parameter中,您需要指定我们之前创建的脚本文件的绝对路径。然后按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而做出较少的假设回报