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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kubelet启动流程解析(三)kubelet指令初始化相关的知识,希望对你有一定的参考价值。

参考技术A 完整的指令定义:

这里我们只探讨 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 服务启动失败

1.二进制部署kubelet 组件,启动服务失败
技术图片
用journalctl _PID=23993 | vim - 命令查看报错日志
技术图片

解决办法:将cgroupDriver :cgroupfs 修改为cgroupDriver :systemed

技术图片

systemctl start kubelet

以上是关于kubelet启动流程解析(三)kubelet指令初始化的主要内容,如果未能解决你的问题,请参考以下文章

kubelet 原理解析二:pleg

kubelet启动之启动oomWatcher模块

腾讯云tke容器服务调整kubelet工作目录

kubelet 的工作流程

kubelet源码分析: CNI 插件处理流程

kubelet启动错误问题汇总