Kubernetes에서 실행되는 ASP.NET Core 웹 앱과 함께 Visual Studio 디버거를 사용합니까?


9

우리 팀은 내부 Kubernetes 클러스터에 배포 된 ASP.NET 응용 프로그램 인스턴스에 대해 Visual Studio 디버거를 실행할 수 있기를 원합니다. 퍼즐을 완성하는 방법을 알아야하지만 Visual Studio 2019에 익숙하지 않습니다.

  • Docker 이미지는 공식 .NET Core 이미지로 컴파일되고 / vsdbg에 최신 버전 (-attach를 지원하지 않음)으로 채워져 있습니다.
  • Visual Studio는 내 Docker Desktop과 작동합니다.
  • Kubectl이 올바르게 구성되었습니다. Docker Desktop에 포함 된 kubernetes 클러스터 또는 내부 kubernetes 클러스터를 테스트에 사용할 수 있습니다.
  • Azure는 현재 옵션이 아닙니다. 설명서에서 이것이 Microsoft가 선호하는 것임을 이해합니다.

이를 위해 Visual Studio를 어떻게 구성해야합니까?


안녕. 첫 번째 목록 항목에서 "... / vsdbg에 최신 버전 (-attach를 지원하지 않음)이 채워져 있음"으로 표시 한 이유를 묻고 싶습니다. ? vsdbg가있는 경우 첨부를 지원해야합니다.
Safak Ulusoy

@SafakUlusoy 내가 설치 한 vsdbg는 --attach 플래그를 지원하지 않았습니다.
Thorbjørn Ravn Andersen

답변:


4

확인. 의가 시작하자. 우선 디버그 모드로 앱을 게시했는지 확인하십시오! 이미지를 빌드하기 위해 새로운 Docker 기능 다단계 빌드를 사용하여 Dockerfile의 빌드 단계 끝에 다음과 같이 작성하려고합니다.

RUN dotnet publish -c Debug -o ./results

Minikube로 이미지를 푸시하려면 여기에 설명 된대로 로컬 컨테이너 레지스트리를 사용합니다. 그러나 평소처럼 할 수 있습니다. 컨테이너가 준비되어 있으면 해킹을 시작할 수 있습니다. 그 목적으로 Powershell을 사용하지만 다른 터미널 언어로도 쉽게 다시 작성할 수 있습니다. 단계별로 튜토리얼을 따르고 필요할 때 echo 명령으로 var의 값을 확인하여 터미널에서 명령을 하나씩 실행할 수 있습니다. * .yml 파일에는 다음과 같은 선택기가 있어야합니다.

selector:
  matchLabels:
    app: mywebapp

그것을 잡고 Powershell 터미널에서 $ Selector var를 정의하는 데 사용하십시오.

$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에서 디버깅 프로세스를 시작합니다. 그러나 디버그 메뉴에서 모두 분리를 누르는 것 외에 다른 방법으로 디버깅을 중지하지 마십시오! 이 명령은 항상 쓰는 것이 그리 편리하지는 않습니다. 다행히 Visual Studio에서는 매개 변수가있는 명령의 별칭을 지정할 수 있습니다. 결국 kubedbg.xml각 프로젝트마다 새 파일 이 필요합니다 . 이를 염두에두고 명령 창에 다음 명령을 입력하여 첫 번째 별칭을 만드십시오.

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

그런 다음 명령 창에서 kubedbg.mywebapp를 실행하여 디버깅을 시작할 수 있습니다. 더 좋은 방법은 찾기 도구 모음 콤보 상자에서 동일한 명령을 실행할 수 있지만 접두사 >kubedbg.mywebapp.를 사용하는 것입니다. 텍스트 완성도 있으므로 어렵지 않습니다. 명령 별명에 대한 자세한 내용은 여기를 참조하십시오. 행복한 디버깅! 추신 : 퍼블릭 클라우드 내부에서 실행하는 경우에도 앱을 디버깅 할 수있는 것과 완전히 동일한 보너스입니다. 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.