Overview Link to heading
前面我们已经介绍过如何搭建 Kubernetes 源码编译环境,也介绍了 Go 语言 debug 神器 delve。现在我来告诉你如何使用 delve 调试 Kubernetes 源码。话不多说,直接开干!
⚠️ 注意:请在 Linux 系统下进行操作!
准备 Kubernetes 源码编译环境 Link to heading
这里不重复介绍如何搭建 Kubernetes 源码编译环境,可以参考我之前写的文章,补充一个小 tips:
在下载 Kubernetes 代码时指定
–filter=bold:none
可以实现最小化下载(Kubernetes 的代码实在太庞大了QwQ)。
git clone --depth=1 --filter=blob:none https://github.com/kubernetes/kubernetes.git
安装 delve 并配置 vscode Link to heading
- 安装 delve
go install github.com/go-delve/delve/cmd/dlv@latest
- 配置 vscode
创建 launch.json
文件(直接在 kubernetes 源码根目录下创建 .vscode
文件夹,然后在文件夹下创建 launch.json
文件),内容如下:
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Connect to server",
"type": "go",
"request": "attach",
"mode": "remote",
"remotePath": "${workspaceFolder}",
"port": 2345,
"host": "127.0.0.1"
}
]
}
准备 kube-apiserver 启动环境 Link to heading
- 部署 Etcd
./hack/install-etcd.sh
此时将自动从远程下载 etcd 二进制文件到目录 /third_party
。
命令执行完成后会输出设置 PATH
环境变量的提示,按照提示设置环境变量即可。
- 安装 cfssl 和 cfssljson
go install github.com/cloudflare/cfssl/cmd/...@latest
- 设置调试环境的环境变量
首先通过设置环境变量 DBG=1
禁止编译二进制时做任何优化和内联(前面我们介绍 delve 时提到过,编译时做这些优化和内联会导致调试时无法正确定位到源代码位置)。
同时通过设置环境变量 ENABLE_DAEMON=true
表示集群启动成功后(执行二进制文件)以守护进程的方式运行,否则过一段时间将自动退出服务。
- 下载 go modules
go mod tidy
- 启动 Kubernetes 集群
ENABLE_DAEMON=true DBG=1 ./hack/local-up-cluster.sh
首次编译需要一些时间,当看到 No resources found
字样的时候即表示成功。
安装成功后,会在 _output/bin
目录里生成一些 k8s 组件二进制文件。
- 查看已启动的组件及其 PID
ps -ef | grep kube
- 重复使用
如果以后想要在不需要重新编译的情况下重启集群的话,只需要执行以下命令即可:
ENABLE_DAEMON=true DBG=1 ./hack/local-up-cluster.sh -O
-O
表示跳过编译步骤,直接运行上次生成的二进制文件。
连接集群,验证集群 Link to heading
首先设置环境变量,指定连接集群配置文件。
export KUBECONFIG=/var/run/kubernetes/admin.kubeconfig
像往常一样访问集群,但是使用编译出来的 kubectl:
_output/bin/kubectl get nodes
调试集群 Link to heading
- 先找出来 kube-apiserver 进程 PID
ps -ef | grep kube-apiserver
- 启动 delve 调试服务器(最好切换到 root 用户下启动)
dlv --listen=:2345 --headless=true --api-version=2 attach 4473
如果出现以下错误:
Could not attach to pid 7074: this could be caused by a kernel security setting, try writing "0" to /proc/sys/kernel/yama/ptrace_scope
则需要修改内核配置
echo 0 > /proc/sys/kernel/yama/ptrace_scope
- 回到 vscode,点击调试按钮,开调!