Добре. Почнемо це. Перш за все переконайтесь, що ви опублікували свою програму в режимі налагодження! Я вважаю за краще використовувати нову багатоетапну збірку 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