Pod Lifecycle Event Generator pleg的2种实现

222 阅读1分钟

概述

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
}