在学习和了解了k8s的相关原理和细节之后,我们都想看看k8s的源码,从而更加深入的了解和学习k8s。如何分析k8s的源码呢?
我们知道k8s是用go语言写的,看k8s的源码首先要安装go的环境,然后下载源码,使用开发工具打开,最后进行分析。
本篇博客就来讲一下分析k8s源码的准备工作——搭建k8s源码分析环境。
物料准备
- go
- kubernetes-1.5.0.zip
- Intellij IDEA for golang
go环境安装
进入golang官网下载页面https://golang.org/dl/ ,选择合适的go版本下载。
由于kubernetes-1.5.0是用go 1.7.4版本编译的,所以我选择的是go 1.7.4版本,之后的版本也可以,因为go是向后兼容的。
windows上下载好exe文件后,双击安装,一路next就行,当然可以自己设定安装目录。
安装完成后,需要设置两个环境变量:
- GOROOT: 指向golang的安装路径
- GOPATH: 指向golang的工作空间
并且把$GOROOT/bin目录添加到PATH环境变量中,这样可以在命令行中使用go命令。
开发环境安装
目前常用的golang开发工具有如下几个:
- LiteIDE
- vscode(go插件)
- Intellij IDEA for golang
注:刚开始Intellij idea支持go开发是使用的一个go插件,后来推出了专门的golang版本的Intellij idea,我使用的就是这个版本,这个版本有个优点是:每一个打开的工程都可以设置自己的GOPATH。
之前一直用intellij idea开发java,使用起来比较顺手,所以我开发go都是使用intellij idea。vscode使用起来也挺方便的,轻量级的,速度相对较快。liteide是专门为golang开发的ide,也有一些特色,没用过所以不做评价。
从intellij官网下载安装文件即可,地址是:https://www.jetbrains.com/go/download/#section=windows
下载后直接双击安装,一路next即可。
k8s源码下载
到k8s github主页上下载k8s的代码。
当前k8s最新的版本是1.8,要下载的是1.5.0的版本。
切换代码到tags为1.5.0,点击右侧的Download ZIP,下载源码的zip包。
下载路径为:https://github.com/kubernetes/kubernetes/tree/v1.5.0
k8s源码整理
k8s的源码下载后是无法直接编译和查看啊,k8s也依赖很多golang的开源代码,而且如果用ide打开后有很多依赖是无法找到的,所以要现整理一下。
在上面我们设置的GOPATH目录下,新建文件夹:$GOPATH/src/k8s.io/kubernetes;
将下载的zip包解压后,将kubernetes-1.5.0目录下的如下5个文件夹拷贝到$GOPATH/src/k8s.io/kubernetes
:
- cmd
- pkg
- plugin
- vender
- third_party
为了验证k8s的代码能否找到相应的依赖,我们可以通过如下方式验证:
- 命令行进入
$GOPATH/src/k8s.io/kubernetes/cmd/kube-proxy
目录 - 执行
go build
命令; - 命令执行过程中没有报错,且执行完成后文件中多了一个exe文件,说明编译成功了
注:选择编译kube-proxy是因为proxy模块的代码较少,编译较快。
注:关于go的依赖机制vendor可以参考:https://studygolang.com/articles/4607
idea打开源码
打开刚才安装好的intellij idea golang,选择Open Project
,选择$GOPATH/src/k8s.io/kubernetes
目录:
打开后,工具会解析一会,然后就可以查看代码了。
代码的入口是在k8s.io/kubernetes/cmd/
目录下。
环境准备ok后,就可以愉快的分析代码啦 :)
开始分析
以下简要介绍一下各个子包的功能
pkg
包名 | 用途 |
---|---|
api | kubernetesapi主要包括最新版本的Rest API接口的类,并提供数据格式验证转换工具类,对应版本号文件夹下的文件描述了特定的版本如何序列化存储和网络 |
client | Kubernetes 中公用的客户端部分,实现对对象的具体操作增删该查操作 |
cloudprovider | kubernetes 提供对aws、azure、gce、cloudstack、mesos等云供应商提供了接口支持,目前包括负载均衡、实例、zone信息、路由信息等 |
controller | kubernetes controller主要包括各个controller的实现逻辑,为各类资源如replication、endpoint、node等的增删改等逻辑提供派发和执行 |
credentialprovider | kubernetes credentialprovider 为docker 镜像仓库贡献者提供权限认证 |
generated | kubernetes generated包是所有生成的文件的目标文件,一般这里面的文件日常是不进行改动的 |
kubectl | kuernetes kubectl模块是kubernetes的命令行工具,提供apiserver的各个接口的命令行操作,包括各类资源的增删改查、扩容等一系列命令工具 |
kubelet | kuernetes kubelet模块是kubernetes的核心模块,该模块负责node层的pod管理,完成pod及容器的创建,执行pod的删除同步等操作等等 |
master | kubernetes master负责集群中master节点的运行管理、api安装、各个组件的运行端口分配、NodeRegistry、PodRegistry等的创建工作 |
runtime | kubernetes runtime实现不同版本api之间的适配,实现不同api版本之间数据结构的转换 |
cmd
包括kubernetes所以后台进程的代码包括apiserver、controller manager、proxy、kuberlet等进程
plugin
主要是scheduler模块的代码实现,用于执行具体的Scheduler的调度工作。