这里我们只探讨 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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)