1.4 Kubernetes Project Layout设计

Kubernetes项目由Go语言编写。Go语言官方对项目的结构设计没有强制要求,早期的Go语言开发者都喜欢将包文件代码放置在项目的src/目录下,如nsqio开源项目,开发者喜欢将入口文件放入apps/目录。不同开发者的喜好不同,这导致开源项目的结构设计没有统一标准。

后来Go语言社区提出Standard Go Project Layout方案,以对Go语言项目目录结构进行划分。目前该标准已经成为众多Go语言开源项目的选择。

根据Standard Go Project Layout方案,我们对标一下Kubernetes的Project Layout设计,Kubernetes Project Layout结构说明如表1-1所示。

表1-1 Kubernetes Project Layout结构说明

由于Kubernetes项目全球开发者众多,这导致早期的代码包较多,尤其是kube-apiserver项目,其内部所引用的代码包特别多。随着Kubernetes系统版本的迭代,逐渐将部分包进行了合并,其中staging/目录为核心包暂存目录,该目录下的核心包多以软连接的方式链接到vendor/k8s.io目录。

Kubernetes系统组件较多,各组件的代码入口main结构设计风格高度一致,我们以核心组件为例,命令示例如下:

从代码入口main结构来看,各组件的目录结构、文件命名都保持高度一致。假设需要新增一个组件,我们甚至可以复制原有的组件代码,只需简单修改一下就可以将其运行起来。每个组件的初始化过程也非常类似,初始化过程示意图如图1-3所示。

图1-3 初始化过程示意图

main结构中定义了进程运行的周期,包括从进程启动、运行到退出的过程。以kube-apiserver组件为例,kube-apiserver初始化过程如图1-4所示。

图1-4 kube-apiserver初始化过程

(1)rand.Seed:组件中的全局随机数生成对象。

(2)app.NewCommand:实例化命令行参数。通过flags对命令行参数进行解析并存储至Options对象中。

(3)logs.InitLogs:实例化日志对象,用于日志管理。

(4)command.Execute:组件进程运行的逻辑。运行前通过Complete函数填充默认参数,通过Validate函数验证所有参数,最后通过Run函数持久运行。只有当进程收到退出信号时,进程才会退出。

Kubernetes其他组件的cmd设计与之类似,故不再重复描述,后续章节会针对每个组件详细描述其启动过程。