本文QQ空间链接:http://user.qzone.qq.com/29185807/blog/1460540474

本文csdn博客链接:http://blog.csdn.net/screscent/article/details/51145382

源代码为k8s v1.1.1稳定版本号

3、Pod管理

前面的7篇文章都是为这篇文章做准备的。最终要进入到正题中,pod的管理

3.1 pod清单

1、參数

代码在k8s.io\kubernetes\cmd\kubelet\app中

结构体变量

type KubeletServer struct {

...

Config                         string

FileCheckFrequency             time.Duration

ManifestURL                    string

ManifestURLHeader              string

HTTPCheckFrequency             time.Duration

...

}

默认參数

func NewKubeletServer() *KubeletServer {

return &KubeletServer{

...

FileCheckFrequency:          20 * time.Second,

HTTPCheckFrequency:          20 * time.Second,

...

}

}

flag參数

func (s *KubeletServer) AddFlags(fs *pflag.FlagSet) {

...

fs.StringVar(&s.Config, "config", s.Config, "Path to the config file or directory of files")

fs.DurationVar(&s.FileCheckFrequency, "file-check-frequency", s.FileCheckFrequency, "Duration between checking config files for new data")

fs.StringVar(&s.ManifestURL, "manifest-url", s.ManifestURL, "URL for accessing the container manifest")

fs.StringVar(&s.ManifestURLHeader, "manifest-url-header", s.ManifestURLHeader, "HTTP header to use when accessing the manifest URL, with the key separated from the value with a ':', as in 'key:value'")

fs.DurationVar(&s.HTTPCheckFrequency, "http-check-frequency", s.HTTPCheckFrequency, "Duration between checking http for new data")

...

}

Config:配置的文件路径或文件夹

FileCheckFrequency:文件定期检查文变化间隔

ManifestURL:获取pod定义的url地址

ManifestURLHeader:头部定义

HTTPCheckFrequency:url定期获取时间间隔

2、构建

我们看看生产者的构建

入口是在createAndInitKubelet中

继续makePodSourceConfig

这里构建了一个chan,并作为返回值返回给了上一级调用者。

然后生产方式一共同拥有三种

1、文件方式

代码在k8s.io\kubernetes\pkg\kubelet\config\file.go

初始化了文件路径。nodename,另一个updates的chan

然后开起了一个定期运行的run

从上图我们看到,检測文件文件夹,然后将pod信息通过chan发送出去

2、url方式

代码在k8s.io\kubernetes\pkg\kubelet\config\http.go

初始化了url路径,header。还有定期时间间隔。最后也有一个chan

上图中构建了一个http Client,然后进行了http get请求

上图中,将获取到的信息解码,然后将解析出来的pod信息发送给chan

3、Api server方式

代码在k8s.io\kubernetes\pkg\kubelet\config\apiserver.go

这个比較简单,构建了一个listwatcher。然后将获取到的pod信息发送到chan

4、小结

通过三种方式进行pod信息的获取,也就是生产者,通过chan的方式法送给消费者。

3.2 pod管理

上一节中,我们已经知道了生产者,通过chan的方式发送给消费者

1、传递管道

在makePodSourceConfig中初始化了一个cfg

我们来看看cfg是什么

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

然后三种方式分别注冊了不同的chan

传送给消费者的接口

注:这里的代码事实上须要深入的话,须要去分析config.Mux,这个代码比較简单,这里篇幅关系就不做分析了。

2、构建与工作流程

构建

代码在k8s.io\kubernetes\cmd\kubelet\app中

podcfg就是上面构建的传送管道,最后启动了kubelet的Run函数

工作流程

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

run中的manager我们在之前的文章中基本都有介绍。最后进行syncLoop。其參数updates就是传送的管道

我们继续跟踪

当中的update被传递下来了。handler事实上就是kubelet自身

再继续跟踪

最终到了处理地方。

从传送管道中,获取到pod信息,然后依据pod的类型,分别调用了不同的处理接口。

我们也说了handler事实上就是kubelet自身

1、add

调用了func (kl *Kubelet) HandlePodAdditions(pods []*api.Pod) {

2、update

调用了func (kl *Kubelet) HandlePodUpdates(pods []*api.Pod) {

3、remove

调用了func (kl *Kubelet) HandlePodDeletions(pods []*api.Pod) {

调用了deletepod

通过chan把pod传送给了podkillingch

从上面能够看到。接收到须要kill的pod然后终于调用了killpod。

而从下图。我们看到事实上终于调用了containerrumtime的killpod,这个我们在上一篇文章中已经解说过了。

4、set

临时不支持

5、定时sync

调用了func (kl *Kubelet) HandlePodSyncs(pods []*api.Pod) {

我们看到add update sync都最后调用了dispatchWork。下一篇我们就来分析podwork

龚浩华

QQ 月牙寂 29185807

2016年4月13日

(版权声明:本文为作者原创,如需转载请通知本人,并标明出处和作者。擅自转载的。保留追究其侵权的权利。)

【原创】k8s源代码分析-----kubelet(8)pod管理相关推荐

  1. .net core i上 K8S(四).netcore程序的pod管理,重启策略与健康检查

    目录 1.pod管理 2.重启策略 3.健康检查 4.进入容器 正文 上一章我们已经通过yaml文件将.netcore程序跑起来了,但还有一下细节问题可以分享给大家. 1.pod管理 1.1创建pod ...

  2. lua源代码分析02:内存管理

    lua虚拟机之间的工作线程非常安全,因为: 一切与lua虚拟机相关的内存操作被关联到虚拟机对象中,没有利用任何共享变量: lua虚拟机核心部分没有任何系统调用: lua让用户自行定义内存管理器,在创建 ...

  3. GoAhead2.5源代码分析之1-用户管理(um.c)

    Um.c(用户管理) umconfig.txt ---------------------------------------- TABLE=users ROW=0 name=admin passwo ...

  4. k8s集群部署——Pod管理和资源清单

    文章目录 一.Pod管理 二.资源清单 三.Pod生命周期 四.今日报错 一.Pod管理 Pod是可以创建和管理Kubernetes计算的最小可部署单元,一个Pod代表着集群中运行的一个进程,每个po ...

  5. kubelet启动pod源码分析(三)

    之前的blog分析了kubelet启动pod的流程,那么pod一旦启动了,谁去上报状态呢?还是回到之前代码syncLoopIteration,这个里面有四个输入源,第一次创建接受到configch a ...

  6. K8s常见问题分析解决(基础问题)

    1:部分工作节点pod无法启动 详细描述:部分工作节点pod无法启动(处于ContainerCreateing状态)日志: failed to set up ..... Network: failed ...

  7. k8s集群核心概念pod

    文章目录 k8s集群核心概念pod 1.pod介绍 什么是pod 网络: 存储: pod的使用 2.pod的生命周期 了解 Init 容器 使用 Init 容器 状态和策略 容器探针的类型 3.查看p ...

  8. LINUX学习------Linux自动化运维——Kubernetes的pod管理

    一.Pod管理 Pods Pod是可以创建和管理Kubernetes计算的最小可部署单元,一个Pod代表着集群中运行的一个进程,每个pod都有一个唯一的ip. Pod (就像在鲸鱼荚或者豌豆荚中)是一 ...

  9. 《LINUX3.0内核源代码分析》第一章:内存寻址

    https://blog.csdn.net/ekenlinbing/article/details/7613334 摘要:本章主要介绍了LINUX3.0内存寻址方面的内容,重点对follow_page ...

最新文章

  1. sql 存储过程和函数
  2. CentOS 5 全攻略 -- 一步一步配置详解
  3. wordpress引入php文件,WordPress主题制作之模板文件的引入方法,wordpress模板
  4. 常见的14种异常心电图的波形特点
  5. 虚拟化与云计算(一)之 Lab1 使用 Hadoop Mapreduce 进行数据处理
  6. Linux 系统服务管理器(初始化系统/init system) -- systemd 及命令 systemctl 的详细介绍
  7. html定义页脚有什么用,HTML5中footer标签的用法你知道吗?,HTML5中的footer标签是什么意思?...
  8. python在数字后添加字符_用python生成数字、字母和特殊字符混合的字符串
  9. 为什么要有handler机制
  10. Linux批量文件名大小写转换,Linux中批量把文件名大小写转换
  11. 用Python实现一个简单的批量无水印快手抖音批量下载器
  12. 微信小程序的微信开发者工具的快捷键查找和设置
  13. 那些年,我们一起追过的球队
  14. 如何有效地进行资料整理?
  15. linux lzma c语言接口,编译squashfs和lzma
  16. TypeScript 初学者指南
  17. JavaScript-筑基(二十五)navigator对象(判断页面打开终端)、history对象
  18. 计算机软件系统举例,什么是系统软件应用软件举例说明
  19. 达芬奇密码 第七十一章
  20. c++中赋值运算符重载

热门文章

  1. C++进阶教程之预存处理器
  2. mysql死锁,等待资源,事务锁,Lock wait timeout exceeded; try restarting
  3. .Net快速获取网络文本文件最后一段文字-小应用
  4. PCB 多层设计 实例视频教程 pretell99
  5. zookeeper OOM问题排查
  6. 宏、函数、宏和函数的区别
  7. jmeter 一个可能引起性能严重下降的断言设置
  8. 摆脱Wi-Fi信号干扰的对策
  9. VLFeat-----mean sift开源库【配置】【转载】
  10. 《Queue,Stack,SortedList》---集合