kubelet如何获知待执行任务?与apiserver的事件交互机制解析
kubelet与apiserver事件交互模式解答
结论:交互模式为kubelet主动发起长连接监听拉取事件,apiserver不会主动向kubelet推送事件。
你找到的syncLoop函数源码注释如下:
源码路径:
kubernetes/pkg/kubelet/kubelet.go// syncLoop is the main loop for processing changes. It watches for changes from // three channels (file, apiserver, and http) and creates a union of them. For // any new change seen, will run a sync against desired state and running state. If // no changes are seen to the configuration, will synchronize the last known desired // state every sync-frequency seconds. Never returns.
对应逻辑拆解:
- apiserver没有主动向节点侧kubelet发起连接、推送事件的设计,实际生产环境中kubelet往往位于内网、NAT网关后,apiserver通常也不具备直连kubelet的网络条件。
- kubelet启动后会主动向apiserver发起Watch请求,监听分配到本节点的Pod、节点自身配置等关联资源的变更,该请求基于HTTP长连接实现:apiserver收到Watch请求后会将请求挂起,当监听的资源发生符合条件的变更时,会通过这条已经由kubelet主动建立的长连接返回变更数据,kubelet侧持续从该连接读取事件,送入
syncLoop对应的apiserver事件通道。 - 注释中提到的三通道合并逻辑,是将apiserver Watch到的事件、本地静态Pod目录的文件变更事件、kubelet预留HTTP管理接口收到的变更事件做统一归并,任意通道有新事件都会触发期望状态与节点实际运行状态的同步逻辑。
- 注释中提到的固定周期同步是兜底校验机制:即使长连接上没有收到新的变更事件,kubelet也会按照
sync-frequency参数配置的间隔,主动做一次全量状态对账,避免偶发的事件丢包、连接异常导致节点运行状态和集群期望状态不一致。 - 如果Watch长连接出现中断,kubelet会自动重新向apiserver发起Watch请求重建连接,整个过程不需要apiserver主动触发。
内容的提问来源于stack exchange,提问作者zeromsi
相关产品推荐
相关产品推荐

