0

最近我研究了 kubelet 如何将事件同步到 apiserver 但我找不到代码在哪里。

4

1 回答 1

1

kubelet 的源代码可在此处获得。

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定义 Pod 更改类型。例如,这些值可以是ADD或之类的值REMOVE。最后所有类型的PodUpdate都将被注入到updatesof 中podConfig。所以只需要监听updatechannel即可获取本地节点的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
            }
            ...
    }

整个过程在下面的文章中详细解释:了解 Kubelet Core Execution Frame

于 2019-01-07T12:20:47.613 回答