热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

怎么分析kubelet中的Pod同步流程

怎么分析kubelet中的Pod同步流程,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题

怎么分析kubelet中的Pod同步流程,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

1.核心流程

kubelet最核心的功能就是根据master的指示,在节点上创建并管理pod。目前对于kubelet而言,有三种途径来获取所管理的pod清单:

  • 文件 - 通过启动参数–config指定配置目录,定期检查变更。

  • HTTP Endpoint - 通过--manifest-url参数指定,定期检查更新。

  • API Server - 通过API Server监听etcd目录,实时同步pod清单。

通过API Server监听Pod清单,并在节点上维护对应的Pod实例,这是整个kubelet进程的核心主流程。下图近似描述了这个过程:

怎么分析kubelet中的Pod同步流程

注意:在实际研究过程中,发现go语言实现的系统在调用逻辑上和Java/C++这些语言实现的系统有很大差异。go语言除了对象之间相互方法调用之外,还存在大量的goroutine间通过channel发送消息调用的情况。因此,从逻辑上来讲,go语言的调用事实上是并发的,类似于网状的。而不是传统的同步调用,线性的关系。因此,感觉很难用UML图来表示对象间的调用顺序。上图仅仅是把关键的对象及方法入口表示出来而已,而且有很多省略。当中如果有错误或更好的表述方式,也请告知作者。

2.核心结构及调用关系

2.1 Kubelet

/pkg/kubelet/kubelet.go文件中的Kubelet结构体是整个kubelet进程的核心数据结构,它持有了所有关联的实体对象。Kubelet有两个主要的入口方法:

  • NewMainKubelet - 创建并初始化一个Kubelet结构(将所有关联实例都初始化好)。

  • Run - 启动所有辅助的goroutines以及上文中提到的主流程。

NewMainKubelet方法中,调用了一个makePodSourceConfig的私有方法,该方法会返回一个PodConfig对象指针。其中有一个field叫做updates chan kubetypes.PodUpdate,用于传递pod更新消息。

updates通道一边连接着从三种来源获取pod更新信息的goroutines。一边被kubelet的主流程消费,即获取pod更新信息,并同步操作Pod实例。

kubelet的主流程方法入口是Kubelet.syncLoopIteration,用于不断分发updates通道中的消息。

2.2 PodWorkers

/pkg/kubelet/pod_workers.go文件中的podWorkers结构,是一个协程池。podWorkders会为每个pod单独起一个goroutine,专门用于消费该pod相关的update信息,实施pod的操作。

podWorkers有两个关键方法:

  • UpdatePod - update入口,启动并管理每个pod的update协程。

  • managePodLoop - worker的实际逻辑,最终调用Kubelet.syncPod方法。

在managePodLoop每次Pod同步完成之后,会调用wrapUp方法。该方法用于周期性同步pod,即使没有收到API Server推送的变更。

wrapUp方法会在podWorkers的workQueue中push下次发生同步的时间戳。同时kubelet.syncLoopIteration方法会周期性从podWorkers.workQueue中拉取当前时刻需要同步的pod列表,并触发SyncPod操作。

2.3 kubeGenericRuntimeManager

在1、Kubelet关键模块 文档中有描述,该结构体实现了kubecontainer.Runtime接口,封装了Container & Image相关的操作。

主流程中调用的是该结构体的SyncPod方法,它会计算出当前该Pod上所需要执行的操作,通过CRI接口执行。

2.4 dockerService & kubeDockerClient

dockershim中对CRI接口的实现,kubeGenericRuntimeManagerdockerService之间实际上通过gRPC来通讯。

kubeDockerClient是对libdocker.Interface接口的封装,通过HTTP(s)和docker daemon通讯。

看完上述内容,你们掌握怎么分析kubelet中的Pod同步流程的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程笔记行业资讯频道,感谢各位的阅读!


推荐阅读
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • linux location root访问文件夹404_Linux下yum安装PHP7.2+Nginx+Mysql
    一.安装NGINX1.先查看是否安装了第三方软件库:yumlistinstalled|grepepel-release或rpm-qepel-release如果已经安装 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • centos安装Mysql的方法及步骤详解
    本文介绍了centos安装Mysql的两种方式:rpm方式和绿色方式安装,详细介绍了安装所需的软件包以及安装过程中的注意事项,包括检查是否安装成功的方法。通过本文,读者可以了解到在centos系统上如何正确安装Mysql。 ... [详细]
  • UML 包图
    什么是包包可直接理解为命名空间,文件夹,是用来组织图形的封装,包图可以用来表述功能组命名空间的组织层次。•在面向对象软件开发的视角中&#x ... [详细]
  • 基于.NET Core框架nacos的简单应用
    什么是Nacos?服务(Service)是Nacos世界的一等公民。Nacos支持 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • ASP.NET CORE 简介
    ASP.NETCore是一个跨平台的高性能开源框架,用于生成启用云且连接Internet的新式应用。使用ASP.NETCore,您可以:生成Web ... [详细]
author-avatar
dmcm0004
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有