ใช้ดีบักเกอร์ Visual Studio กับแอป ASP.NET Core เว็บที่ทำงานใน Kubernetes หรือไม่


9

ทีมของเราต้องการให้สามารถเรียกใช้ดีบักเกอร์ Visual Studio จากอินสแตนซ์ที่ปรับใช้ของแอปพลิเคชัน ASP.NET ของเราไปยังคลัสเตอร์ Kubernetes ภายในของเรา ฉันต้องหาวิธีแก้ปริศนาให้จบ แต่ฉันไม่ค่อยคุ้นเคยกับ Visual Studio 2019

  • อิมเมจ Docker นั้นถูกคอมไพล์ด้วยอิมเมจ. NET Core อย่างเป็นทางการและมี / vsdbg บรรจุด้วยเวอร์ชันล่าสุด (ซึ่งไม่รองรับ --attach)
  • Visual Studio ทำงานร่วมกับ Docker Desktop ของฉัน
  • Kubectl ได้รับการกำหนดค่าอย่างถูกต้อง ฉันสามารถใช้คลัสเตอร์ kubernetes ที่มาพร้อมกับ Docker Desktop หรือคลัสเตอร์ kubernetes ภายในของเราสำหรับการทดสอบ
  • ปัจจุบัน Azure ไม่ใช่ตัวเลือก ฉันเข้าใจจากเอกสารว่านี่คือสิ่งที่ Microsoft ต้องการให้ฉันทำ

ฉันควรกำหนดค่า Visual Studio ให้สามารถทำสิ่งนี้ได้อย่างไร


สวัสดี ฉันต้องการถามว่าทำไมคุณถึงพูดในรายการแรกว่า "... มี / vsdbg มีรุ่นล่าสุด (ซึ่งไม่รองรับ --attach)" ? หากคุณมี vsdbg; ควรรองรับไฟล์แนบ
Safak Ulusoy

@SafakUlusoy vsdbg ที่ฉันติดตั้งไม่รองรับ --attach flag
Thorbjørn Ravn Andersen

คำตอบ:


4

ตกลง. เริ่มกันเลย ก่อนอื่นตรวจสอบให้แน่ใจว่าคุณได้เผยแพร่แอพของคุณในโหมดดีบั๊กแล้ว! ฉันชอบที่จะใช้คุณสมบัติ Docker แบบใหม่ที่มีหลายขั้นตอนสำหรับการสร้างภาพของฉันดังนั้นฉันจะเขียนแบบนี้ในตอนท้ายของการสร้างใน Dockerfile:

RUN dotnet publish -c Debug -o ./results

ในการส่งภาพไปยัง Minikube ฉันจะใช้การลงทะเบียนคอนเทนเนอร์ภายในเครื่องตามที่อธิบายไว้ที่นี่ แต่คุณสามารถทำได้ตามปกติ เมื่อคุณมีคอนเทนเนอร์ของคุณและทำงานเราสามารถเริ่มแฮ็คมันได้ ฉันจะใช้ Powershell เพื่อจุดประสงค์นั้น แต่สามารถเขียนใหม่ได้อย่างง่ายดายในภาษาเทอร์มินัลอื่น ๆ คุณสามารถทำตามขั้นตอนการสอนตามขั้นตอนและดำเนินการคำสั่งในเทอร์มินัลของคุณทีละคนตรวจสอบค่าของ var ด้วยคำสั่ง echo เมื่อจำเป็น ในไฟล์ * .yml ของคุณคุณควรมีตัวเลือกที่อธิบายบางสิ่งดังนี้:

selector:
  matchLabels:
    app: mywebapp

คว้ามาและใช้เพื่อกำหนด $ Selector var ในเทอร์มินัล Powershell ของคุณ:

$Selector = 'app=mywebapp'

คุณต้องการค้นหาพ็อดที่แอปพลิเคชั่นคอนเทนเนอร์ของคุณทำงานโดยตัวเลือก:

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

สมมติว่าคุณมีเพียงหนึ่งคอนเทนเนอร์ในพ็อดตอนนี้คุณสามารถดำเนินการคำสั่งบนคอนเทนเนอร์นั้นได้ โดยคอนเทนเนอร์เริ่มต้นไม่ได้ติดตั้ง 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 พร้อมผลประโยชน์มาตรฐานทั้งหมดที่คุณคาดหวัง แต่อย่าหยุดการดีบั๊กด้วยวิธีอื่นใดโดยการกด Detach All จาก Debug menu! แม้ว่าคำสั่งนี้จะไม่สะดวกในการเขียนตลอดเวลา โชคดีใน Visual Studio คุณสามารถระบุนามแฝงสำหรับคำสั่งด้วยพารามิเตอร์ ในที่สุดคุณจะต้องมีkubedbg.xmlไฟล์ใหม่สำหรับแต่ละโครงการ ด้วยสิ่งนี้ในใจไปข้างหน้าและสร้างนามแฝงแรกของคุณโดยพิมพ์คำสั่งต่อไปนี้ในหน้าต่างคำสั่ง:

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

หลังจากนั้นคุณสามารถเริ่มต้นการดีบักเพียงดำเนินการ kubedbg.mywebapp ในหน้าต่างคำสั่ง ยิ่งไปกว่านั้นคุณสามารถเรียกใช้คำสั่งเดียวกันจากแถบเครื่องมือค้นหา Combobox แต่มีคำนำหน้า: >kubedbg.mywebapp.นั่นก็ไม่ยากเพราะมีการเติมข้อความด้วยเช่นกัน คุณสามารถอ่านเพิ่มเติมเกี่ยวกับชื่อแทนคำสั่งได้ที่นี่ การแก้ไขข้อบกพร่องมีความสุข! PS: เป็นโบนัสอย่างเดียวกับที่คุณสามารถตรวจแก้จุดบกพร่องแอปของคุณแม้ว่าจะทำงานในระบบคลาวด์สาธารณะ เมื่อ kubectl ถูกกำหนดให้กับคลัสเตอร์ในคลาวด์สาธารณะมันจะทำงานกับสคริปต์เดียวกันและทำให้มีการจ่ายคืนสมมติฐานน้อยลงเนื่องจากภายใน ID กระบวนการของคลัสเตอร์จริงไม่เท่ากับ 1


ขอบคุณสำหรับคำตอบอย่างละเอียด ฉันเห็นว่า--attachมีการใช้แฟล็กในคำสั่ง kubectl ซึ่งใช้เพื่อแนบดีบักเกอร์ซึ่งเกี่ยวข้องกับฉันเล็กน้อย คุณช่วยยืนยันได้ไหมว่าสิ่งนี้ใช้ได้กับคุณเมื่อเตรียมคำตอบนี้
Thorbjørn Ravn Andersen

ใช่ทำงานได้จริงสำหรับฉัน! แต่ฉันไม่รู้ว่าทำไมไม่เหมาะกับคุณ
devcass

ขอบคุณสำหรับการยืนยันนี้จะทำงานให้คุณ ฉันจะลองในวันพรุ่งนี้
Thorbjørn Ravn Andersen

ยินดีต้อนรับคุณ! โชคดี! ฉันอยู่ที่นี่ถ้าคุณต้องการอะไร
devcass
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.