最近我研究了 kubelet 如何将事件同步到 apiserver 但我找不到代码在哪里。
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
都将被注入到updates
of 中podConfig
。所以只需要监听update
channel即可获取本地节点的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。