Okay. Vamos a ponerlo en marcha. En primer lugar, asegúrese de haber publicado su aplicación en modo de depuración. Prefiero usar una nueva construcción de varias etapas de Docker para construir mis imágenes, así que escribiría algo como esto al final de una etapa de construcción en Dockerfile:
RUN dotnet publish -c Debug -o ./results
Para enviar imágenes a Minikube, uso el registro de contenedor local como se describe aquí. Pero puedes hacerlo como lo haces habitualmente. Cuando tenga su contenedor en funcionamiento, podemos comenzar a piratearlo. Usaré Powershell para ese propósito, pero el mismo se puede reescribir fácilmente en cualquier otro lenguaje de terminal. Puede seguir el tutorial paso a paso y ejecutar comandos en su terminal uno por uno comprobando los valores de var con el comando echo cuando sea necesario. En su archivo * .yml, debe tener un selector que describa algo como esto:
selector:
matchLabels:
app: mywebapp
Cógelo y úsalo para definir un $ Selector var en tu terminal Powershell:
$Selector = 'app=mywebapp'
Necesita encontrar un pod donde su aplicación en contenedor se ejecuta con su selector:
$pod = kubectl get pods --selector=$Selector -o jsonpath='{.items[0].metadata.name}';
Suponiendo que solo tiene un contenedor en el pod ahora puede ejecutar comandos en ese contenedor. Por defecto, el contenedor no tiene vsdbg instalado, así que adelante e instálelo:
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;
A continuación, debe encontrar el PID de su aplicación dentro del contenedor:
$prid = kubectl exec $pod -i -- pidof -s dotnet;
Normalmente es igual a 1, pero es mejor hacer menos suposiciones. Eso es. Ahora puede iniciar un depurador:
kubectl exec $pod -i -- /vsdbg/vsdbg --interpreter=mi --attach $prid;
No olvide ejecutar los siguientes comandos antes de cerrar la ventana; de lo contrario, su aplicación se bloqueará para siempre:
-target-detach
-gdb-exit
Armemos todo, cree un script reutilizable y guárdelo en algún lugar cerca de las raíces, ya que puede usarlo con todos sus proyectos de 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;
Ahora puede ejecutar este script como este cuando el terminal se ejecuta desde la carpeta de script:
powershell -ExecutionPolicy Bypass -File kubedbg.ps1 -Selector app=mywebapp
¿Pero no se supone que debemos depurar desde Visual Studio? ¡Si! Vayamos más allá e iniciemos nuestro proceso de terminal desde Visual Studio MIEngine. Abre tu proyecto en Visual Studio. Agregue un nuevo archivo XML con el siguiente contenido y asígnele el nombre 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>
En el -File
parámetro, debe especificar la ruta absoluta al archivo de script que creamos antes. Luego presione Ctrl + Alt + A para abrir la Ventana de comandos y ejecute el siguiente comando:
Debug.MIDebugLaunch /Executable:dotnet /OptionsFile:absolute_path_to_kubedbg_xml
Este comando iniciará el proceso de depuración dentro de Visual Studio con todos los beneficios estándar que esperaría. ¡Pero no deje de depurar de otra manera que no sea presionando Separar todo del menú Depurar! Aunque este comando no es muy conveniente para escribir todo el tiempo. Afortunadamente, en Visual Studio, puede especificar alias para comandos con parámetros. Eventualmente, necesitaría un nuevo kubedbg.xml
archivo para cada proyecto. Con esto en mente, siga adelante y cree su primer alias escribiendo el siguiente comando en la Ventana de comandos:
alias kubedbg.mywebapp Debug.MIDebugLaunch /Executable:dotnet
/OptionsFile:absolute_path_to_kubedbg.xml
Después de eso, puede comenzar a depurar simplemente ejecutando kubedbg.mywebapp en la Ventana de comandos. Aún mejor, puede ejecutar el mismo comando desde el cuadro combinado de la barra de herramientas Buscar pero con prefijo: >kubedbg.mywebapp.
eso no es difícil ya que también hay una finalización de texto. Puede leer más sobre los alias de comandos aquí. Feliz depuración! PD: Como beneficio adicional, de la misma manera puedes depurar tu aplicación incluso cuando se ejecuta dentro de una nube pública. Cuando se asigna kubectl a un clúster en la nube pública, solo funciona con el mismo script y se devuelven menos suposiciones, ya que dentro de la ID del proceso del clúster real no es igual a 1