Gunakan Visual Studio debugger dengan aplikasi web ASP.NET Core yang berjalan di Kubernetes?

9

Tim kami ingin dapat menjalankan debugger Visual Studio terhadap contoh aplikasi ASP.NET yang digunakan untuk kluster Kubernetes internal kami. Saya perlu mencari cara untuk menyelesaikan puzzle tapi saya tidak terlalu akrab dengan Visual Studio 2019.

  • Gambar Docker dikompilasi dengan gambar .NET Core resmi dan telah / vsdbg diisi dengan versi terbaru (yang tidak mendukung --attach).
  • Visual Studio berfungsi dengan Docker Desktop saya.
  • Kubectl dikonfigurasi dengan benar. Saya bisa menggunakan cluster kubernet yang disertakan dengan Docker Desktop atau cluster kubernetes internal kami untuk pengujian.
  • Azure saat ini bukan opsi. Saya mengerti dari dokumentasi bahwa inilah yang Microsoft inginkan untuk saya lakukan.

Bagaimana saya mengkonfigurasi Visual Studio untuk dapat melakukan ini?

Thorbjørn Ravn Andersen
sumber
Hai. Saya ingin bertanya mengapa Anda mengatakan dalam daftar item pertama sebagai "... telah / vsdbg diisi dengan versi terbaru (yang tidak mendukung --attach)." ? Jika Anda memiliki vsdbg; harus mendukung attach.
Safak Ulusoy
@ Safakluslus vsdbg yang saya instal tidak mendukung flag --attach.
Thorbjørn Ravn Andersen

Jawaban:

4

Baik. Mari kita memulainya. Pertama-tama pastikan Anda telah menerbitkan aplikasi Anda dalam mode Debug! Saya lebih suka menggunakan fitur Docker multi-tahap build baru untuk membangun gambar saya jadi saya akan menulis sesuatu seperti ini di akhir tahap build di Dockerfile:

RUN dotnet publish -c Debug -o ./results

Untuk mendorong gambar ke Minikube saya menggunakan registry kontainer lokal seperti yang dijelaskan di sini. Tetapi Anda dapat melakukannya seperti biasanya. Ketika wadah Anda sudah siap dan berjalan, kami dapat mulai meretasnya. Saya akan menggunakan Powershell untuk tujuan itu tetapi hal yang sama dapat dengan mudah ditulis ulang dalam bahasa terminal lainnya. Anda dapat mengikuti tutorial langkah demi langkah dan menjalankan perintah di terminal Anda satu per satu memeriksa nilai var dengan perintah gema bila perlu. Dalam file * .yml Anda, Anda harus meminta pemilih memilih sesuatu seperti ini:

selector:
  matchLabels:
    app: mywebapp

Raih dan gunakan untuk mendefinisikan $ Selector var di terminal Powershell Anda:

$Selector = 'app=mywebapp'

Anda perlu menemukan pod tempat aplikasi kemas Anda dijalankan oleh pemilihnya:

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

Dengan asumsi bahwa Anda hanya memiliki satu wadah di pod sekarang Anda dapat menjalankan perintah pada wadah itu. Secara default container tidak memiliki vsdbg, jadi silakan dan instal:

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;

Selanjutnya, Anda perlu menemukan PID aplikasi Anda di dalam wadah:

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

Biasanya itu sama dengan 1 tetapi lebih baik membuat asumsi lebih sedikit. Itu dia. Sekarang Anda dapat memulai debugger:

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

Jangan lupa untuk menjalankan perintah berikut sebelum Anda menutup jendela, jika tidak aplikasi Anda akan macet selamanya:

-target-detach
-gdb-exit

Mari kita menggabungkan semuanya, membuat skrip yang dapat digunakan kembali dan menyimpannya di dekat akar karena Anda dapat menggunakannya dengan semua proyek Core ASP.NET Anda:

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;

Sekarang Anda dapat menjalankan skrip ini seperti ini ketika terminal dijalankan dari folder skrip:

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

Tapi bukankah kita seharusnya debugging dari Visual Studio? Iya! Mari kita melangkah lebih jauh dan meluncurkan proses terminal kami dari Visual Studio MIEngine. Buka proyek Anda di Visual Studio. Tambahkan file XML baru dengan konten berikut dan beri nama 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>

Pada -Fileparameter Anda perlu menentukan path absolut ke file skrip yang kami buat sebelumnya. Kemudian tekan Ctrl + Alt + A untuk membuka Command Window dan jalankan perintah berikut: Debug.MIDebugLaunch /Executable:dotnet /OptionsFile:absolute_path_to_kubedbg_xml Perintah ini akan memulai proses debugging di dalam Visual Studio dengan semua manfaat standar yang Anda harapkan. Tetapi jangan berhenti men-debug dengan cara lain selain dengan menekan Lepaskan Semua dari menu Debug! Meskipun perintah ini sangat tidak nyaman untuk menulis sepanjang waktu. Untungnya di Visual Studio, Anda dapat menentukan alias untuk perintah dengan parameter. Akhirnya, Anda akan memerlukan kubedbg.xmlfile baru untuk setiap proyek. Dengan pemikiran ini, lanjutkan dan buat alias pertama Anda dengan mengetik perintah berikut di Command Window:

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

Setelah itu, Anda dapat mulai men-debug hanya dengan mengeksekusi kubedbg.mywebapp di Command Window. Bahkan lebih baik, Anda dapat menjalankan perintah yang sama dari Combobox Temukan toolbar tetapi dengan awalan: >kubedbg.mywebapp.Itu tidak sulit karena ada penyelesaian teks juga. Anda dapat membaca lebih lanjut tentang alias alias perintah di sini. Selamat men-debug! PS: Sebagai bonus, sama persis dengan cara Anda dapat men-debug aplikasi Anda bahkan ketika berjalan di dalam cloud publik. Ketika kubectl ditugaskan ke sebuah cluster di cloud publik, ia hanya bekerja dengan skrip yang sama dan membuat lebih sedikit asumsi dibayar kembali karena di dalam proses ID nyata cluster tidak sama dengan 1

bangkai
sumber
Terima kasih atas jawaban yang sangat teliti. Saya melihat bahwa --attachflag digunakan dalam perintah kubectl yang digunakan untuk melampirkan debugger, yang sedikit mengkhawatirkan saya. Bisakah Anda mengonfirmasi bahwa ini berhasil saat menyiapkan jawaban ini?
Thorbjørn Ravn Andersen
Ya, benar-benar bekerja untuk saya! Tapi saya tidak tahu mengapa itu tidak berhasil untuk Anda.
devcass
Terima kasih telah mengonfirmasi hal ini untuk Anda. Saya akan coba ini besok.
Thorbjørn Ravn Andersen
Sama-sama! Semoga berhasil! Saya di sini jika Anda memerlukan sesuatu
devcass