k8s源码分析-----kubelet(9)podWorkers

说明:此文章为腾讯云机器自动从本人csdn博客搬迁过来。是本人授权操作。

申明:无本人授权,不可转载本文。如有转载,本人保留追究其法律责任的权利。

龚浩华,QQ 29185807,月牙寂 道长

第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang

源码为k8s v1.1.1稳定版本

3.3 podworkers

在3.2(也就是在k8s源码分析-----kubelet(8)pod管理)末尾,我们看到了,最终的处理都进入了podworkers中。

现在我们就来分析下podworkers

1、构建

代码在k8s.io\kubernetes\pkg\kubelet\kubelet.go中

// New creates a new Kubelet for use in main

func NewMainKubelet(

我们先看看其中的参数runtimeCache

代码在k8s.io\kubernetes\pkg\kubelet\container\runtime_cache.go中

从上图可以看出主要提供了两个接口函数GetPods和ForceUpdateIfOlder。在NewRuntimeCache的时候,提供的getter则是containerRuntime(这个之前的文章已经分析过)

结构体很简单

下面我们看看Getpods

从函数的注释就能够看的出来,其实runtimecache保存的就是当前pod的一个缓存,如果换成没有过期的话,则返回,如果过期了则重新更新

我们再看看

从上面的三个函数中我们就看到了getter.GetPods(其实这个就是containerRuntime)

现在看看podworkers

上面有很多的成员,其中最重要的就是podupdates,这个是针对不同的uid pod开启了一个通信管道。

2、工作

我们先看看kubelet的dispatchWork

其中就调用了podworks的Updatepod

我们继续跟踪

这一部分代码,其实就是对新的uid pod开启来一个chan 管道,真正的运行是在managePodLoop,稍后我们对其分析

isworking防止同一个pod重入。然后新的pod则将信息发送到管道。真的运行是在managePodLoop

我们再看下managePodLoop

这是一个死循环的,消费者,前面的updatepod是生产者,负责将pod通过管道发送到这个消费者。先从runtimecache中获取到pods,然后将调用syncpodFn(这个参数是在构建podworkers传入的,其实就是kubelet的syncPod),稍后在分析syncpod

这个消费者什么时候死亡呢?

我们看下面,下面的ForgetWorker和ForgetNonExistingPodWorkers。调用了removeworker,在这个函数中,关闭了管道,那么消费者也将随之消失

那么我们即将进入最后的步骤func (kl *Kubelet) syncPod

上面的是一个函数返回时的操作

上面中,开始真正的动作。killpod,当pod无法运行的时候

然后开始解析,挂载volume

等等一系列的操作完之后,调用了containerRuntime.synpod

这个就是我们之前分析的对docker封装的一个containerRuntime。

4、总结

关于kubelet的所有分析都完成了。这一系列的文章只是对kubelet做了一个简单的分析,其中还有很多部分并没有完全的分析,不过我相信经过这些分析之后,对kubelet的主要工作应该已经有了一个大致的了解。

再说手kubelet的设计,这里面用的最多的是生产者和消费者模型,都是通过chan来进行通信,这个也是golang官方极力推荐的模式。再有就是,模块独立化,各个模块自我管理,这个与我在15年上海golang大会上所提到的AOP(Agent Oriented Programmig 面向智能体编程)的理念是一样的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据和云计算技术

Codegen技术学习

Codegen在spark中的应用 除了前面查询优化中讲到逻辑优化器之外,Spark在1.5版本中引入了比较大的一个动作就是DataFrame执行后端的优化,引...

3805
来自专栏有趣的django

python面试

1. 先做自我介绍 2. 做Python几年了?为什么选择Python? 3. 学历?大学什么专业? 4. 除了Python以外对其他语言有没有了解? 5. 你...

2454
来自专栏北京马哥教育

球球大作战分享链接自动点击之龙蛋获取

前言 据上次玩球球大作战已经有几个月了,最近看到它又出了个龙蛋获取分享链接,又想试着分析一下。 刚开始看到这个,还挺复杂了,什么混淆啊,捉迷藏啊。 龙蛋分享页...

3695
来自专栏架构师小秘圈

MapReduce极简教程

一个有趣的例子 你想数出一摞牌中有多少张黑桃。直观方式是一张一张检查并且数出有多少张是黑桃? ? MapReduce方法则是: 给在座的所有玩家中分配这摞牌 ...

3527
来自专栏Android机动车

设计模式——代理模式

现在有个非常流行的程序叫做面向切面编程(AOP),其核心就是采用了动态代理的方式。怎么用?Java为我们提供了一个便捷的动态代理接口 InvocationHan...

871
来自专栏芋道源码1024

注册中心 Eureka源码解析 —— 应用实例注册发现 (九)之岁月是把萌萌的读写锁

本文主要分享 Eureka 注册中心的那把读写锁,让我瘙痒难耐,却不得其解。在某次意外的抠脚的一刻( 笔者不抽烟,如果抽烟的话,此处应该就不是抠脚了 ),突然顿...

870
来自专栏JAVA高级架构

Java设计模式-责任链模式

作者:Jet啟思 链接:https://juejin.im/post/5a126b146fb9a0450c490201 今天来说说程序员小猿和产品就关于需求发生...

34011
来自专栏IT技术精选文摘

MongoDB设计模式

MongoDB是一个NoSQL文档数据库。 它是大多数用例的理想选择,然而当它不适用你的用例时,您仍然可以通过使用以下设计模式来克服它的一些限制。 1.查询命令...

17210
来自专栏H2Cloud

Event Store框架探究

摘要:   游戏开发中,经常会越到千奇百怪的Bug。后台程序都是以demon 方式运行,要么GDB,要么Log。一些确定性的bug可以直接使用GDB调试,比如特...

3557
来自专栏听Allen瞎扯淡

为什么java.util.concurrent 包里没有并发的ArrayList实现?

问:JDK 5在 java.util.concurrent 里引入了 ConcurrentHashMap,在需要支持高并发的场景,我们可以使用它代替 HashM...

652

扫码关注云+社区