您的位置:首页 > 其它

kube-apiserver 启动过程分析

2016-10-26 16:44 399 查看
为了了解一下apiserver  的执行过程看一下源码,同时看看大师们是怎么使用golang的,菜鸟也学习一下,毕竟是菜鸟,有哪里不对的地方欢迎指出。

首先从入口函数开始看:

1.apiserver.go 

func main() {
// 根据时间生成随机种子
rand.Seed(time.Now().UTC().UnixNano())
//创建apiserver对象
s := options.NewAPIServer()
// 添加参数 pflag.CommandLine初始化flagset
s.AddFlags(pflag.CommandLine)
//解析参数
flag.InitFlags()
// 初始化log输出
logs.InitLogs()
defer logs.FlushLogs()
//检查是否是version参数
verflag.PrintAndExitIfRequested()
if err := app.Run(s); err != nil {
fmt.Fprintf(os.Stderr, "%v\n", err)
os.Exit(1)
}

}

主要通过NewAPIServer创建了APIServer结构的指针对象,初始化了server运行的一些通用参数,其中配置的初始化包括以下几个部分:

(1).在options.go  NewAPIServer中直接静态指定的。

(2).options  NewAPIServer中ServerRunOptions: genericoptions.NewServerRunOptions().WithEtcdOptions(),指定了运行apiserver的一些通用配置 #APIServer

然后指定了后端存储的一些配置  #ServerRunOptions.StorageConfig

(3).APIServer的AddFlags中添加的参数  #APIServer

(4).APIServer的AddFlags中调用s.ServerRunOptions.AddUniversalFlags(fs) 添加的通用参数  #ServerRunOptions

(5).APIServer的AddFlags中调用s.ServerRunOptions.AddEtcdStorageFlags(fs) 添加与存储相关配置 #ServerRunOptions #ServerRunOptions.StorageConfig

可以看到初始化之后实际执行的app.Run(s) s是一个APIServer结构的指针

2.在server.go

1.首先验证必须参数是否被设置

2.初始化了capabilities

3.初始化网络隧道等云相关网络配置

4.初始化StorageConfig中反序列化缓存大小

5.初始化GroupVersion,首先从环境变量获取,然后合并从命令行传入的StorageVersions,通过genericapiserver.BuildDefaultStorageFactory合并资源编码配置、api资源配置关系返回StorageFactory,添加jobs和horizontalpodautoscalers到StorageFactory.Overrides

6.配置单独的数据存储,从命令行etcd-servers-overrides传入,当k8s节点大于50个的时候推荐给每个资源配置单独的数据存储,分别判断group/resource#servers格式是否正确,然后设置对应的DefaultStorageFactory.overrides.etcdLocation

7.设置service account默认签名证书

8.判断service-account-lookup参数的值是否为true,若为true则对已有serviceaccount进行验证,首先通过storageFactory.NewConfig判断gr是否存在,获取storagebackend.Config,通过serviceaccountcontroller.NewGetterFromStorageInterface获取serviceAccountGetter,用于检索serviceaccount和secret

9.返回authenticator.Request接口,合并了所有的认证方式

10.检查授权相关配置检查,授权配置结构创建,判断是否使用rbac授权方式,加载相关的authorizationConfig授权配置

11.准入策略相关,首先加载准入策略列表,随机产生privilegedLoopbackToken,判断是否启用https生成对应的restclient.Config,根据clientconfig生成client

12.判断是否开启认证,开启的话随机生成对应对应的api验证器,通过对应的准入机制或者token进行认证,最后返回Authorizer接口(privilegedGroupAuthorizer类型),用于判断授权成功或者失败

13.sharedInformerFactory提供保证pods, nodes, namespaces,pv,pv
b1d1
c信息的唯一性接口,通过NewFromPlugins实现了对所有准入机制,这里返回了一个SharedInformerFactory实例

14,通过NewPluginInitializer返回了一个pluginInitializer初始化准入插件的共享资源,初始化后被分别设置,通过NewFromPlugins返回interface,interface最终决定了最终准入结果

15.根据ServerRunOptions生成genericConfig,晚上genericConfig参数,生成master.Config,设置WatchCacheSize,填充未设置的必要字段,通过new方法设置其他未设置字段的默认值,通过InstallAPIs,注册restapi,最后返回Master的指针对象,最终调用GenericAPIServer的run方法运行

3.在genericapiserver.go的Run方法中判断是否启用/swaggerapi/ endpoint,调用RegisterSwaggerService注册api,判断是否开启安全端口,设置相关配置,开启监听安全端口,配置insecureServer相关信息,开启监听非安全端口,等待端口监听成功,启动PostStartHook

至此端口启动完毕
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐