概述
Pod Lifecycle Event Generator(pleg)的命名来源于kubelet的一个模块,它的原理是定期查询runtime下所有pods,然后封装为事件写入到chan中。
kubelet pleg
- kubelet的pleg和runtime紧密联系,核心方法是relist,然后把容器的状态发送到watch channel中
- 事件的状态也比较简单,主要就是下面4个,他们和k8s里定义的容器状态是有对应的
- 一个好的细节是,如果watch channel满了,会通过select-default丢弃事件
const (
plegContainerRunning plegContainerState = "running"
plegContainerExited plegContainerState = "exited"
plegContainerUnknown plegContainerState = "unknown"
plegContainerNonExistent plegContainerState = "non-existent"
)
func (g *GenericPLEG) Watch() chan *PodLifecycleEvent {
return g.eventChannel
}
func (g *GenericPLEG) Start() {
go wait.Until(g.relist, g.relistPeriod, wait.NeverStop)
}
koordlet pleg
- pleg仿照的的是kubelet的,是一个事件驱动的模块
- koordlet的pleg本质上是一个典型的观察者模式
- Watcher封装了Linux的一个特性,当文件系统发生变化时会产生事件
- PodLifeCycleHandler定义了观察者的回调函数
- Pleg通过map+ID记录观察者,Watcher则有2个podWatcher和containerWatcher,监听cgroup路径
- Pleg的events chan *event则保存了koordlet自己定义的事件
type PodLifeCycleHandler interface {
OnPodAdded(podID string)
OnPodDeleted(podID string)
OnContainerAdded(podID, containerID string)
OnContainerDeleted(podID, containerID string)
}
type Pleg interface {
Run(<-chan struct{}) error
AddHandler(PodLifeCycleHandler) HandlerID
RemoverHandler(id HandlerID) PodLifeCycleHandler
}