Использовать отладчик Visual Studio с ASP. NET Базовым веб-приложением, запущенным в Kubernetes? - PullRequest
9 голосов
/ 30 марта 2020

Наша команда хочет иметь возможность запускать отладчик Visual Studio для развернутых экземпляров нашего приложения ASP. NET во внутреннем кластере Kubernetes. Мне нужно выяснить, как закончить sh головоломку, но я не очень знаком с Visual Studio 2019.

  • Изображение Docker скомпилировано с официальными. NET Основные изображения и / vsdbg заполнен последней версией (которая не поддерживает --attach).
  • Visual Studio работает с моим Docker рабочим столом.
  • Kubectl настроен правильно. Я могу использовать для тестирования либо кластер kubernetes, включенный в Docker Desktop, либо наш внутренний кластер kubernetes.
  • Azure в настоящее время не вариант. Из документации я понимаю, что это то, что Microsoft предпочитает делать.

Как мне настроить Visual Studio, чтобы иметь возможность делать это?

1 Ответ

4 голосов
/ 08 апреля 2020

Хорошо. Начнем. Прежде всего убедитесь, что вы опубликовали свое приложение в режиме отладки! Я предпочитаю использовать новую многоэтапную сборку Docker для создания моих изображений, поэтому в конце этапа сборки в Dockerfile я напишу что-то вроде этого:

RUN dotnet publish -c Debug -o ./results

To pu sh images для Minikube я использую локальный реестр контейнеров, как описано здесь. Но вы можете сделать это, как обычно. Когда ваш контейнер будет запущен и запущен, мы сможем взломать его. Я буду использовать Powershell для этой цели, но то же самое можно легко переписать на любом другом терминальном языке. Вы можете шаг за шагом следовать инструкциям и выполнять команды на своем терминале, проверяя значения var с помощью команды echo, когда это необходимо. В вашем * .yml файле вы должны описать селектор примерно так:

selector:
  matchLabels:
    app: mywebapp

Возьмите его и используйте для определения переменной $ Selector в вашем терминале Powershell:

$Selector = 'app=mywebapp'

You вам нужно найти модуль, в котором ваше контейнерное приложение выполняется с помощью селектора:

$pod = kubectl get pods --selector=$Selector -o jsonpath='{.items[0].metadata.name}';

Предполагая, что у вас есть только один контейнер, теперь вы можете выполнять команды для этого контейнера. По умолчанию в контейнере не установлена ​​vsdbg, поэтому go впереди и установите его:

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 базовыми проектами:

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? Да! Давайте go продолжим и запустим наш процесс терминала из 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 со всеми ожидаемыми стандартными преимуществами. Но не прекращайте отладку другим способом, кроме как нажатием кнопки «Отключить все» в меню «Отладка»! Хотя эту команду не очень удобно писать постоянно. К счастью, в Visual Studio вы можете указать псевдонимы для команд с параметрами. В конце концов вам понадобится новый файл kubedbg.xml для каждого проекта. Имея это в виду go вперед и создайте свой первый псевдоним, набрав следующую команду в окне командной строки:

alias kubedbg.mywebapp Debug.MIDebugLaunch /Executable:dotnet 
/OptionsFile:absolute_path_to_kubedbg.xml

После этого вы можете начать отладку, просто выполнив kubedbg.mywebapp в окне командной строки. Более того, вы можете запустить ту же команду из выпадающего списка инструментов «Найти», но с префиксом: >kubedbg.mywebapp. Это не сложно, так как есть текстовое завершение. Вы можете прочитать больше о псевдонимах команд здесь. Удачной отладки! PS: В качестве бонуса абсолютно таким же образом вы можете отлаживать свое приложение даже при работе в облаке publi c. Когда kubectl назначается кластеру в облаке publi c, он просто работает с тем же сценарием и окупает меньше предположений, поскольку внутри реального кластера ID процесса не равен 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...