Đồ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 -File
tham 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.xml
tệ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