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