kubelet启动流程解析(三)kubelet指令初始化

kubelet启动流程解析(三)kubelet指令初始化,第1张

完整的指令定义:

这里我们只探讨 Run 部分内容,这部分内容为实际运行时逻辑,其他部分内容可参考 cobra

内容较多,我们按步骤进行拆解分析

第一步解析命令行的入参(如: --kubeconfig 、 --config ),如果解析阶段出现异常(通常为标识名或值错误),

调用 cmd.Usage() 输出巧御可选标识,退出启动。

kubelet 无子命令(如: kubectl apply 中的 apply 为 kubectl 的子命令),若解析出含有子命令,调用 cmd.Usage() 输出可选标识,退出启动。

如果为 help 标识,输出以下内容,退出启动流程

如果为 version 标识,输出以下内容,退出启动流程

根据门控特性标识 --feature-gates 设置门控特性,特性包含如下:

检测内容如下:

如果运行时标识值为 remote ,隐早并且 --pod-infra-container-image 值非空,会输出警告信息:

具体流程如下:

关于 kubelet 动态配置解析请参考 Dynamic Kubelet Configuration

同时定义 --dynamic-config-dir 与 --config 时, kubelet 会 --dynamic-config-dir 中的动态配置。 --config 的配置不会生效

当指定开启 dockershim only 模式时,才会走这个启动逻辑孝携岩

一般用于测试容器运行时,官方考虑后续提供独立的二进制文件,我们暂且不做讨论。

经过前几个步骤的准备,我们已经获取了 kubelet 的配置参数,接下来我们分析启动前还需要做哪些准备:

透过源码我们了解了最后的 Run 函数执行启动的逻辑,而他需要四个参数:

参数一、三、四很好理解,我们着重分析下 *kubelet.Dependencies 这个入参对象

kubelet 初始化阶段,通过 KubeletServer 、 DefaultFeatureGate 入参实例化

我们看下 kubelet.Dependencies 结构体属性:

我们看到 kubelet.Dependencies 其实是一个接口集合,包括对卷、容器运行时、 kube-apiserver 等 *** 作的接口。针对这些接口的使用场景及实现我们不做过多讨论。

至此为止,所有的启动前准备工作均已完成(配置项,运行时所需接口),接下来我们将分析 kubelet 实际运行流程( Run 函数)

kubelet启动流程

func main() {

runtime.GOMAXPROCS(runtime.NumCPU())//多核cpu,增加系统吞吐量

s := options.NewKubeletServer() //新建裂盯一个kubeletserver对象,kubeletserver结构体

s.AddFlags(pflag.CommandLine) //添加用户命令行输入

util.InitFlags() // 解析并格式化传入的参数,填充kubeletserver结构体

util.InitLogs() // 初始化log配置

defer util.FlushLogs() //延迟函数,保证了kubeletserver异常崩溃时能够将内存中的log信息保存到磁盘文件中

verflag.PrintAndExitIfRequested()

if err := app.Run(s, nil)err != nil { //run运行kubelet,

fmt.Fprintf(os.Stderr, "%v\n", err)

os.Exit(1)

}

}

kubelet run流程

1.初始化配置读取认证文件,认证

2.加载kubeconfig文件

3.CreateAPIServer

4.InitCloudProvider初肆帆和始化IaaS

5.初始化CAdvisorInterface

6.初始化ContainerManager

7.cAdvisor获取node节点信息

8.配置docker路径 Using root directory:

9.设置进程的oom_adj参数

运行RunKubelet

1.获取hostname

2.发送事情到apiserver Sending events to api server.把自己的事件通知apiserver

3.获取nodelist servicelsit podlist

4.watch node pod service

5.注册证书

6.加载存轿羡储插件

7.向apiserver注册节点信息 registerWithApiserver Attempting to register node node3

8.CreateAndInitKubelet . makePodSourceConfig //创建pod source对象

9.监测Watching apiserver

10.开启垃圾回收协程

启动kubelet startKubelet

1.start the kubelet //处理podsource的pod update消息

2.start the kubelet server

循环get put node状态status


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12243855.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-22
下一篇 2023-05-22

发表评论

登录后才能评论

评论列表(0条)

保存