版本:client-go: release-1.23
主要作用
- 与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