Kubernetes 源码分析之 Kubelet

1. 概述kubelet运行机制分析

在Kubernetes集群中,每个Node节点(又称Minion)上都会启动一个Kubelet服务进行。该进程用于处理Master节点下发到本节点的任务,管理Pod及Pod中的容器。每个Kubelet进程会在API Server上注册节点自身信息,定期向Master节点汇报节点资源的使用情况,并通过cAdvise监控容器和节点资源。

1.1. 节点管理

节点通过设置Kubelet的启动参数“--register-node”,来决定是否想API Server注册自己。如果该参数值为true,那么Kubelet将试着通过API Server注册自己。作为自注册,Kubelet启动时还包含下列参数:

--api-servers Master节点API Server的位置;
--kubeconfig 告诉Kubelet在哪儿可以找到用于访问API Server的证书;
--cloud-provider 告诉Kubelet如何从云服务商(IAAS)哪里读取到和自己相关的元数据
当前每个Kubelet被授予创建和修改任何节点的权限。但是在实践中,它仅仅创建和修改自己。
Kubelet在启动时通过API Server注册节点信息,并定时向API Server发送节点新消息,API Server在接收到这些信息后,将这些信息写入etcd。通过Kubelet的启动参数“--node-status-update-frequency”设置Kubelet每隔多少时间向API Server报告节点状态,默认为10秒。

1.2. Pod管理

kubelet有几种方式获取自身Node上所需要运行的Pod清单。但本文只讨论通过API Server监听etcd目录,同步Pod列表的方式。

kubelet通过API Server Client使用WatchAndList的方式监听etcd中/registry/nodes/${当前节点名称}和/registry/pods的目录,将获取的信息同步到本地缓存中。

kubelet监听etcd,执行对Pod的操作,对容器的操作则是通过Docker Client执行,例如启动删除容器等。

kubelet创建和修改Pod流程:

  1. 为该Pod创建一个数据目录。

  2. 从API Server读取该Pod清单。

  3. 为该Pod挂载外部卷(External Volume)

  4. 下载Pod用到的Secret。

  5. 检查运行的Pod,执行Pod中未完成的任务。

  6. 先创建一个Pause容器,该容器接管Pod的网络,再创建其他容器。Pod中容器的处理流程:

    1. 比较容器hash值并做相应处理。
    2. 如果容器被终止了且没有指定重启策略,则不做任何处理。
    3. 调用Docker Client下载容器镜像,调用Docker Client运行容器。
  7. 为Pod中的每个容器做如下处理:
    为容器计算一个hash值,然后用容器的名字去Docker查询对应容器的hash值。若查到容器,且两者hash值不同,则停止Docker中容器的进程,并停止与之关联的Pause容器进程;若两者相同,则不做任何处理;
    如果容器被终止了,且容器没有指定的restartPolicy(重启策略),则不做任何处理;
    调用Docker Client下载容器镜像,调用Docker Client运行容器。

1.3. 容器健康检查

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

一个是LivenessProbe探针,用于判断容器是否健康,告诉Kubelet一个容器什么时候处于不健康的状态。如果LivenessProbe探针探测到容器不健康,则Kubelet将删除该容器,并根据容器的重启策略做相应的处理。如果一个容器不包含LivenessProbe探针,那么Kubelet认为该容器的LivenessProbe探针返回的值永远是”Seccess“;

另一类是ReadinessProbe探针,用于判断容器是否启动完成,且准备接受请求。如果ReadinessProbe探针检测到失败,则Pod的状态将被修改。Endpoint Controller将从Service的Endpoint中删除包含该容器所在Pod的IP地址的Endpoint条目。
Kubelet定期调用容器的LivenessProbe探针来诊断容器的健康状况。LivenessProbe包好一下三种实现方式:

ExecAction:在容器内部执行一个命令,如果该命令的退出状态吗为0,则表示容器健康。
TCPSocketAction:通过容器的IP地址和端口号执行TCP检查,如果端口能被访问,则表示容器健康。
HTTPGetAction:通过容器的IP地址和端口号及路径调用HTTP Get方法,如果响应的状态码大于等于200且小于等于400,则认为容器状态健康。
LivenessProbe探针包含在Pod定义的spec.containers.{某个容器}中。

1.4. cAdvisor资源监控

cAdvisor是一个开源的分析容器资源使用率和性能特性的代理工具。它是因为容器而产生的,因此自然支持Docker容器。在Kubernetes项目中,cAdvisor被集成到Kubernetes代码中。cAdvisor自动查找所有在其所在节点上的容器,自动采集CPU、内存、文件系统和网络使用的统计信息。cAdvisor通过它所在节点机的Root容器,采集并分析该节点机的全面的使用情况。

2. 结构分析

如下图所示,Kubelet正常运行。 除了需要包含自身模块外,还会依赖部分第三方模块协同工作。

  • Apiserver观察者是kubelet创建的,作为和Apiserver连结的通道。以将本地的状态信息向集群同步和获取集群整体配置信息。
  • 本地数据管理,是将收集到的数据在本地内存中进行维护使用。
  • 本地数据采集是依赖于第三方的如cadvisor模块收集管理的。
  • 具体的容器化是由docker或rkt管理。
  • kubelet的 管理模块集合 主要是负责将本地采集到的数据同步到集群和根据获取到的集群配置信息对本地的容器等实体进行管理。
结构分析.png

3.流程分析

如下图所示

  • kubelet启动流程首先获取命令行参数
  • 尝试加载配置文件
  • 创建连接apiserver的client
  • NewMainKubelet 创建本节点的各个资源管理,主要是pod的管理
  • BirthCry 通知集群该kubelet上线
  • StartGarbageCollection 创建垃圾回收服务
  • startKubelet 启动kubelet业务
  • 创建协程执行 ListenAndServe 监听外部的http请求
  • 创建协程执行run并调用 syncLoop循环监听Apiserver的配置变化
  • 当接收到Apiserver的变化信息时,以添加pod为例
  • 调用distpatchWork 创建 pod
  • 调用probeManager的add为该pod添加存活检查支持
流程说明.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容