k8s源码分析-----kubelet(7)containerRuntime

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

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

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

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

源码为k8s v1.1.1稳定版本

2.6、containerRuntime

1、参数

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

结构体变量

type KubeletServer struct {

...

PodInfraContainerImage string

RegistryPullQPS float64

RegistryBurst int

    NetworkPluginDir string

    NetworkPluginName string

    DockerExecHandlerName string

CPUCFSQuota bool

    // Pull images one at a time.

    SerializeImagePulls bool

...

}

默认参数

func NewKubeletServer() *KubeletServer {

    return &KubeletServer{

...

PodInfraContainerImage: dockertools.PodInfraContainerImage,

        NetworkPluginDir: "/usr/libexec/kubernetes/kubelet-plugins/net/exec/",

        NetworkPluginName: "",

DockerExecHandlerName: "native",

CPUCFSQuota: false,

SerializeImagePulls: true,

...

}

}

flag参数

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

...

    fs.StringVar(&s.PodInfraContainerImage, "pod-infra-container-image", s.PodInfraContainerImage, "The image whose network/ipc namespaces containers in each pod will use.")

        fs.Float64Var(&s.RegistryPullQPS, "registry-qps", s.RegistryPullQPS, "If > 0, limit registry pull QPS to this value. If 0, unlimited. [default=0.0]")        fs.IntVar(&s.RegistryBurst, "registry-burst", s.RegistryBurst, "Maximum size of a bursty pulls, temporarily allows pulls to burst to this number, while still not exceeding registry-qps. Only used if --registry-qps > 0")

    fs.StringVar(&s.NetworkPluginName, "network-plugin", s.NetworkPluginName, "<Warning: Alpha feature> The name of the network plugin to be invoked for various events in kubelet/pod lifecycle")

    fs.StringVar(&s.NetworkPluginDir, "network-plugin-dir", s.NetworkPluginDir, "<Warning: Alpha feature> The full path of the directory in which to search for network plugins")

    fs.StringVar(&s.DockerExecHandlerName, "docker-exec-handler", s.DockerExecHandlerName, "Handler to use when executing a command in a container. Valid values are 'native' and 'nsenter'. Defaults to 'native'.")

    fs.BoolVar(&s.CPUCFSQuota, "cpu-cfs-quota", s.CPUCFSQuota, "Enable CPU CFS quota enforcement for containers that specify CPU limits")

    fs.BoolVar(&s.SerializeImagePulls, "serialize-image-pulls", s.SerializeImagePulls, "Pull images one at a time. We recommend *not* changing the default value on nodes that run docker daemon with version < 1.9 or an Aufs storage backend. Issue #10959 has more details. [default=true]")

...

}

参数比较多。挑比较主要的说

PodInfraContainerImage:设置image镜像的下载地址,主要是防止被墙,设置私有的下载地址

RegistryPullQPS:限制拉取镜像个数,每秒最大的拉取个数

RegistryBurst:限制并发拉取的数量

NetworkPluginName:网络插件的名字

NetworkPluginDir:网络插件目录

DockerExecHandlerName:docker执行命令的方式,一般都是native

2、传递参数

老方式传递参数

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

在func (s *KubeletServer) KubeletConfig() (*KubeletConfig, error) {

...

return &KubeletConfig{

...

参数较多,此处省略,可以直接去看源码

...

}

}

3、构建

我们直接进入

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

func NewMainKubelet(

runtime支持两种格式,docker和rkt。我们这里只分析docker

我们看看构建containerRuntime的主要参数

3.1、dockerClient,

这个之前文章中已经分析过的了

3.2、readinessManager、containerRefManager

1、readinessManager其实就是一个map

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

2、containerRefManager,其实也是一个map

k8s.io\kubernetes\pkg\kubelet\container\container_reference_manager.go

3.3、machineInfo

获取MachineInfo,主要是从cadvisor获取

3.4 、dockerExecHandler

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

func (s *KubeletServer) KubeletConfig()

我们这里就看native

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

从以上代码来看,其实就是对dockerclient进行了一个exec的封装

4、功能

我们看下DockerManager结构体

下面是对外暴露的接口

从接口来看基本上涵盖了所有的pod的管理操作

挑几个函数看看

ExecInContainer

从下图,我们就可以看到了,最后调用的是execHandler,也就是我们上面3.4讲解的dockerExecHandler

PullImage和IsImagePresent

dockerpuller是在构建的时候初始化的

下面是初始化地方

dockerpuller结构体,其中最主要的参数就是dockerclient

除了检测限速,另外最终的还是调用了dockerclient的PullImage的接口

5、小结

DockerManager作为kuberlet的containerRuntime,承担了很多主要工作的封装,所以代码量非常大,在此本文只是做了一个简单的分析,并没有全部分析。

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

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张首富-小白的成长历程

Linux软件包安装--三魔鬼

yum是基于rpm的软件包管理器,他可以使系统管理人员交互和自动化地更细与管理rpm包,他能自动从服务器下载RPM包并安装,他可以自动处理依赖关系,自动安装所有...

2072
来自专栏云计算教程系列

如何在Ubuntu 14.04上配置Apache内容缓存

缓存是一种通过允许以允许更快访问的方式临时存储共同请求的内容来提高服务器性能的方法。这通过减少一些资源密集型操作来加速处理和交付。

1450
来自专栏大学生计算机视觉学习DeepLearning

c++ 网络编程(十一)TCP/IP LINUX 初步制作基于HTTP的WEB服务器

原文链接:https://www.cnblogs.com/DOMLX/p/9663028.html

1584
来自专栏玄魂工作室

CTF实战14 任意文件上传漏洞

该培训中提及的技术只适用于合法CTF比赛和有合法授权的渗透测试,请勿用于其他非法用途,如用作其他非法用途与本文作者无关

6293
来自专栏分布式系统进阶

Kafka的消息是如何被消费的?Kafka源码分析-汇总

1293
来自专栏jeremy的技术点滴

现代Web开发教程系列_02

2917
来自专栏北京马哥教育

邮件原理你真的造吗

一、前言 虽然现在QQ、微信等即时聊天工具原来越盛行,但是在企业与企业之间大部分还是会使用邮件系统进行信息交换。所以作为运维人员,更需要了解这个技术的原理...

42915
来自专栏FreeBuf

忘记密码咋办?本地密码检索工具 – LaZagne Project

简介 LaZagne project 是一款用于检索大量存储在本地计算机上密码的开源应用程序。每款软件他们保存密码的方法或许不尽相同(明文,API,算法,数据...

1977
来自专栏自由而无用的灵魂的碎碎念

解决windows 10无法打开.hlp帮助文件的问题

最近学习UML,使用的Rational Rose 7.0,使用帮助时,才发现windows 10无法打开.hlp的帮助文件。虽然win10默认定向到微软支持页面...

1073
来自专栏程序员互动联盟

【专业技术】arm中的7种执行模式

嵌入式设备已经越来越与我们的日常生活密切相关了,由此带来了ARM的高速发展。就拿我们的手机来说吧,几乎所有的手机都是ARM体系的。这里大致介绍下ARM 的7种执...

3759

扫码关注云+社区