搭建 K8s 1.24 版本的源码调试环境

1. 方法1,在本机的 IDE 来调试源码

如果你是 linux 系统,可以在 linux 中搭建一个 kubernetes 单机的集群,在此系统中安装 IDE(Goland) 来调试.

具体步骤如下:

1. 下载源码 (go 的版本要求 1.18.x)

1
2
3
4
git clone git@github.com:kubernetes/kubernetes.git
cd kubernetes
git checkout -b origin/release-1.24
go mod download 

2. 用 IDE 打开 kubernetes 源码

3. 找到服务的启动参数(比如 kube-controller-manager)

1
2
3
4
5
# 执行命令
ps aux | grep kube-controller-manager | grep -v grep

# 命令执行之后,输出如下, kube-controller-manager 后面的就是程序的参数
root        1584  4.0  0.8 820020 110072 ?       Ssl  23:28   0:02 kube-controller-manager --allocate-node-cidrs=true --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf --bind-address=127.0.0.1 --client-ca-file=/etc/kubernetes/pki/ca.crt --cluster-cidr=10.244.0.0/16 --cluster-name=kubernetes --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt --cluster-signing-key-file=/etc/kubernetes/pki/ca.key --controllers=*,bootstrapsigner,tokencleaner --kubeconfig=/etc/kubernetes/controller-manager.conf --leader-elect=true --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt --root-ca-file=/etc/kubernetes/pki/ca.crt --service-account-private-key-file=/etc/kubernetes/pki/sa.key --service-cluster-ip-range=10.96.0.0/12 --use-service-account-credentials=true

4. 移动 kubernetes 的静态 pod (比如 kube-controller-manager)

1
2
cd /etc/kubernetes
mv manifests/kube-controller-manager.yaml ./

5. 用 IDE 启动服务(比如 kube-controller-manager)

程序的入口: cmd/kube-controller-manager/controller-manager.go (其他的服务也是类似的路径)

点击,配置启动参数,如下图

02-配置启动参数
02-配置启动参数

现在基本就配置好了

6. 检查服务是否正常启动 (比如 kube-controller-manager)

1
2
# 执行命令看没有 kube-controller-manager
kubectl get pods -A

2. 方法2. 借助 dlv 来调试源码

如果你是 mac/window 系统,可以借助 dlv 来调试源码。

具体步骤如下:

1. 下载源码 (go 的版本要求 1.18.x)

1
2
3
4
git clone git@github.com:kubernetes/kubernetes.git
cd kubernetes
git checkout -b origin/release-1.24
go mod download 

上述下载源码,需要在 本地windowk8s节点 上都下载。

注意:由于是远端调试,所以需要在 k8s master 节点上,重新编译源码,去掉 -N -l.

2. 在 k8s master 节点上,重新编译源码

1
2
cd kubernetes 
make DBG=1 # 在 hack/lib/golang.sh 中

3. 下载可能用到的工具,如 dlv (你可能需要提前设置 GOPATH 环境变量)

1
2
3
4
5
6
# 可能非常慢,需要设置代理
go get -u github.com/cloudflare/cfssl/cmd/cfssl
go get -u github.com/cloudflare/cfssl/cmd/cfssljson
go get -u github.com/go-delve/delve/cmd/dlv
# 配置环境变量
PATH=$PATH:$GOPATH/bin 

4. 找到服务的启动参数(比如 kube-controller-manager)

1
2
3
4
5
# 执行命令
ps aux | grep kube-controller-manager | grep -v grep

# 命令执行之后,输出如下, kube-controller-manager 后面的就是程序的参数
root        1584  4.0  0.8 820020 110072 ?       Ssl  23:28   0:02 kube-controller-manager --allocate-node-cidrs=true --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf --bind-address=127.0.0.1 --client-ca-file=/etc/kubernetes/pki/ca.crt --cluster-cidr=10.244.0.0/16 --cluster-name=kubernetes --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt --cluster-signing-key-file=/etc/kubernetes/pki/ca.key --controllers=*,bootstrapsigner,tokencleaner --kubeconfig=/etc/kubernetes/controller-manager.conf --leader-elect=true --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt --root-ca-file=/etc/kubernetes/pki/ca.crt --service-account-private-key-file=/etc/kubernetes/pki/sa.key --service-cluster-ip-range=10.96.0.0/12 --use-service-account-credentials=true

5. 移动 kubernetes 的静态 pod (比如 kube-controller-manager)

1
2
cd /etc/kubernetes
mv manifests/kube-controller-manager.yaml ./

6. 用 dlv 启动服务

注意:

  • 启动参数程序路径,配置成你自己的,监听的端口是 2346
  • dlv 在配置程序参数时,有 --, 如果后面参数有特殊符号,用 --key="value" 形式
  • dlv 启动之后,必须要触发(IDE go remote),才能启动, 否则会一直等着。
1
dlv --listen=:2346 --headless=true --api-version=2 --accept-multiclient exec /root/kubernetes/_output/bin/kube-controller-manager -- --allocate-node-cidrs=true --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf --bind-address=127.0.0.1 --client-ca-file=/etc/kubernetes/pki/ca.crt --cluster-cidr=10.244.0.0/16 --cluster-name=kubernetes --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt --cluster-signing-key-file=/etc/kubernetes/pki/ca.key --controllers=*,bootstrapsigner,tokencleaner --kubeconfig=/etc/kubernetes/controller-manager.conf --leader-elect=true --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt --root-ca-file=/etc/kubernetes/pki/ca.crt --service-account-private-key-file=/etc/kubernetes/pki/sa.key --service-cluster-ip-range=10.96.0.0/12 --use-service-account-credentials=true

7. 用 IDE 连接 dlv 服务(比如 kube-controller-manager)

程序的入口: cmd/kube-controller-manager/controller-manager.go (其他的服务也是类似的路径)

  • 添加 Go Remote, 配置 hostport
  • 点击 ok,然后启动服务。

02-连接dlv
02-连接dlv

现在基本就配置好了

8. 提供一个调试的脚本 (可选)

你现在会发现,如果想要调试,就必须要把 manifests/kube-controller-manager.yaml 移出去,等不需要调试了,再把这个文件移回来,这样非常麻烦。所以使用一个脚本来实现。

脚本内容如下(注意更改你的路径):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
cleanup()
{
 mv /etc/kubernetes/kube-controller-manager.yaml /etc/kubernetes/manifests
}

trap cleanup EXIT

mv /etc/kubernetes/manifests/kube-controller-manager.yaml /etc/kubernetes

dlv --listen=:2346 --headless=true --api-version=2 --accept-multiclient exec /root/kubernetes/_output/bin/kube-controller-manager -- --allocate-node-cidrs=true --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf --bind-address=127.0.0.1 --client-ca-file=/etc/kubernetes/pki/ca.crt --cluster-cidr=10.244.0.0/16 --cluster-name=kubernetes --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt --cluster-signing-key-file=/etc/kubernetes/pki/ca.key --controllers=*,bootstrapsigner,tokencleaner --kubeconfig=/etc/kubernetes/controller-manager.conf --leader-elect=true --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt --root-ca-file=/etc/kubernetes/pki/ca.crt --service-account-private-key-file=/etc/kubernetes/pki/sa.key --service-cluster-ip-range=10.96.0.0/12 --use-service-account-credentials=true
0%