
Api-Server
1、启动流程
1.1 资源注册
kube-apiserver 组件启动后的第一件事情是将 Kubernetes 所支持的资源注册到 Scheme 资源注册表中,帮助后续的服务启动提供元数据查询,其通过 Go 语言的导入(import)和初始化(init)机制触发的 。
包内按照 const --> var --> init() 的顺序执行,包之间按照引用的顺序执行,A 引用了 B,则 B 在 A 之前进行导入,main 函数在最后进行调用。
初始化Scheme资源注册表
var ( Scheme = runtime.NewScheme() Codecs = serializer.NewCodecFactory(Scheme) ParameterCodec = runtime.NewParameterCodec(Scheme) )
在 legacyscheme 包中,定义了全局的 Scheme 资源注册表、Codec 编解码器及 ParameterCodec 参数编解码器,在 kube-apiserver 的任何地方都可以被调用,服务于 KubeAPIServer。
注册Kubernetes所支持的资源
kube-apiserver 启动时导入了 master 包,该包中的 import_known_versions.go 文件调用了 Kubernetes 资源下的 install(init 函数来完成资源的注册过程)。
func Install(scheme *runtime.Scheme) { // 注册内部版本 utilruntime.Must(core.AddToScheme(scheme)) // 注册外部版本 utilruntime.Must(v1.AddToScheme(scheme)) // 注册资源版本号 utilruntime.Must(scheme.SetVersionPriority(v1.SchemeGroupVersion)) }
1.2 Cobra参数解析
首先通过 options.NewServerRunOptions 初始化各个模块的默认配置,例如初始化 Etcd;然后通过 Complete 函数填充默认的配置参数,并通过 Validate 函数验证配置参数的合法性和可用性。最后将 ServerRunOptions(kube-apiserver 组件的运行配置)对象传入 Run 函数执行启动的逻辑。
Cobra 功能强大,是 Kubernetes 系统中所有组件统一使用的命令行参数解析库,所有的 Kubernetes 组件都使用 Cobra 来解析命令行参数。
创建 rootCmd 主命令,并定义 Run 执行函数,也可以通过rootCmd.AddCommand方法添加子命令;
为命令添加命令行参数(Flag);
执行 rootCmd 命令调用的函数,rootCmd.Execute 会在内部回调 Run 执行函数。
1.3 创建通用配置
通用配置是 kube-apiserver 不同模块实例化所需的配置:
1.4 创建 APIExtensionsServer
创建GenericAPIServer
运行依赖于 GenericAPIServer,通过 c.GenericConfig.New 函数创建名为 apiextensions-apiserver 的服务。
实例化CustomResourceDefinitions。
实例化APIGroupInfo,将资源版本、资源、资源存储对象进行相互映射。
InstallAPIGroup注册APIGroup(apiextensions.k8s.io)。
2、进程处理机制
Kubernetes 基于 UNIX 信号(SIGNAL信号)来实现常驻进程及进程的优雅退出。例如,当 kube-apiserver 组件进程收到一个 SIGTERM
信号或 SIGINT
信号时,会通知 kube-apiserver 内部的 goroutine 优先退出,最后再退出 kube-apiserver 进程。
- 感谢你赐予我前进的力量