如何阅读k8s源码
本篇文章主要介绍了如何在windows下通过goland阅读k8s源码。
下载及idea加载GO代码
这边大家可以百度一下,搜一下go的下载及破解版goland的下载,网上教程很多,按照顺序按照下载即可。我这里的版本如下
go: 1.15 goland: 2020.1
C:\Users\nieweixing>go version
go version go1.15 windows/amd64
从github上克隆源码到本地
首先创建一个gopath目录,我们这里用的是
然后在go-code目录下创建一个src/k8s.io,最后我们存放代码的目录为
我们切换到k8s.io目录,执行如下命令clone代码,注意需要加上core.symlinks=true这个参数,源码中有很多软连接,不加这个参数会找不到依赖。
goland查看源码并分析目录结构
我们打开goland后配置好$GOPATH,然后查看下对应源码即可。

下面我们简单介绍下k8s源码目录的作用
Kubernetes源码编译
我们知道k8s的运行访问有2种方式,一种是二进制,还有一种就是docker镜像的方式,下面我们来讲一下如何将源码编译成二进制和镜像的方式。
二进制编译kubernetes
编译全部组件
这里我们以在centos7上作为示例
在这里我们编译apiserver的时候会出现一个错误,提示我们app\server.go:477:70: undefined: "k8s.io/kubernetes/pkg/generated/openapi".GetOpenAPIDefinitions。
在pkg/generated/openapi确实没有这个函数。这个函数是在zz_generated.openapi.go,我们需要在/root/go/src/k8s.io/kubernetes下执行
这里我们发现已经zz_generated.openapi.go生成在pkg/generated/openapi目录下,如果你在windows也有代码,那么你可以把这个文件拷贝到对应目录下。
现在我们再执行编译命令,然后编译好的二进制文件在/root/go/src/k8s.io/kubernetes/_output/bin这个目录下
编译单个组件
我们可以只编译某一个组件,下面我们来演示如何只编译kubelet的二进制文件
在linux和window下都是同样的方式,只是编译的平台不一样,生成的二进制文件不一样,window下生产kubelet.exe,linux下生产kubelet这个二进制执行文件
执行编译完成后,在kubelet目录下会存在可执行的kubelet二进制文件


docker镜像编译kubernetes
我们这里下载的是最新的源码,如果拉取不到国外镜像,可以执行下面命令拉取镜像然后上传到本地机器
为了防止从远程拉取镜像,我们可以修改下$GOPATH\src\k8s.io\kubernetes\build\lib\release.sh的配置
然后执行如下命令进行打包
编译完成后,可以到对应的目录下查找镜像,并通过docker load < * 来加载镜像,然后通过修改组件的yaml的镜像名称即可。
最后更新于
这有帮助吗?