kubelet 的工作流程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kubelet 的工作流程相关的知识,希望对你有一定的参考价值。

参考技术A kubernetes 是一个分布式的集群管理系统,在每个节点(node)上都要运行一个 worker 对容器进行生命周期的管理,这个 worker 程序就是 kubelet。

简单地说,kubelet 的主要功能就是定时从某个地方获取节点上 pod/container 的期望状态(运行什么容器、运行的副本数量、网络或者存储如何配置等等),并调用对应的容器平台接口达到这个状态。

kubelet 除了这个最核心的功能之外,还有很多其他特性:

    * 定时汇报当前节点的状态给 apiserver,以供调度的时候使用

    * 镜像和容器的清理工作,保证节点上镜像不会占满磁盘空间,退出的容器不会占用太多资源

    * 运行 HTTP Server,对外提供节点和 pod 信息,如果在 debug 模式下,还包括调试信息

    * 等等……

集群状态下,kubelet 会从 master 上读取信息,但其实 kubelet 还可以从其他地方获取节点的 pod 信息。目前 kubelet 支持三种数据源:

    * 本地文件

    * 通过 url 从网络上某个地址来获取信息

    * API Server:从 kubernetes master 节点获取信息

从管理的对象来说,kubelet 目前支持 docker 和 rkt ,默认情况下使用的 docker。

Pod 管理

在 kubernetes 的设计中,最基本的管理单位是 pod,而不是 container。pod 是 kubernetes 在容器上的一层封装,由一组运行在同一主机的一个或者多个容器组成。如果把容器比喻成传统机器上的一个进程(它可以执行任务,对外提供某种功能),那么 pod 可以类比为传统的主机:它包含了多个容器,为它们提供共享的一些资源。

之所以费功夫提供这一层封装,主要是因为容器推荐的用法是里面只运行一个进程,而一般情况下某个应用都由多个组件构成的。

pod 中所有的容器最大的特性也是最大的好处就是共享了很多资源,比如网络空间。pod 下所有容器共享网络和端口空间,也就是它们之间可以通过 localhost 访问和通信,对外的通信方式也是一样的,省去了很多容器通信的麻烦。

除了网络之外,定义在 pod 里的 volume 也可以 mount 到多个容器里,以实现共享的目的。

最后,定义在 pod 的资源限制(比如 CPU 和 Memory) 也是所有容器共享的。

容器健康检查

创建了容器之后,kubelet 还要查看容器是否正常运行,如果容器运行出错,就要根据设置的重启策略进行处理。检查容器是否健康主要有三种方式:执行命令,http Get,和tcp连接。

不管用什么方式,如果检测到容器不健康,kubelet 会删除该容器,并根据容器的重启策略进行处理(比如重启,或者什么都不做)。

容器监控

kubelet 还有一个重要的责任,就是监控所在节点的资源使用情况,并定时向 master 报告。知道整个集群所有节点的资源情况,对于 pod 的调度和正常运行至关重要。

kubelet 使用  cAdvisor  进行资源使用率的监控。cAdvisor 是 google 开源的分析容器资源使用和性能特性的工具,在 kubernetes 项目中被集成到 kubelet 里,无需额外配置。默认情况下,你可以在 localhost:4194 地址看到 cAdvisor 的管理界面。

除了系统使用的 CPU,Memory,存储和网络之外,cAdvisor 还记录了每个容器使用的上述资源情况。

入口程序

cmd/kublet/kubelet.go  -->  main 方法

1. 创建kubeletFlags数据结构(对应kubelet命令行参数);

2. 创建kubeletConfigration数据结构;

3. 创建kubeletServer数据结构,此数据结构包括kubeletFlags、kubeletConfigration;

4. 启动kubelet Configuration controller,此功能开始配置和状态的循环同步;

5. 创建kubeletDeps数据结构;

启动程序

cmd/kubelet/app/server.go   -->  Run 方法

1. 判断kubelet是否以standalone模式运行;

2. 创建对象kubeClient、evnetClient,用来和 apiserver 通信。 heartbeatClient、externalkubeClient、ContainerManager;并设置OOM。

3. 调用RunKubelet。 运行 kubelet,这个函数会启动 goroutine 一直运行,是 kubelet 核心功能执行的地方。

kubernetes之kubelet运行机制分析

kubernetes集群中,每个Node节点工作节点上都会启动一个kubelet服务进程。用于处理master系欸但下发到本节点的任务,管理pod和pod中的容器。每个kubelet进程都会在API Server上注册节点自身信息,定期汇报节点资源使用情况,通过cAdvisor监控容器和节点资源。

1.1 节点管理

节点通过设置kubelet启动参数“--register-node”来决定是否向API Server注册自己。

kubelet默认10秒报告一次节点状态。

1.2 pod管理

kubelet通过以下几种方式获取自身NOde所有运行的pod清单。

(1)文件

kubelet启动参数--config指定配置文件目录下的文件(默认是/etc/kubernetes/manifests/)通过--file-check-frequency设置检查该文件目录的时间间隔。默认为20s

(2)HTTP端点(URL)

通过--manifest-url参数设置。通过--http-check-frequency设置检查该HTTP端点数据的时间间隔。默认为20s

(3)API Server

通过API Server监听etcd目录,同步pod列表

如果kubelet读取监听到的信息是创建和修改pod任务做如下处理

1、为该pod创建一个数据目录

2、从API Server读取该pod清单

3、为该pod挂在外部卷

4、下载pod用到的Secret

5、检查已经运行在节点中的pod,如果pod没有容器或pause容器没有启动,则会停止pod里所有容器的进程。如果在pod中有需要删除的容器,删除这些容器

6、用kubernetes/pause镜像为每个pod创建一个容器。该pause容器用于接管pod中所有其他容器的网络。每创建一个新pod,先创建一个pause容器,然后创建其他容器。

7、为pod中每个容器做如下处理

计算hash值,用容器名字查询对应docker容器hash之,如果找到容器,hash值不同,则停止docker中容器进程,并停止与之关联的pause容器的进程。若相同,不做处理。

如果容器被终止了,没有指定restartPolicy,不做任何处理

调用docker client下载容器经,调用docker client运行容器。

1、3 容器健康检查

通过两类探针来检查容器健康状态。

一个是LivenessProbe探针,用于判断容器是否健康。如果不健康kubelet删除该容器,并根据重启策略做相应处理。如果没有设置livenessProbe,认为返回的值用为是Success

一个是ReadnessProbe探针,用于判断容器是否启动完成,且准备接受请求。如果检查失败,pod状态将被修改。

LivenessProbe包含三种实现方式

1、ExecAction:在容器内部执行一个命令,如果该命令退出状态码为0,表示健康

2、TCPSocketAction:通过容器的IP地址和端口号指定TCP检查,如果端口能被访问,表示健康。

3、HTTPGetAction: 通过容器的IP地址和端口号以及路径调用HTTP Get方法,如果响应码大于等于200且小于等于400,表示健康。

1.4 cAdvisor资源监控

 

以上是关于kubelet 的工作流程的主要内容,如果未能解决你的问题,请参考以下文章

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

kubelet启动流程解析(一)启动方式及初始化解析

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

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

kubectl exec 在kubelet中的处理流程

kubernetes控制器