k8s编程-Operator-Reflector

395 阅读2分钟

版本:client-go: release-1.23

主要作用

image.png

  • 与apiserver交互, 进行list and watch
  • 更新缓存

源码

版本:client-go: release-1.23

文件:tools/cache/reflector.go

// NewNamedReflector same as NewReflector, but with a specified name for logging
func NewNamedReflector(name string, lw ListerWatcher, expectedType interface{}, store Store, resyncPeriod time.Duration) *Reflector {
	realClock := &clock.RealClock{}
	r := &Reflector{
		name:          name,
		listerWatcher: lw,
		store:         store,
		// We used to make the call every 1sec (1 QPS), the goal here is to achieve ~98% traffic reduction when
		// API server is not healthy. With these parameters, backoff will stop at [30,60) sec interval which is
		// 0.22 QPS. If we don't backoff for 2min, assume API server is healthy and we reset the backoff.
		backoffManager:         wait.NewExponentialBackoffManager(800*time.Millisecond, 30*time.Second, 2*time.Minute, 2.0, 1.0, realClock),
		initConnBackoffManager: wait.NewExponentialBackoffManager(800*time.Millisecond, 30*time.Second, 2*time.Minute, 2.0, 1.0, realClock),
		resyncPeriod:           resyncPeriod,
		clock:                  realClock,
		watchErrorHandler:      WatchErrorHandler(DefaultWatchErrorHandler),
	}
	r.setExpectedType(expectedType)
	return r
}




list and watch

其中比较关键的为lw ListerWatcher

// ListerWatcher is any object that knows how to perform an initial list and start a watch on a resource.
type ListerWatcher interface {
	Lister
	Watcher
}

list-watch机制主要是用于监控数据变化情况,并将数据进行缓存,实现降低server压力的目标。

  • List: 资源对象的全量数据获取。
  • Watch: 指定资源数据获取。一般用于监控数据(集群的资源状态)的变化情况

Reflector的中方法ListAndWatch实现了lw的功能

watch的操作描述在watchHandler,主要包含对于操作的识别和相应的store操作

ResourceVersion

resourceVersion是一个用来定义集群资源状态的字段。每个 Kubernetes 对象都有一个 resourceVersion 字段,可用来向服务器发起 watch 请求。 服务器会返回所提供的 resourceVersion 之后发生的所有变更(创建、删除和更新)。 这使得客户端能够取回当前的状态并监视其变更,且不会错过任何变更事件。

这种根据resourceVersion判断集群状态的设计特性,称之为level Trigger,特点是考虑状态的最终一致性,非常适用于网络不可靠的环境中,尤其是集群管理中,可以大大减少同步错误和损耗的产生。与之对应的是Edge Trigger

Bookmarks

• 减少API Server负载 • 更新客户端保存的最近一次ResourceVersion