本文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. kubernetes/k8s CRI分析-kubelet删除pod分析

    关联博客<kubernetes/k8s CRI 分析-容器运行时接口分析> <kubernetes/k8s CRI分析-kubelet创建pod分析> 之前的博文先对 CRI ...

  2. kubernetes/k8s CRI分析-kubelet创建pod分析

    先来简单回顾上一篇博客<kubernetes/k8s CRI 分析-容器运行时接口分析>的内容. 上篇博文先对 CRI 做了介绍,然后对 kubelet CRI 相关源码包括 kubele ...

  3. 【原创】k8s源代码分析-----kubelet(1)主要流程

    本人空间链接http://user.qzone.qq.com/29185807/blog/1460015727 源代码为k8s v1.1.1稳定版本号 kubelet代码比較复杂.主要是由于其担负的任 ...

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

    上一章我们已经通过yaml文件将.netcore程序跑起来了,但还有一下细节问题可以分享给大家. 1.pod管理 1.1创建pod kubectl create -f netcore-pod.yaml ...

  5. 【原创】k8s源代码分析-----EndpointController

    转自本人空间 http://user.qzone.qq.com/29185807/blog/1459325937 一.controller manager创建endpointController 代码 ...

  6. Linux-0.11内核源代码分析系列:内存管理get_free_page()函数分析

    Linux-0.11内存管理模块是源码中比較难以理解的部分,如今把笔者个人的理解发表 先发Linux-0.11内核内存管理get_free_page()函数分析 有时间再写其它函数或者文件的:) /* ...

  7. 12.深入k8s:kubelet创建pod流程源码分析

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 源码版本是1.19 在上一篇中,我们知道在kubelet中,工作核心就是围绕着整个syn ...

  8. cocos2d-x 源代码分析 : Ref (CCObject) 源代码分析 cocos2d-x内存管理策略

    从源代码版本号3.x.转载请注明 cocos2d-x 总的文件夹的源代码分析: http://blog.csdn.net/u011225840/article/details/31743129 1.R ...

  9. hostapd源代码分析(三):管理帧的收发和处理

    hostapd源代码分析(三):管理帧的收发和处理 原文链接:http://blog.csdn.net/qq_21949217/article/details/46004379 这篇文章我来讲解一下h ...

随机推荐

  1. Java高级架构师(一)第35节:Nginx的Location区段

    没有修饰符 表示:必须以指定模式开始. 表示/abc下的所有内容都可以被访问. = 表示与指定的模式精确匹配,可以带参数. 实例中要求区分大小写,并以c结尾. 实例中指定的正则表达式不区分大小写. 注 ...

  2. [转]Android的ADT与SDK的区别

      adt只是一个eclipse的插件,里面可以设置sdk路径     SDK(Software Development Kit): 一般是一些被软件工程师用于为特定的软件包.软件框架.硬件平台.操作 ...

  3. 2015 百度之星 1003 棋盘占领 dfs

    棋盘占领 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://bestcoder.hdu.edu.cn/contests/contest_show ...

  4. Java的Executor框架和线程池实现原理(转)

    ExecutorService接口继承自Executor接口,定义了终止.提交,执行任务.跟踪任务返回结果等方法 1,execute(Runnable command):履行Ruannable类型的任 ...

  5. 【QQ输入法】QQ输入法-剪切板 释放内存

    发现一个神奇的情况: 清除和关闭的操作: 1. 2.右键 3.点击 4.清空 5.最后需要关闭 QQ输入法的进程

  6. 工作中常用Lixu命令学习笔记

    对于Linux,我是菜鸟,也是在工作中了才开始慢慢接触,用Linux的人都我都会觉得屌屌的,现在把工作中常用的一些Linux命令记录一下,供以后学习和参考. cd 这可能是我觉得Linux最简单的一个 ...

  7. python中出现 “'gbk' codec can't decode byte 0xf3 in position 20: illegal multibyte sequence”问题

    其实是打开文件方法open()中的模式有r,w,a等. 请看: r 以只读方式打开文件.文件的指针将会放在文件的开头.这是默认模式. rb 以二进制格式打开一个文件用于只读.文件指针将会放在文件的开头 ...

  8. alert和console的区别

    前端开发调试中用的最多的两个命令就是console和alert了吧,做了两年前端了,发现好多人连这两个命令的区别都还不清楚,今天正好没什么事情做,于是按照自己的理解随便说说.   alert: 1.会 ...

  9. xfs mount and repair

    sudo mount -t xfs /dev/sdb1 /storage xfs文件系统修复方法 2017年12月03日 10:14:19 阅读数:2749 1. 前言 首先尝试mount和umoun ...

  10. Java 定时任务 & 任务调度

    任务调度是指基于 给定时间点,给定时间间隔 或者 给定执行次数 自动执行任务. 方式1:通过 Thread 来实现 例如如下的代码,可以每隔 1000 毫秒做一次打印操作. public class ...