1。概要:
ローカルコンピューターのIDEでリモートgoプログラムをデバッグします。IDEはgoland-2019.3であり、goプログラムによって公開されるhttpインターフェイスはGET / ipであり、goプログラムはポッドの形式でkubernetesクラスターで実行されます。クライアント要求がターゲットgoプログラムに到達すると、ローカルIDEブレークポイントが有効になります。
2掘り下げる:
2.1はじめに
delveはgoプログラムのデバッグツールです(git clone https://github.com/go-delve/delve.git)。これは、ターゲットのgoプログラムを起動するために使用できるシンプルで使いやすいバイナリプログラムです。 dlv環境に入った後、渡すことができます。さまざまな組み込みコマンドを使用して、ターゲットのgoプログラムをデバッグします。
2.2バイナリファイルをダウンロードする
#ダウンロードしたファイルは$ GOPATH / bin /ディレクトリ
にありますgoget -u github.com/go-delve/delve/cmd/dlv
2.3動作モード
方法1:
$ GOPATH / bin / dlv --listen =:2345 --headless = true --api-version = 2 --accept-multiclient exec / target go binary file --continue
方法2:#
最初に
ターゲットgoプログラムを起動し、pidを取得してから、次のコマンドを実行します。dlvattach targetgoプログラムのpid--headless --listen =:2345 --api-version = 2 --accept-multiclient
2.4その他の指示
2.4.1ターゲットgoプログラムをコンパイルするときは、パラメーター-gcflags =“ all = -N -l”を指定する必要があります。
2.4.2ステーションBでの簡単な掘り下げチュートリアルをお勧めします。
https://www.bilibili.com/video/BV1pb411i7nw?from=search&seid=1674747649731508669
3ゴープログラム:
https://github.com/gzlj/http-demo
goプログラムによって公開されるhttpインターフェースは次のとおりです。GET/ ip
4Dockerイメージを作成します。
4.1コンパイルGoプログラム
#cd $GOPATH/src/github.com/gzlj/http-demo/cmd/gracehttp-demo
#编译目标go程序时需要带上参数-gcflags="all=-N -l"
go build -gcflags="all=-N -l" -o main
4.2Dockerfileの記述
#ターゲットgoプログラムのバイナリ実行可能ファイルmainおよびdlv実行可能ファイルをDockerfileディレクトリに配置します
4.3 dockerbuildコマンドを実行してイメージをビルドします
docker build -t "192.168.1.70:5000/http:dlv" .
5goプログラムをkubernetesクラスターにデプロイします
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
namespace: default
spec:
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- command:
- /dlv
- --listen=:2345
- --headless=true
- --api-version=2
- --accept-multiclient
- exec
- /main
- --continue
image: 192.168.1.70:5000/http:dlv
imagePullPolicy: Always
name: web
#容器需要SYS_PTRACE 或 直接作为特权容器
securityContext:
capabilities:
add:
- SYS_PTRACE
---
apiVersion: v1
kind: Service
metadata:
labels:
app: web
name: web
namespace: default
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
- name: dlv
port: 2345
protocol: TCP
targetPort: 2345
type: NodePort
selector:
app: web
展開が成功すると、ノードのポート31883がコンテナのポート2345(delveプログラムによって監視されるポート)にマップされていることがわかります。
6golandがリモートデバッグモードをオンにします
6.1 go remotedebug設定を追加しました
メニューバーで、[実行] —> [構成の編集] —> [追加] —> [リモートに移動] —> [OK]をクリックします。
6.2 go remotedebug設定を追加しました
code / ipインターフェースのhttpハンドラーメソッドでブレークポイントを開き、IDEのバグアイコンをクリックして、コードをデバッグモードで実行します。
7ターゲットgoプログラムにアクセスし、IDEのエンドポイントを表示します
kubernetesノードポートを使用して、goプログラムの/ ipインターフェースにアクセスします
#192.168.1.71是kubernetes集群的节点,31175是go程序的service NodePort。
curl 192.168.1.71:31175/ip && echo