goland远程调试k8s上容器

goland远程调试k8s上容器goland 远程调试 k8s 上容器上次也遇到过一次需要在 k8s 的容器里 debug 程序的情况 当时找了个偷懒的办法绕过去了 这回绕不过去了 老老实实整一把 主要还是用 dlv 配合 goland 的远程调试功能

goland远程调试k8s上容器

选node并同步代码

  • 可以用kubectl top node查看资源使用情况,选一个相对清闲的node,记住这个主机名nodeName
  • 可以用scp或者goland的同步功能(最好是直接在node上git clone便于分辨脏文件)将本地代码传到node上的某个路径下,记录这个代码路径codePath
  • 用这个nodeName和codePath创建deployment

准备debug镜像

  • 在node上创建一个空文件夹(空文件夹编译更快)
  • 保存如下内容到fileName
  • 执行docker build -f fileName -t image:tag .
# 选用go1.19的alpine版本 FROM golang:1.19-alpine # 设置go代理并下载dlv源码并编译安装 RUN go env -w GOPROXY="https://goproxy.cn,direct" && go mod download github.com/go-delve/delve@v1.9.1 WORKDIR /go/pkg/mod/github.com/go-delve/delve@v1.9.1/ RUN go mod tidy RUN go mod vendor RUN go install ./cmd/dlv/ # 替换源并下载gcc,非必须,看编译是否依赖 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories RUN apk --no-cache add gcc WORKDIR /go 

创建deployment

  • 用上面的nodeName codePath image:tag替换yaml中的变量
  • 执行kubectl apply -f deploy.yaml
apiVersion: apps/v1 kind: Deployment metadata: labels: k8s-app: go-env name: go-env spec: selector: matchLabels: k8s-app: go-env template: metadata: creationTimestamp: null labels: k8s-app: go-env spec: containers: - image: ${ 
   ImageTag} imagePullPolicy: IfNotPresent name: go-env stdin: true terminationMessagePath: /dev/termination-log terminationMessagePolicy: File tty: true volumeMounts: - mountPath: /go/src/code name: code dnsPolicy: ClusterFirst nodeName: ${ 
   NodeName} # node name restartPolicy: Always schedulerName: default-scheduler volumes: - hostPath: path: ${ 
   CodePath} # /path/to/code type: Directory name: code 

创建svc

  • 远程调试需要网络通信,创建svc将deploy的2345暴露到node的32345上
apiVersion: v1 kind: Service metadata: name: go-env spec: externalTrafficPolicy: Cluster ipFamilies: - IPv4 ipFamilyPolicy: SingleStack ports: - nodePort: 32345 port: 2345 protocol: TCP targetPort: 2345 selector: k8s-app: go-env sessionAffinity: None type: NodePort 

远程启动dlv

  • 执行kubectl exec进入容器
  • 执行dlv debug --headless --listen=:2345 --api-version=2 --accept-multiclient ./your_package,等待输出API server listening at: [::]:2345
  • 在goland创建GoRemote启动,ip为nodeIP,端口为32345
  • 创建完成后,点击debug按钮
  • enjoy
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217284.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午9:55
下一篇 2026年3月18日 上午9:56


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号