NewAPIServerCommand

kube-apiserver源码分析(一)之 NewAPIServerCommand

以下代码分析基于 kubernetes v1.12.0 版本。

本文主要分析kube-apiservercmd部分的代码,即NewAPIServerCommand相关的代码。更多具体的逻辑待后续文章分析。

kube-apiservercmd部分目录代码结构如下:

kube-apiserver
├── apiserver.go   # kube-apiserver的main入口
└── app
    ├── aggregator.go
    ├── apiextensions.go
    ├── options  # 初始化kube-apiserver使用到的option
       ├── options.go     # 包括:NewServerRunOptions、Flags等
       ├── options_test.go
       └── validation.go
    ├── server.go   # 包括:NewAPIServerCommand、Run、CreateServerChain、Complete等

1. Main

此部分代码位于cmd/kube-apiserver/apiserver.go

func main() {
	rand.Seed(time.Now().UTC().UnixNano())

	command := app.NewAPIServerCommand(server.SetupSignalHandler())

	// TODO: once we switch everything over to Cobra commands, we can go back to calling
	// utilflag.InitFlags() (by removing its pflag.Parse() call). For now, we have to set the
	// normalize func and add the go flag set by hand.
	pflag.CommandLine.SetNormalizeFunc(utilflag.WordSepNormalizeFunc)
	pflag.CommandLine.AddGoFlagSet(goflag.CommandLine)
	// utilflag.InitFlags()
	logs.InitLogs()
	defer logs.FlushLogs()

	if err := command.Execute(); err != nil {
		fmt.Fprintf(os.Stderr, "error: %v\n", err)
		os.Exit(1)
	}
}

核心代码:

2. NewAPIServerCommand

此部分的代码位于/cmd/kube-apiserver/app/server.go

NewAPIServerCommandCobra命令行框架的构造函数,主要包括三部分:

  • 构造option

  • 添加Flags

  • 执行Run函数

完整代码如下:

此部分代码位于cmd/kube-apiserver/app/server.go

核心代码:

3. NewServerRunOptions

NewServerRunOptions基于默认的参数构造ServerRunOptions结构体。ServerRunOptions是apiserver运行的配置信息。具体结构体定义如下。

3.1. ServerRunOptions

其中主要的配置如下:

  • GenericServerRunOptions

  • Etcd

  • SecureServing

  • KubeletConfig

  • ...

3.2. NewServerRunOptions

NewServerRunOptions初始化配置结构体。

3.3. Complete

当kube-apiserver的flags被解析后,调用Complete完成默认配置。

此部分代码位于cmd/kube-apiserver/app/server.go

3. AddFlagSet

AddFlagSet主要的作用是通过外部传入的flag的具体值,解析的时候传递给option的结构体,最终给apiserver使用。

其中NewAPIServerCommand关于AddFlagSet的相关代码如下:

3.1. Flags

Flags完整代码如下:

此部分代码位于cmd/kube-apiserver/app/options/options.go

4. Run

Run以常驻的方式运行apiserver。

主要内容如下:

  1. 构造一个聚合的server结构体。

  2. 执行PrepareRun。

  3. 最终执行Run。

此部分代码位于cmd/kube-apiserver/app/server.go

4.1. CreateServerChain

构造聚合的Server。

基本流程如下:

  1. 首先生成config对象,包括kubeAPIServerConfigapiExtensionsConfig

  2. 再通过config生成server对象,包括apiExtensionsServerkubeAPIServer

  3. 执行apiExtensionsServerkubeAPIServerPrepareRun部分。

  4. 生成聚合的config对象aggregatorConfig

  5. 基于aggregatorConfigkubeAPIServerapiExtensionsServer生成聚合的serveraggregatorServer

此部分代码位于cmd/kube-apiserver/app/server.go

4.2. PrepareRun

PrepareRun主要执行一些API安装操作。

此部分的代码位于vendor/k8s.io/apiserver/pkg/server/genericapiserver.go

4.3. preparedGenericAPIServer.Run

preparedGenericAPIServer.Run运行一个安全的http server。具体的实现逻辑待后续文章分析。

此部分代码位于vendor/k8s.io/apiserver/pkg/server/genericapiserver.go

核心函数:

preparedGenericAPIServer.Run主要是调用NonBlockingRun函数,最终运行一个http server。该部分逻辑待后续文章分析。

5. 总结

NewAPIServerCommand采用了Cobra命令行框架,该框架使用主要包含以下部分:

  • 构造option参数,提供给执行主体(例如 本文的server)作为配置参数使用。

  • 添加Flags,主要用来通过传入的flags参数最终解析成option中使用的结构体属性。

  • 执行Run函数,执行主体的运行逻辑部分(核心部分)。

其中Run函数的主要内容如下:

  1. 构造一个聚合的server结构体。

  2. 执行PrepareRun。

  3. 最终执行preparedGenericAPIServer.Run。

preparedGenericAPIServer.Run主要是调用NonBlockingRun函数,最终运行一个http server。NonBlockingRun的具体逻辑待后续文章再单独分析。

参考:

最后更新于

这有帮助吗?