Використовувати налагоджувач Visual Studio з веб-додатком ASP.NET Core, що працює в Kubernetes?


9

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

  • Зображення Docker складено з офіційних .NET Core зображень і має / vsdbg заповнене останньою версією (яка не підтримує --attach).
  • Visual Studio працює з моїм робочим столом Docker.
  • Kubectl правильно налаштований. Я можу використовувати кластер кубернетів, включений до Docker Desktop, або наш внутрішній кластер кубернетів для тестування.
  • Зараз Azure не є варіантом. З документації я розумію, що саме це Microsoft воліє мені робити.

Як мені налаштувати Visual Studio, щоб це зробити?


Привіт. Я хочу запитати, чому ви сказали в пункті першого списку як "... has / vsdbg заповнений останньою версією (яка не підтримує --attach)." ? Якщо у вас є vsdbg; він повинен підтримувати кріплення.
Сафак Улусой

@SafakUlusoy Встановлений я vsdbg не підтримував прапор --attach.
Thorbjørn Ravn Andersen

Відповіді:


4

Добре. Почнемо це. Перш за все переконайтесь, що ви опублікували свою програму в режимі налагодження! Я вважаю за краще використовувати нову багатоетапну збірку Docker для створення своїх зображень, щоб я написав щось подібне наприкінці етапу збірки в Dockerfile:

RUN dotnet publish -c Debug -o ./results

Для переміщення зображень до Minikube я використовую локальний реєстр контейнерів, як описано тут. Але ти можеш робити це, як зазвичай. Коли ваш контейнер буде запущений, ми можемо почати його злому. Я буду використовувати для цього Powershell, але те саме можна легко переписати будь-якою іншою мовою терміналу. Ви можете слідувати посібнику поетапно та виконувати команди у своєму терміналі одна за одною, перевіряючи значення var за допомогою команди echo, коли це необхідно. У вашому * .yml-файлі ви повинні мати селектор, описаний приблизно так:

selector:
  matchLabels:
    app: mywebapp

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

$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параметрі потрібно вказати абсолютний шлях до файлу сценарію, який ми створили раніше. Потім натисніть Ctrl + Alt + A, щоб відкрити вікно команд і запустіть таку команду: Debug.MIDebugLaunch /Executable:dotnet /OptionsFile:absolute_path_to_kubedbg_xml Ця команда запустить процес налагодження всередині Visual Studio з усіма стандартними перевагами, які ви очікували. Але не зупиняйте налагодження будь-яким іншим способом, ніж натисканням від'єднати все від меню налагодження! Хоча цю команду писати не дуже зручно весь час. На щастя у Visual Studio, ви можете вказати псевдоніми для команд з параметрами. Врешті-решт, вам знадобиться новий kubedbg.xmlфайл для кожного проекту. Зважаючи на це, продовжуйте і створюйте свій перший псевдонім, ввівши таку команду у вікні команд:

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

Після цього ви можете почати налагодження просто виконавши kubedbg.mywebapp у вікні команд. Ще краще, що ви можете запустити ту саму команду на панелі інструментів Find Combobox, але з префіксом: >kubedbg.mywebapp.Це не складно, оскільки є і завершення тексту. Докладніше про псевдоніми команд ви можете прочитати тут. Щасливого налагодження! PS: Як бонус абсолютно таким же чином, ви можете налагоджувати додаток навіть під час роботи в публічній хмарі. Коли kubectl призначається кластеру в загальнодоступній хмарі, він просто працює з тим же сценарієм і робить меншу кількість припущень, повернених назад, оскільки всередині реального ідентифікатора процесу кластера не дорівнює 1


Дякую за дуже ретельну відповідь. Я бачу, що --attachпрапор використовується в команді kubectl, яка використовується для приєднання налагоджувача, що мене мало стосується. Чи можете ви підтвердити, що це працювало для вас під час підготовки цієї відповіді?
Thorbjørn Ravn Andersen

Так, справді працював для мене! Але я не знаю, чому це не працює для вас.
devcass

Дякуємо, що підтвердили, що це працює для вас. Я спробую це завтра.
Thorbjørn Ravn Andersen

Ласкаво просимо! Щасти! Я тут, якщо вам щось потрібно
devcass
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.