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

  • 3
  • 0
  • 约2.18千字
  • 约 4页
  • 2025-05-16 发布于四川
  • 举报

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

目录选node并同步代码准备debug镜像创建deployment创建svc上次也遇到过一次需要在k8s的容器里debug程序的情况,当时找了个偷懒的办法绕过去了,这回绕不过去了,老老实实整一把。主要还是用dlv配合goland的远程调试功能。

选node并同步代码

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

准备debug镜像

在node上创建一个空文件夹(空文件夹编译更快)保存如下内容到fileName执行dockerbuild-ffileName-timage:tag.

#选用go1.19的alpine版本

FROMgolang:1.19-alpine

#设置go代理并下载dlv源码并编译安装

RUNgoenv-wGOPROXY=,directgomoddownload/go-delve/delve@v1.9.1

WORKDIR/go/pkg/mod//go-delve/delve@v1.9.1/

RUNgomodtidy

RUNgomodvendor

RUNgoinstall./cmd/dlv/

#替换源并下载gcc,非必须,看编译是否依赖

RUNsed-is///g/etc/apk/repositories

RUNapk--no-cacheaddgcc

WORKDIR/go

创建deployment

用上面的nodeNamecodePathimage:tag替换yaml中的变量

执行kubectlapply-fdeploy.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}#nodename

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

执行kubectlexec进入容器执行dlvdebu

文档评论(0)

1亿VIP精品文档

相关文档