kubelet 监听 etcd,所有针对 pod 的操作都会被 kubelet 监听。如果发现有新的绑定到本节点的 Pod,则按照 Pod 清单的要求创建该 Pod。
如果发现本地的 Pod 需要被修改,则 kubelet 会做出对应的修改,比如在删除 Pod 中的某个容器时,会删除该容器。如果发现本地的 Pod 需要被删除,则 kubelet 会删除相应的 Pod,并删除 Pod 里的容器。
kubelet 读取监听到的信息,如果是创建和修改 Pod 任务,则做如下处理。
- 为该 Pod 创建一个数据目录
- 从 API Server 中读取该 Pod 清单
- 为该 Pod 挂载外部卷(External Volume)
- 下载 Pod 用到的 Secret
- 检查已经运行在节点上的 Pod,如果该 Pod 没有容器或 Pause 容器(kubernetes/pause镜像创建的容器)没有启动,则先停止 Pod 里所有容器的进程。如果在 Pod 中有需要删除的容器,则删除这些容器。
- 用 kubernetes/pause 镜像为每个 Pod 都创建一个容器。该 Pause 容器用于接管 Pod 中所有其他容器的网络。每创建一个新的 Pod,kubelet 都会先创建一个 Pause 容器,然后创建其他容器。
- kubernetes/pause 镜像大概有 200 KB,是个非常小的容器镜像。
- 为 Pod 中的每个容器做如下处理
- 为容器计算一个 hash 值,然后用容器的名称去查询对应的容器的哈希值。若找到容器,且二者的哈希值不同,则停止容器的进程,并停止与之关联的 Pause 容器的进程,若二者相同,则不做任何处理。
- 如果容器被终止,且容器没有指定的 restartPolicy(重启策略),则不做任何处理。
- 调用 containerd 下载容器镜像,调用 containerd 运行容器。