Sử dụng trình gỡ lỗi Visual Studio với ứng dụng web ASP.NET Core đang chạy trong Kubernetes?


9

Nhóm của chúng tôi muốn có thể chạy trình gỡ lỗi Visual Studio chống lại các phiên bản đã triển khai của ứng dụng ASP.NET của chúng tôi vào cụm Kubernetes nội bộ của chúng tôi. Tôi cần tìm ra cách hoàn thành câu đố nhưng tôi không rành lắm về Visual Studio 2019.

  • Hình ảnh Docker được biên dịch với các hình ảnh .NET Core chính thức và có / vsdbg được điền với phiên bản mới nhất (không hỗ trợ --attach).
  • Visual Studio hoạt động với Docker Desktop của tôi.
  • Kubectl được cấu hình chính xác. Tôi có thể sử dụng cụm kubernetes đi kèm với Docker Desktop hoặc cụm kubernetes bên trong của chúng tôi để thử nghiệm.
  • Azure hiện không phải là một lựa chọn. Tôi hiểu từ tài liệu rằng đây là những gì Microsoft thích tôi làm.

Tôi nên cấu hình Visual Studio như thế nào để có thể làm điều này?


Chào. Tôi muốn hỏi tại sao bạn lại nói trong mục danh sách đầu tiên là "... has / vsdbg được điền với phiên bản mới nhất (không hỗ trợ --attach)." ? Nếu bạn có vsdbg; nó nên hỗ trợ đính kèm.
Safak Ulusoy

@SafakUlusoy vsdbg tôi đã cài đặt không hỗ trợ cờ --attach.
Thorbjørn Ravn Andersen

Câu trả lời:


4

Đồng ý. Cùng bắt đầu nào. Trước hết hãy chắc chắn rằng bạn đã xuất bản ứng dụng của mình ở chế độ Gỡ lỗi! Tôi thích sử dụng một Docker mới có tính năng xây dựng nhiều giai đoạn để xây dựng hình ảnh của mình vì vậy tôi sẽ viết một cái gì đó như thế này vào cuối giai đoạn xây dựng trong Dockerfile:

RUN dotnet publish -c Debug -o ./results

Để đẩy hình ảnh đến Minikube, tôi sử dụng sổ đăng ký container cục bộ như được mô tả ở đây. Nhưng bạn có thể làm điều đó như bạn thường làm. Khi bạn có container của bạn và chạy, chúng tôi có thể bắt đầu hack nó. Tôi sẽ sử dụng Powershell cho mục đích đó nhưng cũng có thể dễ dàng viết lại bằng bất kỳ ngôn ngữ đầu cuối nào khác. Bạn có thể làm theo hướng dẫn từng bước và thực hiện từng lệnh trong thiết bị đầu cuối của mình để kiểm tra giá trị của var bằng lệnh echo khi cần thiết. Trong tệp * .yml của bạn, bạn nên có một bộ chọn mô tả một cái gì đó như thế này:

selector:
  matchLabels:
    app: mywebapp

Lấy nó và sử dụng để xác định var $ Selector trong thiết bị đầu cuối Powershell của bạn:

$Selector = 'app=mywebapp'

Bạn cần tìm một nhóm nơi ứng dụng được đóng gói của bạn đang chạy bởi bộ chọn của nó:

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

Giả sử rằng bạn chỉ có một vùng chứa trên nhóm, bây giờ bạn có thể thực thi các lệnh trên vùng chứa đó. Theo mặc định, container không có vsdbg được cài đặt, vì vậy hãy tiếp tục và cài đặt nó:

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;

Tiếp theo, bạn cần tìm PID của ứng dụng bên trong container:

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

Thông thường nó bằng 1 nhưng tốt hơn là đưa ra ít giả định hơn. Đó là nó. Bây giờ bạn có thể bắt đầu một trình gỡ lỗi:

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

Đừng quên thực hiện các lệnh sau trước khi bạn đóng cửa sổ nếu không ứng dụng của bạn sẽ bị kẹt vĩnh viễn:

-target-detach
-gdb-exit

Chúng ta hãy đặt mọi thứ lại với nhau, tạo một tập lệnh có thể sử dụng lại và lưu nó ở đâu đó gần gốc rễ vì bạn có thể sử dụng nó với tất cả các dự án ASP.NET Core của mình:

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;

Bây giờ bạn có thể thực thi tập lệnh này như thế này khi thiết bị đầu cuối đang chạy từ thư mục tập lệnh:

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

Nhưng không phải chúng ta nên gỡ lỗi từ Visual Studio sao? Đúng! Hãy đi xa hơn và khởi chạy quy trình thiết bị đầu cuối của chúng tôi từ Visual Studio MIEngine. Mở dự án của bạn trong Visual Studio. Thêm tệp XML mới với nội dung sau và đặt tên là 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>

Trong -Filetham số bạn cần xác định đường dẫn tuyệt đối đến tệp tập lệnh mà chúng ta đã tạo trước đó. Sau đó nhấn Ctrl + Alt + A để mở Cửa sổ lệnh và chạy lệnh sau: Debug.MIDebugLaunch /Executable:dotnet /OptionsFile:absolute_path_to_kubedbg_xml Lệnh này sẽ bắt đầu quá trình gỡ lỗi bên trong Visual Studio với tất cả các lợi ích tiêu chuẩn mà bạn mong đợi. Nhưng đừng ngừng gỡ lỗi bằng bất kỳ cách nào khác ngoài việc nhấn Detach All từ menu Debug! Mặc dù lệnh này không thuận tiện để viết mọi lúc. May mắn thay trong Visual Studio, bạn có thể chỉ định bí danh cho các lệnh với tham số. Cuối cùng, bạn sẽ cần một kubedbg.xmltệp mới cho mỗi dự án. Với suy nghĩ này, hãy tiếp tục và tạo bí danh đầu tiên của bạn bằng cách nhập lệnh sau trong Cửa sổ lệnh:

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

Sau đó, bạn có thể bắt đầu gỡ lỗi chỉ bằng cách thực thi kubedbg.mywebapp trong Cửa sổ lệnh. Thậm chí tốt hơn, bạn có thể chạy cùng một lệnh từ Combobox của thanh công cụ Tìm kiếm nhưng với tiền tố: >kubedbg.mywebapp.Điều đó không khó vì cũng có một văn bản hoàn thành. Bạn có thể đọc thêm về bí danh lệnh ở đây. Chúc mừng gỡ lỗi! Tái bút: Là một phần thưởng hoàn toàn giống như cách bạn có thể gỡ lỗi ứng dụng của mình ngay cả khi chạy trong đám mây công cộng. Khi kubectl được gán cho một cụm trong đám mây công cộng, nó chỉ hoạt động với cùng một tập lệnh và khiến cho các giả định được trả lại ít hơn do bên trong ID tiến trình cụm thực không bằng 1


Cảm ơn bạn đã trả lời rất kỹ lưỡng. Tôi thấy rằng --attachcờ được sử dụng trong lệnh kubectl được sử dụng để đính kèm trình gỡ lỗi, điều này làm tôi lo lắng một chút. Bạn có thể xác nhận rằng điều này làm việc cho bạn khi chuẩn bị câu trả lời này?
Thorbjørn Ravn Andersen

Vâng, thực sự làm việc cho tôi! Nhưng tôi không biết tại sao không làm việc cho bạn.
devcass

Cảm ơn bạn đã xác nhận điều này sẽ làm việc cho bạn. Tôi sẽ thử nó vào ngày mai.
Thorbjørn Ravn Andersen

Không có gì! Chúc may mắn! Tôi ở đây nếu bạn cần thứ gì đó
devcass
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.