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 -File
paramè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.xml
fichier 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