开发者社区> 问答> 正文

kubelet如何将事件同步到apiserver?

最近我研究了kubelet如何将事件同步到apiserver,但我无法找到代码所在的位置。

展开
收起
k8s小能手 2019-01-11 11:34:55 2062 0
1 条回答
写回答
取消 提交回答
  • 整合最优质的专家资源和技术资料,问答解疑

    Kubelet可以通过多种方式获取本地节点所需的Pod配置。最重要的方式是Apiserver。Kubelet还可以通过指定文件目录或访问指定的HTTP端口来获取Pod配置。

    在Kubelet启动时,PodConfig会创建一个对象。代码kubernetes / blob / master / pkg / kubelet / config / config.go#L58:

    type PodConfig struct {

    pods *podStorage
    mux  *config.Mux
    
    // the channel of denormalized changes passed to listeners
    updates chan kubetypes.PodUpdate
    ...

    }
    PodConfig本质上是Pod配置的多路复用器。内置mux可以侦听各种Pod配置(包括apiserver,file和http)的来源,并定期同步源的Pod配置状态。

    代码kubernetes / blob / master / pkg / kubelet / types / pod_update.go#L80:

    type PodUpdate struct {

    Pods   []*v1.Pod
    Op     PodOperation
    Source string

    }
    在Op定义了波德变型。例如,那些可以是像ADD或的值REMOVE。最后PodUpdate将注入所有类型updates的podConfig。因此,只需要监听update通道以获取本地节点的Pod配置更新。

    Kubelet启动完成后,将syncLoop执行该功能。代码kubernetes / blob / master / pkg / kubelet / kubelet.go#L180:

    // 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.

    func (kl *Kubelet) syncLoop(updates <-chan kubetypes.PodUpdate, handler SyncHandler) {
        ...
        for {
            ...
            if !kl.syncLoopIteration(updates, handler, syncTicker.C, housekeepingTicker.C, plegCh) {
                break
            }
            ...
    }
    2019-07-17 23:25:16
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载