확인. 의가 시작하자. 우선 디버그 모드로 앱을 게시했는지 확인하십시오! 이미지를 빌드하기 위해 새로운 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이 아니기 때문에 지불되는 가정이 적습니다.