kube-apiserver源码分析(一)之 NewAPIServerCommand
以下代码分析基于
kubernetes v1.12.0
版本。
本文主要分析kube-apiserver
中cmd
部分的代码,即NewAPIServerCommand
相关的代码。更多具体的逻辑待后续文章分析。
kube-apiserver
的cmd
部分目录代码结构如下:
1 | kube-apiserver |
1. Main
此部分代码位于cmd/kube-apiserver/apiserver.go
1 | func main() { |
核心代码:
1 | // 初始化APIServerCommand |
2. NewAPIServerCommand
此部分的代码位于/cmd/kube-apiserver/app/server.go
NewAPIServerCommand
即Cobra命令行框架的构造函数,主要包括三部分:
- 构造option
- 添加Flags
- 执行Run函数
完整代码如下:
此部分代码位于cmd/kube-apiserver/app/server.go
1 | // NewAPIServerCommand creates a *cobra.Command object with default parameters |
核心代码:
1 | // 构造option |
3. NewServerRunOptions
NewServerRunOptions
基于默认的参数构造ServerRunOptions
结构体。ServerRunOptions
是apiserver运行的配置信息。具体结构体定义如下。
3.1. ServerRunOptions
其中主要的配置如下:
- GenericServerRunOptions
- Etcd
- SecureServing
- KubeletConfig
- …
1 | // ServerRunOptions runs a kubernetes api server. |
3.2. NewServerRunOptions
NewServerRunOptions
初始化配置结构体。
1 | // NewServerRunOptions creates a new ServerRunOptions object with default parameters |
3.3. Complete
当kube-apiserver的flags被解析后,调用Complete
完成默认配置。
此部分代码位于cmd/kube-apiserver/app/server.go
1 | // Should be called after kube-apiserver flags parsed. |
3. AddFlagSet
AddFlagSet
主要的作用是通过外部传入的flag的具体值,解析的时候传递给option的结构体,最终给apiserver使用。
其中NewAPIServerCommand
关于AddFlagSet
的相关代码如下:
1 | fs := cmd.Flags() |
3.1. Flags
Flags
完整代码如下:
此部分代码位于cmd/kube-apiserver/app/options/options.go
1 | // Flags returns flags for a specific APIServer by section name |
4. Run
Run
以常驻的方式运行apiserver。
主要内容如下:
- 构造一个聚合的server结构体。
- 执行PrepareRun。
- 最终执行Run。
此部分代码位于cmd/kube-apiserver/app/server.go
1 | // Run runs the specified APIServer. This should never exit. |
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
1 | // CreateServerChain creates the apiservers connected via delegation. |
4.2. PrepareRun
PrepareRun
主要执行一些API安装操作。
此部分的代码位于vendor/k8s.io/apiserver/pkg/server/genericapiserver.go
1 | // PrepareRun does post API installation setup steps. |
4.3. preparedGenericAPIServer.Run
preparedGenericAPIServer.Run
运行一个安全的http server。具体的实现逻辑待后续文章分析。
此部分代码位于vendor/k8s.io/apiserver/pkg/server/genericapiserver.go
1 | // Run spawns the secure http server. It only returns if stopCh is closed |
核心函数:
1 | err := s.NonBlockingRun(stopCh) |
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
的具体逻辑待后续文章再单独分析。
参考:
- https://github.com/kubernetes/kubernetes/tree/v1.12.0/cmd/kube-apiserver
- https://github.com/kubernetes/kubernetes/blob/v1.12.0/cmd/kube-apiserver/app/server.go
- https://github.com/kubernetes/kubernetes/blob/v1.12.0/cmd/kube-apiserver/app/aggregator.go
- https://github.com/kubernetes/kubernetes/blob/v1.12.0/cmd/kube-apiserver/app/options/options.go
赞赏一下