k8s创建一个pod的完整过程就是通过list-watch的机制进行:
第一:终端用户通过 kubectl 或其他 API 客户端提交请求给 APIServer 来建立一个 Pod 对象副本;
APIServer 尝试着将 Pod 对象的相关元信息存入 etcd 中,待写入操作执行完成,APIServer 即会返回确认信息至客户端。
第二:当 etcd 接受创建 Pod 信息以后,会发送一个 Create 事件给 APIServer;由于 Controller Manager 一直在监听APIServer 中的事件,此时 APIServer 接受到了 Create 事件,又会发送给 Controller Manager。
第三:Controller Manager 在接到 Create 事件以后,调用其中的 Replication Controller (或者RS)来保证 Node 上面需要创建的副本数量。一旦副本数量少于 RC 中定义的数量,RC 会自动创建副本。总之它是保证副本数量的 Controller。
第四:在 Controller Manager 创建 Pod 副本以后,APIServer 会在 etcd 中记录这个 Pod 的详细信息。例如 Pod 的副本数,Container 的内容是什么;同样的 etcd 会将创建 Pod 的信息通过事件发送给 APIServer。
第五:Scheduler 监听(Watch)APIServer(实际是调用APIServer的watch接口),可见其系统中起到了“承上启下”的作用,“承上”是指它负责接收创建的 Pod 事件,为其安排 Node;“启下”是指安置工作完成后,Node 上的 kubelet 进程会接管后继工作,负责 Pod 生命周期中的“下半生”。 换句话说,Scheduler 的作用是将待调度的 Pod 按照调度算法和策略绑定到集群中 Node 上。
第六:Scheduler 调度完毕以后会更新 Pod 的信息,除了知道 Pod 的副本数量,副本内容,还知道部署 所在Node 节点信息,并将上面的 Pod 信息更新至 API Server,由 APIServer 更新至 etcd 中,保存起来。
第七:etcd 将更新成功的事件发送给 APIServer,APIServer 也开始反映此 Pod 对象的调度结果。
总体上就是:
list-watch中,list就是调用资源的list apiI罗列资源,基于HTTP短链接实现;watch则是调用资源的watch api监听资源变更事件,基于HTTP 长链接实现
kubelet的作用:
kubelet 是在 Node 上面运行的进程,它也通过 List-Watch 的方式监听(Watch,通过https的6443端口)APIServer 发送的 Pod 更新的事件;kubelet 会尝试在当前节点上调用 Docker 启动容器,并将 Pod 以及容器的结果状态回送至 APIServer;
APIServer 将 Pod 状态信息存入 etcd 中。在 etcd 确认写入操作成功完成后,APIServer将确认信息发送至相关的 kubelet,事件将通过它被接受;同时kubelet也会定期上传所在节点的健康检查状况信息。