goland远程调试k8s上容器的实现

本文主要介绍了goland远程调试k8s上容器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

选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按钮

到此这篇关于goland远程调试k8s上容器的实现的文章就介绍到这了,更多相关goland远程调试k8s上容器内容请搜索0133技术站以前的文章或继续浏览下面的相关文章希望大家以后多多支持0133技术站!

以上就是goland远程调试k8s上容器的实现的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » 其他教程