Використовувати налагоджувач 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.