golandIDEとkubernetesクラスターにあるデバッグgoプログラムを掘り下げる

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

ここに画像の説明を挿入

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/nangonghen/article/details/109150284