¿Utiliza el depurador de Visual Studio con la aplicación web ASP.NET Core que se ejecuta en Kubernetes?

9

Nuestro equipo quiere poder ejecutar el depurador de Visual Studio contra instancias implementadas de nuestra aplicación ASP.NET en nuestro clúster interno de Kubernetes. Necesito descubrir cómo terminar el rompecabezas, pero no estoy muy familiarizado con Visual Studio 2019.

  • La imagen de Docker se compila con las imágenes oficiales de .NET Core y tiene / vsdbg poblado con la última versión (que no admite --attach).
  • Visual Studio funciona con mi escritorio Docker.
  • Kubectl está configurado correctamente. Puedo usar el clúster de kubernetes incluido con Docker Desktop o nuestro clúster de kubernetes interno para realizar pruebas.
  • Azure actualmente no es una opción. Según la documentación, entiendo que esto es lo que Microsoft prefiere que haga.

¿Cómo debo configurar Visual Studio para poder hacer esto?

Thorbjørn Ravn Andersen
fuente
Hola. Quiero preguntar por qué dijo en el primer elemento de la lista como "... ha / vsdbg poblado con la última versión (que no es compatible con --attach)". ? Si tienes vsdbg; debe soportar adjuntar.
Safak Ulusoy
@SafakUlusoy El vsdbg que instalé no admitía la bandera --attach.
Thorbjørn Ravn Andersen

Respuestas:

4

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 -Filepará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.xmlarchivo 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

devcass
fuente
Gracias por una respuesta muy completa. Veo que la --attachbandera se usa en el comando kubectl usado para adjuntar el depurador, lo que me preocupa un poco. ¿Puedes confirmar que esto funcionó para ti al preparar esta respuesta?
Thorbjørn Ravn Andersen
Sí, realmente funcionó para mí! Pero no sé por qué no funciona para ti.
devcass el
Gracias por confirmar que esto funcione para usted. Probaré esto mañana.
Thorbjørn Ravn Andersen
¡De nada! ¡Buena suerte! Estoy aquí si necesitas algo
devcass