天天看点

Kubelet 运行机制分析 Pod 管理

kubelet

通过以下

几种方式获取自身 Node 上所要运行的 Pod 清单

(1)文件:

kubelet

启动

参数

“一

config

”指定的配置文件目录下的文件(默认目录为“

etc/

kubernetes

manifests/)

。通过

file-check-frequency

设置检查该文件目录的时

间间, 

默认为

20s。

staticPodPath: /etc/kubernetes/manifests      

(2)

HTTP

端点

CURL

):通过“一

manifest-url

”参数设置

。通

过一

http-check-frequency

设置

检查该

HTTP

端点数据的时间间隔,默认为

20S。

(3)

API

Server: 

kubelet

通过

API

Server

监听

etcd

目录,同步

Pod

表。

以非 API Server方式创建的 Pod 

所有以非 API Server方式创建的 Pod 都叫作 Static Pod

, 

kubelet将Static Pod 的状态汇报给

API Server

API Server 为该 Static Pod 建一个 Mirror Pod 其相匹配。 Mirror Pod 的状态将真

实反映 Static Pod 的状态。

Static

Pod

被删除时与之相对应的

Mirror

Pod

会被删除。

API Server方式创建的 Pod  

我们只讨论通过 API

Server

获得

Pod

清单的方式。

kubelet

通过

API

S

erver 

Client

使用

Watch 

List 的方式监听“

registry/

nodes/$ 

当前节点

的名称” 和 “/

registry/p

ods

”目录,将获取的信息

同步到本地缓存中。

kubelet

监听 e

tcd ,

所有针对

Pod

操作将会被

kubelet

监听到

。如果发现有新的绑定到本节点的

Pod

,则

按照

Pod

清单的要求创建该

Pod。

如果发现本地的

Pod

被修改

,则

kubelet

会做出相应的修改

,比如删除

Pod

中的

某个容器时

则通过 Docker

Client

删除该容器。

如果发现删除本节点的 Pod

,则删除相应的

Pod

,并通过

Docker

Client

Pod

中的

容器。

kubelet

读取监听到的信息,如果是创建和修改

Pod

,则做如

下处理。

(1

)为该

Pod

创建

个数据目录

(2

)从

API

Server

读取该

Pod

清单。

(3

)为该

Pod

挂载外部卷

Extemal

Volume

(4

)下载

Pod

用到的

Secret

(5

)检查己经运行在节点中的

Pod

,如果该

Pod

没有容器或

Pause

容器(“

kubernetes/pause

镜像创建的容器)没有启动,则先停止

Pod

里所有容器的进程。如果在

Pod

中有需要删除的容

器,则删除这些容器。

(6

)用“

kubemetes/pause

”镜像为每个

Pod

创建一个容器。该

Pause

容器用于接管

Pod所有其他容器的网络。每创建

个新的

Pod,

kubelet

都会先创建

Pause

容器,然后创建其他容器。kubernetes/pause

”镜像大概为

200KB

,是

个非常小的容器镜像。

  • 为容器计算一个 hash 值,然后用容器的名字去查询对应 Docker 容器的 hash 值。若查找到容器,且两者的 hash 值不同,则停止 Docker 中容器的进程,井停止与之关联的Pause 容器的进程;若两者相同,则不做任何处理
  • 如果容器被终止了,且容器没有指定的 restartPolicy (重启策略〉,则不做任何处理。
  • 调用 Docker Client 下载容器镜像,调用 Docker Client 运行容器