如何阅读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
upload-image

从github上克隆源码到本地

首先创建一个gopath目录,我们这里用的是

然后在go-code目录下创建一个src/k8s.io,最后我们存放代码的目录为

我们切换到k8s.io目录,执行如下命令clone代码,注意需要加上core.symlinks=true这个参数,源码中有很多软连接,不加这个参数会找不到依赖。

goland查看源码并分析目录结构

我们打开goland后配置好$GOPATH,然后查看下对应源码即可。

upload-image

下面我们简单介绍下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二进制文件

upload-image
upload-image

docker镜像编译kubernetes

我们这里下载的是最新的源码,如果拉取不到国外镜像,可以执行下面命令拉取镜像然后上传到本地机器

为了防止从远程拉取镜像,我们可以修改下$GOPATH\src\k8s.io\kubernetes\build\lib\release.sh的配置

然后执行如下命令进行打包

编译完成后,可以到对应的目录下查找镜像,并通过docker load < * 来加载镜像,然后通过修改组件的yaml的镜像名称即可。

最后更新于

这有帮助吗?