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

  1. 安装 delve
go install github.com/go-delve/delve/cmd/dlv@latest
  1. 配置 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

  1. 部署 Etcd
./hack/install-etcd.sh

此时将自动从远程下载 etcd 二进制文件到目录 /third_party

命令执行完成后会输出设置 PATH 环境变量的提示,按照提示设置环境变量即可。

  1. 安装 cfssl 和 cfssljson
go install github.com/cloudflare/cfssl/cmd/...@latest
  1. 设置调试环境的环境变量

首先通过设置环境变量 DBG=1 禁止编译二进制时做任何优化和内联(前面我们介绍 delve 时提到过,编译时做这些优化和内联会导致调试时无法正确定位到源代码位置)。

同时通过设置环境变量 ENABLE_DAEMON=true 表示集群启动成功后(执行二进制文件)以守护进程的方式运行,否则过一段时间将自动退出服务。

  1. 下载 go modules
go mod tidy
  1. 启动 Kubernetes 集群
ENABLE_DAEMON=true DBG=1 ./hack/local-up-cluster.sh

首次编译需要一些时间,当看到 No resources found 字样的时候即表示成功。

安装成功后,会在 _output/bin 目录里生成一些 k8s 组件二进制文件。

  1. 查看已启动的组件及其 PID
ps -ef | grep kube
  1. 重复使用

如果以后想要在不需要重新编译的情况下重启集群的话,只需要执行以下命令即可:

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

  1. 先找出来 kube-apiserver 进程 PID
ps -ef | grep kube-apiserver
  1. 启动 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
  1. 回到 vscode,点击调试按钮,开调!