Utiliser le débogueur Visual Studio avec l'application Web ASP.NET Core exécutée dans Kubernetes?

9

Notre équipe souhaite pouvoir exécuter le débogueur Visual Studio sur les instances déployées de notre application ASP.NET sur notre cluster Kubernetes interne. J'ai besoin de comprendre comment terminer le puzzle, mais je ne connais pas très bien Visual Studio 2019.

  • L'image Docker est compilée avec les images officielles .NET Core et contient / vsdbg avec la dernière version (qui ne prend pas en charge --attach).
  • Visual Studio fonctionne avec mon Docker Desktop.
  • Kubectl est correctement configuré. Je peux utiliser le cluster kubernetes inclus avec Docker Desktop ou notre cluster kubernetes interne pour les tests.
  • Azure n'est actuellement pas une option. Je comprends de la documentation que c'est ce que Microsoft préfère que je fasse.

Comment dois-je configurer Visual Studio pour pouvoir le faire?

Thorbjørn Ravn Andersen
la source
Salut. Je veux demander pourquoi avez-vous dit dans le premier élément de la liste que "... a / vsdbg rempli avec la dernière version (qui ne prend pas en charge --attach)." ? Si vous avez vsdbg; il devrait soutenir l'attacher.
Safak Ulusoy
@SafakUlusoy Le vsdbg que j'ai installé ne prend pas en charge l'indicateur --attach.
Thorbjørn Ravn Andersen

Réponses:

4

D'accord. Commençons. Assurez-vous tout d'abord que vous avez publié votre application en mode débogage! Je préfère utiliser une nouvelle construction à plusieurs étapes de la fonctionnalité Docker pour construire mes images, donc j'écrirais quelque chose comme ça à la fin d'une étape de construction dans Dockerfile:

RUN dotnet publish -c Debug -o ./results

Pour envoyer des images vers Minikube, j'utilise le registre de conteneurs local comme décrit ici. Mais vous pouvez le faire comme d'habitude. Lorsque votre conteneur est opérationnel, nous pouvons commencer à le pirater. J'utiliserai Powershell à cet effet, mais le même peut être facilement réécrit dans n'importe quelle autre langue du terminal. Vous pouvez suivre le didacticiel étape par étape et exécuter les commandes dans votre terminal une par une en vérifiant les valeurs de var avec la commande echo si nécessaire. Dans votre fichier * .yml, vous devriez avoir un sélecteur décrit quelque chose comme ceci:

selector:
  matchLabels:
    app: mywebapp

Saisissez-le et utilisez pour définir une var $ Selector dans votre terminal Powershell:

$Selector = 'app=mywebapp'

Vous devez trouver un pod où votre application conteneurisée s'exécute par son sélecteur:

$pod = kubectl get pods --selector=$Selector -o jsonpath='{.items[0].metadata.name}';

En supposant que vous n'avez qu'un seul conteneur sur le pod, vous pouvez maintenant exécuter des commandes sur ce conteneur. Par défaut, le conteneur n'a pas installé vsdbg, alors allez-y et installez-le:

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;

Ensuite, vous devez trouver le PID de votre application à l'intérieur du conteneur:

$prid = kubectl exec $pod -i -- pidof -s dotnet;

Normalement, il est égal à 1 mais il vaut mieux faire moins d'hypothèses. C'est ça. Vous pouvez maintenant démarrer un débogueur:

kubectl exec $pod -i -- /vsdbg/vsdbg --interpreter=mi --attach $prid;

N'oubliez pas d'exécuter les commandes suivantes avant de fermer la fenêtre, sinon votre application restera bloquée pour toujours:

-target-detach
-gdb-exit

Mettons tout ensemble, créons un script réutilisable et enregistrons-le quelque part près des racines car vous pouvez l'utiliser avec tous vos projets 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;

Vous pouvez maintenant exécuter ce script comme ceci lorsque le terminal s'exécute à partir du dossier de script:

powershell -ExecutionPolicy Bypass -File kubedbg.ps1 -Selector app=mywebapp

Mais ne sommes-nous pas censés déboguer à partir de Visual Studio? Oui! Allons plus loin et lançons notre processus terminal depuis Visual Studio MIEngine. Ouvrez votre projet dans Visual Studio. Ajoutez un nouveau fichier XML avec le contenu suivant et nommez-le 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 -Fileparamètre, vous devez spécifier le chemin absolu vers le fichier de script que nous avons créé auparavant. Appuyez ensuite sur Ctrl + Alt + A pour ouvrir la fenêtre de commande et exécutez la commande suivante: Debug.MIDebugLaunch /Executable:dotnet /OptionsFile:absolute_path_to_kubedbg_xml Cette commande démarrera le processus de débogage dans Visual Studio avec tous les avantages standard que vous attendez. Mais n'arrêtez pas le débogage autrement qu'en appuyant sur Détacher tout du menu Déboguer! Bien que cette commande ne soit pas très pratique pour écrire tout le temps. Heureusement dans Visual Studio, vous pouvez spécifier des alias pour les commandes avec des paramètres. Finalement, vous auriez besoin d'un nouveau kubedbg.xmlfichier pour chaque projet. Gardez cela à l'esprit et créez votre premier alias en tapant la commande suivante dans la fenêtre de commande:

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

Après cela, vous pouvez commencer le débogage simplement en exécutant kubedbg.mywebapp dans la fenêtre de commande. Encore mieux, vous pouvez exécuter la même commande à partir de la barre d'outils de recherche de la zone de liste déroulante, mais avec le préfixe: >kubedbg.mywebapp.ce n'est pas difficile car il y a aussi une saisie de texte. Vous pouvez en savoir plus sur les alias de commande ici. Bon débogage! PS: En bonus, de la même manière, vous pouvez déboguer votre application même lorsque vous exécutez à l'intérieur d'un cloud public. Lorsque kubectl est affecté à un cluster dans le cloud public, il fonctionne simplement avec le même script et fait moins d'hypothèses, car l'intérieur de l'ID de processus de cluster réel n'est pas égal à 1

devcass
la source
Merci pour une réponse très complète. Je vois que l' --attachindicateur est utilisé dans la commande kubectl utilisée pour attacher le débogueur, ce qui me préoccupe un peu. Pouvez-vous confirmer que cela a fonctionné pour vous lors de la préparation de cette réponse?
Thorbjørn Ravn Andersen
Oui, ça a vraiment marché pour moi! Mais je ne sais pas pourquoi ça ne marche pas pour toi.
devcass
Merci d'avoir confirmé que cela fonctionne pour vous. Je vais essayer ça demain.
Thorbjørn Ravn Andersen
Vous êtes les bienvenus! Bonne chance! Je suis là si tu as besoin de quelque chose
devcass