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-配置启动参数
现在基本就配置好了
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
上述下载源码,需要在 本地window 和 k8s节点 上都下载。
注意:由于是远端调试,所以需要在 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 , 配置 host 和 port 。 点击 ok,然后启动服务。 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