kubelet分析(七)-dockerManager(1)-v1.5.2
dockerManager负责在kubelet中与docker打交道。dockerManager会把pod的相关信息转换成具体的docker实现,并管理docker容器。在介绍dockerManager之前,先介绍dockerManager会用到的一些其他概念:containerGC, ExecHandler, imageStatsProvider及instrumentedDockerInterface,当然,这里介绍的概念的实现在kubelet中都是最底层的实现,都是基于docker runtime的。
先来看containerGC。
containerGC
containerGC的整体调用顺序为kubelet–container的containerGC–docker runtime的containerGC,这在以后分析。本次就介绍docker runtime的containerGC。
containerGC负责处理”dead”状态的容器的回收,当然,被回收的容器都是由kubelet创建的。
先来看下ContainerGCPolicy,定义在/pkg/kubelet/container/container_gc.go中:
|
|
containerGC会依据ContainerGCPolicy中的MinAge, MaxPerPodContainer, MaxContainers三个字段来进行容器的回收,字段含义如下:
- MinAge: 容器状态成为”dead”后,过MinAge时间后都会被回收,由kubelet的–minimum-container-ttl-duration参数指定;
- MaxPerPodContainer: 如果属于某个pod的”dead”状态容器数量超过此阈值,则消除超出的容器,由–kubelet的maximum-dead-containers-per-container参数指定;
- MaxContainers: 如果”dead”状态的容器数量大于MaxContainers,则回收超出的部分,由kubelet的–maximum-dead-containers参数指定。
注:kubelet的–minimum-container-ttl-duration, –kubelet的maximum-dead-containers-per-container, –maximum-dead-containers参数将由–eviction-soft及–eviction-hard代替。
docker runtime的containerGC定义在/pkg/kubelet/dockertools/container_gc.go中:
|
|
可以通过NewContainerGC()生成:
|
|
docker runtime的containerGC实现有GarbageCollect()方法:
|
|
GarbageCollect()流程如下:
- 通过evictableContainers()获取”dead”时间超过阈值的容器;
- 回收对应pod已经被删除的容器;
- 调用enforceMaxContainersPerEvictUnit()保证每个podcontainer对应的”dead”容器数量在阈值内;
- 如果总的”dead”容器数量超出阈值,则计算每个podcontainer能保留的数量,调用enforceMaxContainersPerEvictUnit()回收超出部分。
enforceMaxContainersPerEvictUnit()定义如下:
|
|
ExecHandler
ExecHandler可以在容器中执行一条命令。在docker runtime中,提供了nsenter和原生exec两种方式。
ExecHandler最开始在/pkg/kbuelet/kubelet.go中生成。
|
|
ExecHandler定义在/pkg/kubelet/dockertools/exec.go中:
|
|
可见,实现了ExecInContainer()方法的结构体都可以称为ExecHandler()。
NsenterExecHandler
NsenterExecHandler使用nsenter命令在容器中执行命令,定义在/pkg/kubelet/dockertools/exec.go中:
|
|
ExecInContainer()方法如下:
|
|
NativeExecHandler
NativeExecHandler调用Docker提供的API在容器中执行命令,定义在/pkg/kubelet/dockertools/exec.go中:
|
|
ExecInContainer()定义如下:
|
|
imageStatsProvider
imageStatsProvider可以查看镜像信息,定义在/pkg/kubelet/dockertools/images.go中:
|
|
可以通过ImageStats()方法查看镜像信息:
|
|
instrumentedDockerInterface
instrumentedDockerInterface是对kubeDockerClient的封装,提供了记录功能,定义在/pkg/kubelet/dockertools/instrumented_docker.go中:
|
|
记录函数定义如下:
|
|
如在ListContainers()中:
|
|
instrumentedDockerInterface具体的封装这里不做详细介绍,比较是DockerManager作为runtime供kubelet调用的。
再来看下instrumentedDockerInterface中的client是如何生成的。
该client可以由ConnectToDockerOrDie()生成,定义在/pkg/kbuelet/dockertools/docker.go中:
|
|
ConnectToDockerOrDie()调用了getDockerClient()生成一个client,再调用newKubeDockerClient()生成一个新的client。
newKubeDockerClient()定义在/kube_docker_client.go中:
|
|
newKubeDockerClient在原生client的基础上添加了超时机制。KubeDockerClient提供了对容器的操作方法。
所以,关于client,KubeDockerClient在Docker原生client基础上添加了超时机制;instrumentedDockerInterface又在KubeDockerClient的基础上添加了记录功能。