pleg 的运行

pleg,即PodLifecycleEventGenerator,pleg会记录Pod生命周期中的各种事件,如容器的启动、终止等,这些事件会写入缓存中,同时他检测到container异常退出时,他会通知kubelet,然后重启创建该container。

Start 方法启动了一个 goroutine,每一秒(plegRelistPeriod = time.Second * 1)会执行一次 relist 方法。

1. relist首先调用g.runtime.GetPods(true)获取所有的pods,然后生成 podRecords;

2. 接着检查 podRecords,主要是利用g.podRecords.getOld和g.podRecords.getCurrent获取这一轮和上一轮的该Pod信息,接着检查该Pod的所有containers,从而检查出容器启动、退出等事件,即computeEvent(oldPod, pod, &container.ID)生成事件,updateEvents(eventsByPodID, e)则将事件更新到eventsByPodID这个map中;

3. 接下来遍历eventsByPodID,遍历的目的主要是将event记录到缓存中,同时将事件发送至g.eventChannel中。即当 events[i].Type == ContainerChanged,不发送,否则发送到eventChannel中;

eventChannel的消费者其实位于syncLoopIteration函数中,syncLoopIteration传入了一个参数plegCh。plegCh := kl.pleg.Watch()返回的正式eventChannel。

syncLoopIteration将从这个channel中读取pod的生命周期事件,进行处理。handler.HandlePodSyncs函数最终还是调用dispatchWork去处理Pod。当container启动失败时,则会重新创建该container。

你可能感兴趣的:(pleg 的运行)