在Windows/Mac宿主机上,使用GoLand的IDE进行开发,但是如何将这些代码直接运行在k8s集群中并看到运行效果呢,这里有一个远程调试工具dlv。
图中展示了dlv的工作方式。GoLand IDE中包含Editor(编辑器)和Debugger(调试器)组件,其中Debugger组件集成了dlv。dlv作为客户端,通过网络连接到在Linux虚拟机中运行的各个Kubernetes组件。在K8s Control Plane(控制平面)虚拟机中,API Server、CC Manager和Scheduler等组件都集成了dlv服务端。在K8s Compute Machine(计算节点)虚拟机中,Kubelet和Kube Proxy组件也集成了dlv服务端。GoLand IDE中的dlv客户端可以连接到任何一个K8s组件中的dlv服务端,实现远程调试。这种设置允许开发者在本地IDE中直接调试运行在远程虚拟机中的Kubernetes各个组件,大大方便了K8s的开发和调试过程。
在远程linux环境下载配置go
我的windows上的go版本是1.22.5,所以选择1.22.5的go安装在linux上。不同版本的 Go 编译器可能会产生略微不同的调试信息。某些 Go 语言特性或标准库函数可能在不同版本间有变化。然而,小版本差异(如 1.19.1 和 1.19.3)通常不会造成大问题。但是主版本号(如 1.18 和 1.19)最好保持一致。
wget https://dl.google.com/go/go1.22.5.linux-amd64.tar.gz
解压并配置环境变量:
tar -zxvf go1.22.5.linux-amd64.tar.gz -C /usr/local/
在/.bashrc 文件中添加以下go的环境变量:
export GOROOT=/usr/local/go
export GOPATH=/go
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
export GOPROXY="https://goproxy.cn,https://mirrors.aliyun.com/goproxy,direct"
export GO111MODULE=on
这里的/go目录不会自己创建,需要新建GOPATH对应的目录。
随后验证go环境是否配置成功
[root@master local]# go env
GO111MODULE='on'
GOARCH='amd64'
GOBIN=''
GOCACHE='/root/.cache/go-build'
GOENV='/root/.config/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFLAGS=''
GOHOSTARCH='amd64'
GOHOSTOS='linux'
GOINSECURE=''
GOMODCACHE='/go/pkg/mod'
GONOPROXY=''
GONOSUMDB=''
GOOS='linux'
GOPATH='/go'
GOPRIVATE=''
GOPROXY='https://goproxy.cn,https://mirrors.aliyun.com/goproxy,direct'
GOROOT='/usr/local/go'
GOSUMDB='sum.golang.org'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/usr/local/go/pkg/tool/linux_amd64'
GOVCS=''
GOVERSION='go1.22.5'
GCCGO='gccgo'
GOAMD64='v1'
AR='ar'
CC='gcc'
CXX='g++'
CGO_ENABLED='1'
GOMOD='/dev/null'
GOWORK=''
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
PKG_CONFIG='pkg-config'
GOGCCFLAGS='-fPIC -m64 -pthread -Wl,--no-gc-sections -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build1476964916=/tmp/go-build -gno-record-gcc-switches'
go-delve安装
Delve 是专门为 Go 语言设计的调试器,它深度集成了 Go 的运行时和特性,能够提供比通用调试器更好的 Go 调试体验。通过以下命令安装dlv最新版,你可以更改最后的版本号来安装指定的版本。
go install github.com/go-delve/delve/cmd/dlv@latest
dlv
>
Delve is a source level debugger for Go programs.
Delve enables you to interact with your program by controlling the execution of the process,
evaluating variables, and providing information of thread / goroutine state, CPU register state and more.
The goal of this tool is to provide a simple yet powerful interface for debugging Go programs.
Pass flags to the program you are debugging using `--`, for example:
`dlv exec ./hello -- server --config conf/config.toml`
Usage:
dlv [command]
Available Commands:
attach Attach to running process and begin debugging.
completion Generate the autocompletion script for the specified shell
connect Connect to a headless debug server with a terminal client.
core Examine a core dump.
dap Starts a headless TCP server communicating via Debug Adaptor Protocol (DAP).
debug Compile and begin debugging main package in current directory, or the package specified.
exec Execute a precompiled binary, and begin a debug session.
help Help about any command
test Compile test binary and begin debugging program.
trace Compile and begin tracing program.
version Prints version.
Additional help topics:
dlv backend Help about the --backend flag.
dlv log Help about logging flags.
dlv redirect Help about file redirection.
Use "dlv [command] --help" for more information about a command.
kubernetes编译打包
运行中的K8s集群像是一个正在营业的餐厅。它正在为顾客(在K8s中就是应用程序)提供服务,一切都在正常运行。可以调试的K8s源码像是餐厅的设计图纸和食谱。你可以查看它,修改它,但这些修改不会立即影响到正在营业的餐厅。
这两者是独立的,你不希望在修改"食谱"(源码)时意外影响到正在用餐的客人(运行中的应用)。假设你想要为K8s添加一个新功能。你会在源码中进行修改(相当于修改食谱)。编译修改后的源码(相当于在厨房里试做新菜品)。在测试环境中运行新版本(相当于让员工品尝新菜品)。如果一切顺利,才会考虑更新生产环境的集群(相当于将新菜品添加到正式菜单)。
先下载kubernetes源码,注意要下载git文件,而不是zip文件,因为这种方法下载的是仓库的当前状态,不包含Git历史记录。
mkdir -p $GOPATH/src/github.com/kubernetes
cd $GOPATH/src/github.com/kubernetes
git clone https://github.com/kubernetes/kubernetes.git
//进入kubernetes的目录下
cd kubernetes
git checkout v.1.23.1
显示如下结果,detached HEAD状态意味着你当前不在任何分支上,而是直接指向一个特定的提交。在这种状态下可以查看代码、进行实验性更改,甚至创建新的提交。这些更改不会影响任何现有的分支。如果想在这个版本的基础上进行开发或保留您的更改,可以创建一个新的分支。