NewAPIServerCommand
kube-apiserver源码分析(一)之 NewAPIServerCommand
以下代码分析基于
kubernetes v1.12.0版本。
本文主要分析kube-apiserver中cmd部分的代码,即NewAPIServerCommand相关的代码。更多具体的逻辑待后续文章分析。
kube-apiserver的cmd部分目录代码结构如下:
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
NewAPIServerCommand即Cobra命令行框架的构造函数,主要包括三部分:
构造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。
主要内容如下:
构造一个聚合的server结构体。
执行PrepareRun。
最终执行Run。
此部分代码位于cmd/kube-apiserver/app/server.go
4.1. CreateServerChain
构造聚合的Server。
基本流程如下:
首先生成config对象,包括
kubeAPIServerConfig、apiExtensionsConfig。再通过config生成server对象,包括
apiExtensionsServer、kubeAPIServer。执行
apiExtensionsServer、kubeAPIServer的PrepareRun部分。生成聚合的config对象
aggregatorConfig。基于
aggregatorConfig、kubeAPIServer、apiExtensionsServer生成聚合的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函数的主要内容如下:
构造一个聚合的server结构体。
执行PrepareRun。
最终执行preparedGenericAPIServer.Run。
preparedGenericAPIServer.Run主要是调用NonBlockingRun函数,最终运行一个http server。NonBlockingRun的具体逻辑待后续文章再单独分析。
参考:
最后更新于
这有帮助吗?