kubelet 通过以下 几种方式获取自身 Node 上所要运行的 Pod 清单 。
(1)文件: kubelet 启动 参数 “一 config ”指定的配置文件目录下的文件(默认目录为“ etc/
kubernetes manifests/) 。通过 file-check-frequency 设置检查该文件目录的时 间间, 默认为
20s。
(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 运行容器