Kubernetes में चल रहे ASP.NET कोर वेब ऐप के साथ विजुअल स्टूडियो डीबगर का उपयोग करें?


9

हमारी टीम हमारे आंतरिक Kuberneseses क्लस्टर के लिए ASP.NET आवेदन के तैनात उदाहरणों के खिलाफ विजुअल स्टूडियो डिबगर चलाने में सक्षम होना चाहती है। मुझे यह पता लगाने की ज़रूरत है कि पहेली को कैसे खत्म किया जाए लेकिन मैं विजुअल स्टूडियो 2019 से बहुत परिचित नहीं हूं।

  • Docker छवि आधिकारिक .NET कोर छवियों के साथ संकलित की गई है और इसमें नवीनतम संस्करण (जो समर्थन नहीं करता है) के साथ आबादी / vsdbg है।
  • विजुअल स्टूडियो मेरे डॉकर डेस्कटॉप के साथ काम करता है।
  • Kubectl सही ढंग से कॉन्फ़िगर किया गया है। मैं या तो कुबेरनेट क्लस्टर का उपयोग डॉकटर डेस्कटॉप या परीक्षण के लिए हमारे आंतरिक कुबेरनेट क्लस्टर के साथ कर सकता हूं।
  • Azure वर्तमान में कोई विकल्प नहीं है। मैं प्रलेखन से समझता हूं कि यह वही है जो Microsoft मुझे करने के लिए पसंद करता है।

मुझे ऐसा करने में सक्षम होने के लिए विज़ुअल स्टूडियो को कैसे कॉन्फ़िगर करना चाहिए?


नमस्ते। मैं पूछना चाहता हूं कि आपने पहली सूची आइटम के रूप में क्यों कहा "... है / vsdbg नवीनतम संस्करण के साथ आबाद है (जो समर्थन नहीं करता है --attach)।" ? यदि आपके पास vsdbg है; इसे संलग्न करने का समर्थन करना चाहिए।
सफक उल्लॉय

@SafakUlusoy The vsdbg मैंने स्थापित किया - दत्ताच ध्वज का समर्थन नहीं किया।
थोर्बजोरन रावन एंडरसन

जवाबों:


4

ठीक है। चलो शुरू हो जाओ। सबसे पहले यह सुनिश्चित करें कि आपने अपना ऐप डिबग मोड में प्रकाशित किया है! मैं अपनी छवियों के निर्माण के लिए एक नए डॉकर फीचर मल्टी-स्टेज बिल्ड का उपयोग करना पसंद करता हूं, इसलिए मैं डॉकरफाइल में एक बिल्ड स्टेज के अंत में ऐसा कुछ लिखूंगा:

RUN dotnet publish -c Debug -o ./results

मिनिक्यूब के लिए छवियों को पुश करने के लिए मैं स्थानीय कंटेनर रजिस्ट्री का उपयोग करता हूं जैसा कि यहां वर्णित है। लेकिन आप इसे कर सकते हैं जैसा कि आप आमतौर पर करते हैं। जब आपके पास आपका कंटेनर आ जाता है और हम उसे चलाना शुरू कर सकते हैं। मैं उस उद्देश्य के लिए पॉवर्सशेल का उपयोग करूंगा लेकिन इसे किसी भी अन्य टर्मिनल भाषा में आसानी से लिखा जा सकता है। जब आवश्यक हो, इको कमांड के साथ एक के बाद एक वर्जन के मानों की जाँच करके आप अपने टर्मिनल एक में ट्यूटोरियल स्टेप बाई स्टेप और कमांड निष्पादित कर सकते हैं। आपकी * .yml फ़ाइल में आपको एक चयनकर्ता होना चाहिए जो कुछ इस तरह वर्णित हो:

selector:
  matchLabels:
    app: mywebapp

इसे पकड़ो और अपने पॉवर्सशेल टर्मिनल में $ चयनकर्ता संस्करण को परिभाषित करने के लिए उपयोग करें:

$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 कोर प्रोजेक्ट्स के साथ उपयोग कर सकते हैं:

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 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 यह कमांड विजुअल स्टूडियो के अंदर डिबगिंग प्रक्रिया को शुरू करेगा, जिसकी सभी मानक लाभ की आप अपेक्षा करेंगे। लेकिन डिबग मेनू से सभी को अलग करके दबाकर किसी अन्य तरीके से डिबग करना बंद न करें! हालांकि यह कमांड हर समय लिखने के लिए बहुत सुविधाजनक नहीं है। सौभाग्य से विजुअल स्टूडियो में, आप पैरामीटर वाले कमांड के लिए उपनाम निर्दिष्ट कर सकते हैं। आखिरकार, आपको kubedbg.xmlप्रत्येक प्रोजेक्ट के लिए एक नई फ़ाइल की आवश्यकता होगी । इसे ध्यान में रखते हुए कमांड विंडो में निम्नलिखित कमांड टाइप करके अपना पहला उपनाम बनाएं:

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

उसके बाद, आप कमांड विंडो में केवल kubedbg.mywebapp निष्पादित करके डिबगिंग शुरू कर सकते हैं। इससे भी बेहतर आप एक ही कमांड को टूलबार कॉम्बोक्स से चला सकते हैं लेकिन उपसर्ग के साथ: >kubedbg.mywebapp.यह मुश्किल नहीं है क्योंकि एक पाठ पूरा होने में भी है। आप यहाँ कमांड उपनामों के बारे में अधिक पढ़ सकते हैं। खुश डिबगिंग! पुनश्च: एक बोनस के रूप में बिल्कुल उसी तरह से आप अपने ऐप को किसी सार्वजनिक क्लाउड के अंदर चलाने पर भी डिबग कर सकते हैं। जब सार्वजनिक बादल में एक क्लस्टर को kubectl को सौंपा जाता है, तो यह एक ही स्क्रिप्ट के साथ काम करता है और वास्तविक क्लस्टर प्रक्रिया आईडी के अंदर से भुगतान की गई कम मान्यताओं को वापस करने के बराबर नहीं है 1


बहुत गहन उत्तर के लिए धन्यवाद। मैं देखता हूं कि --attachडिबगर को संलग्न करने के लिए उपयोग किए गए कुबेटेल कमांड में ध्वज का उपयोग किया जाता है, जो मुझे थोड़ा चिंतित करता है। क्या आप इस बात की पुष्टि कर सकते हैं कि इस उत्तर को तैयार करते समय यह आपके लिए काम करता है?
थोरबजोरन रावन एंडरसन

हाँ, वास्तव में मेरे लिए काम किया! लेकिन मुझे नहीं पता कि आप के लिए काम क्यों नहीं करता है।
देवकास

यह आपके लिए काम करने की पुष्टि करने के लिए धन्यवाद। मैं कल इसका प्रयास करूंगा।
थोरबजोरन रावन एंडरसन

आपका स्वागत है! शुभ लाभ! मैं यहाँ हूँ अगर आपको कुछ चाहिए
devcass
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.