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

  1. 创建GenericAPIServer

    运行依赖于 GenericAPIServer,通过 c.GenericConfig.New 函数创建名为 apiextensions-apiserver 的服务。

  2. 实例化CustomResourceDefinitions。

  3. 实例化APIGroupInfo,将资源版本、资源、资源存储对象进行相互映射。

  4. InstallAPIGroup注册APIGroup(apiextensions.k8s.io)。

2、进程处理机制

Kubernetes 基于 UNIX 信号(SIGNAL信号)来实现常驻进程及进程的优雅退出。例如,当 kube-apiserver 组件进程收到一个 SIGTERM 信号或 SIGINT 信号时,会通知 kube-apiserver 内部的 goroutine 优先退出,最后再退出 kube-apiserver 进程。