Kubernetesで実行されているASP.NET Core WebアプリでVisual Studioデバッガーを使用しますか?


9

私たちのチームは、内部のKubernetesクラスターにASP.NETアプリケーションのデプロイされたインスタンスに対してVisual Studioデバッガーを実行できるようにしたいと考えています。パズルを完成させる方法を理解する必要がありますが、Visual Studio 2019にはあまり詳しくありません。

  • Dockerイメージは公式の.NET Coreイメージでコンパイルされ、/ vsdbgに最新バージョン(--attachをサポートしていない)が入力されています。
  • Visual Studioは私のDockerデスクトップで動作します。
  • Kubectlが正しく構成されている。テストには、Dockerデスクトップに含まれているkubernetesクラスターまたは内部のkubernetesクラスターを使用できます。
  • Azureは現在オプションではありません。ドキュメントから、これはマイクロソフトが私に好むことだと理解しています。

これを実行できるようにVisual Studioを構成するにはどうすればよいですか?


こんにちは。最初のリスト項目で「...に/ vsdbgに最新バージョン(--attachをサポートしていない)が入力されている」と言った理由を尋ねたいのですが。?vsdbgをお持ちの場合 アタッチをサポートする必要があります。
Safak Ulusoy

@SafakUlusoyインストールしたvsdbgは--attachフラグをサポートしていませんでした。
するThorbjörnRavnアンデルセン

回答:


4

OK。はじめましょうか。まず、アプリをデバッグモードで公開していることを確認してください!新しいDocker機能のマルチステージビルドを使用してイメージをビルドすることを好むので、Dockerfileのビルドステージの最後に次のように記述します。

RUN dotnet publish -c Debug -o ./results

画像をMinikubeにプッシュするには、ここで説明するローカルコンテナーレジストリを使用します。しかし、あなたはいつものようにそれを行うことができます。コンテナが稼働し始めたら、ハッキングを開始できます。私はその目的でPowershellを使用しますが、同じことを他の端末言語で簡単に書き換えることができます。チュートリアルの手順に従って、必要に応じてechoコマンドでvarの値を1つずつ確認しながら、ターミナルでコマンドを1つずつ実行できます。* .ymlファイルには、次のようなセレクターが必要です。

selector:
  matchLabels:
    app: mywebapp

それを取得して、Powershellターミナルで$ Selector変数を定義するために使用します。

$Selector = 'app=mywebapp'

コンテナー化されたアプリケーションが実行されているポッドをセレクターで見つける必要があります。

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

ポッドにコンテナが1つしかないと仮定すると、そのコンテナでコマンドを実行できます。デフォルトでは、コンテナーには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では、パラメーターを使用してコマンドのエイリアスを指定できます。最終的には、kubedbg.xmlプロジェクトごとに新しいファイルが必要になります。これを念頭に置いて、コマンドウィンドウで次のコマンドを入力して、最初のエイリアスを作成します。

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

その後、コマンドウィンドウでkubedbg.mywebappを実行するだけでデバッグを開始できます。さらに良いのは、検索ツールバーのコンボボックスから同じコマンドを実行できることですが、プレフィックスが付い>kubedbg.mywebapp.ています。テキスト補完もあるので、難しくありません。コマンドエイリアスの詳細については、こちらをご覧ください。幸せなデバッグ!PS:おまけとして、パブリッククラウド内で実行している場合でも、アプリをデバッグできるのとまったく同じ方法です。kubectlがパブリッククラウドのクラスターに割り当てられると、実際のクラスター内のプロセスIDが1に等しくないため、同じスクリプトで動作し、想定される返済が少なくなります。


とても丁寧な回答ありがとうございます。この--attachフラグは、デバッガの接続に使用されるkubectlコマンドで使用されていることがわかります。この回答を準備するときにこれがうまくいったことを確認できますか?
するThorbjörnRavnアンデルセン

はい、本当に私のために働きました!しかし、なぜうまくいかないのかわかりません。
devcass

これがあなたのために働いていることを確認していただきありがとうございます。明日試してみます。
するThorbjörnRavnアンデルセン

どういたしまして!幸運を!何か必要な場合はここにいます
devcass
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.