【kubernetes】如何Debug Kubernetes源码

Bennie

前置步骤

  • 准备一台虚拟机(本来准备本地跑一跑,但是kubelet不支持Darwin,无奈Fusion运行一台centos7),需要安装golang环境
  • 准备kubernets源码,本地和虚拟机中的要一致,本文以1.24.0分支为主,kubernetes的源码最好放在k8s.io下,如/root/go/src/k8s.io/kubernetes

虚拟机安装

安装cfssl

需要安装cfssl和cfssljson,记得放到PATH下面。
cfssl二进制文件

安装containerd

安装containerd,需要启动containerd。
containerd安装步骤

安装kubectl

方便后面操作集群资源。

安装etcd

在kubernetes的hack目录下,有安装脚本,可以执行安装;

1
2
cd /root/go/src/k8s.io/kubernetes
./hack/install-etcd.sh

修改打包参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
./hack/lib/golang.sh

gogcflags="all=-trimpath=${trimroot} ${GOGCFLAGS:-}"
# 注释下面的行
#if [[ "${DBG:-}" == 1 ]]; then
# # Debugging - disable optimizations and inlining.
# gogcflags="${gogcflags} -N -l"
#fi
# 添加下面的行
gogcflags="${gogcflags} -N -l"

goldflags="all=$(kube::version::ldflags) ${GOLDFLAGS:-}"
# 注释下面的行
#if [[ "${DBG:-}" != 1 ]]; then
# # Not debugging - disable symbols and DWARF.
# goldflags="${goldflags} -s -w"
#fi

安装dlv

dlv是golang的debug的工具,详细可以参考文档

1
go install github.com/go-delve/delve/cmd/dlv@latest

Debug步骤

在虚拟机中运行本地集群

hack目录中的local-up-cluster.sh可以直接运行单节点本地集群,如果修改了代码进行调试,记得执行make clean

1
./hack/local-up-cluster.sh 

等待一段时间后,可以使用kubectl验证一下集群是否正常启动成功:

1
2
3
4
$ export KUBECONFIG=/var/run/kubernetes/admin.kubeconfig
$ kubectl cluster-info
Kubernetes control plane is running at https://localhost:6443/
CoreDNS is running at https://localhost:6443//api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

这里以debug apiserver举例,其他的组件类似。

dlv重新运行apiserver

找到apiserver的进程,使用kill命令将apiserver进程kill掉,使用dlv运行apiserver。

1
2
3
$ ps axu|grep kube-apiserver
$ kill -9 PID
$ dlv exec /root/go/src/k8s.io/kubernetes/_output/local/bin/linux/amd64/kube-apiserver --headless --listen=:2345 --api-version=2 --accept-multiclient -- --authorization-mode=Node,RBAC --cloud-provider= --cloud-config= --v=3 --vmodule= --audit-policy-file=/tmp/kube-audit-policy-file --audit-log-path=/tmp/kube-apiserver-audit.log --authorization-webhook-config-file= --authentication-token-webhook-config-file= --cert-dir=/var/run/kubernetes --egress-selector-config-file=/tmp/kube_egress_selector_configuration.yaml --client-ca-file=/var/run/kubernetes/client-ca.crt --kubelet-client-certificate=/var/run/kubernetes/client-kube-apiserver.crt --kubelet-client-key=/var/run/kubernetes/client-kube-apiserver.key --service-account-key-file=/tmp/kube-serviceaccount.key --service-account-lookup=true --service-account-issuer=https://kubernetes.default.svc --service-account-jwks-uri=https://kubernetes.default.svc/openid/v1/jwks --service-account-signing-key-file=/tmp/kube-serviceaccount.key --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,Priority,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota,NodeRestriction --disable-admission-plugins= --admission-control-config-file= --bind-address=0.0.0.0 --secure-port=6443 --tls-cert-file=/var/run/kubernetes/serving-kube-apiserver.crt --tls-private-key-file=/var/run/kubernetes/serving-kube-apiserver.key --storage-backend=etcd3 --storage-media-type=application/vnd.kubernetes.protobuf --etcd-servers=http://127.0.0.1:2379 --service-cluster-ip-range=10.0.0.0/24 --feature-gates=AllAlpha=false --external-hostname=localhost --requestheader-username-headers=X-Remote-User --requestheader-group-headers=X-Remote-Group --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-client-ca-file=/var/run/kubernetes/request-header-ca.crt --requestheader-allowed-names=system:auth-proxy --proxy-client-cert-file=/var/run/kubernetes/client-auth-proxy.crt --proxy-client-key-file=/var/run/kubernetes/client-auth-proxy.key --cors-allowed-origins="/127.0.0.1(:[0-9]+)?$,/localhost(:[0-9]+)?$"

使用goland连接

配置goland,连接dlv服务端
apiserver-debug
设置断点,启动debug,就可以愉快的Debug了。
apiserver-main-debug

  • 标题: 【kubernetes】如何Debug Kubernetes源码
  • 作者: Bennie
  • 创建于 : 2023-10-22 22:03:41
  • 更新于 : 2023-10-22 22:50:27
  • 链接: https://liubin.ink/2023/10/22/kubernetes/如何Debug Kubernetes源码/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
 评论