Indexer 概述
在 Kubernetes client-go 中,Indexer 是一个关键的本地存储组件。它的主要职责是建立索引并缓存 Resource 对象。通过维护与 ETCD 一致的数据副本,当需要获取资源时,可以直接从本地缓存读取,无需每次都请求 APIServer,从而有效降低了对 APIServer 和 ETCD 的压力。
数据流通常是从 DeltaFIFO 中 Pop 出来的资源对象交给 HandlerDeltas 处理,随后同步到 Indexer 中。以下是 HandleDeltas 方法的核心逻辑:
// k8s.io/client-go/tools/cache/shared_informer.go
func (s *sharedIndexInformer) HandleDeltas(obj interface{}) error {
s.blockDeltas.Lock()
defer s.blockDeltas.Unlock()
if deltas, ok := obj.(Deltas); ok {
return processDeltas(s, s.indexer, s.transform, deltas)
}
return errors.New("object given as Process argument is not Deltas")
}
// k8s.io/client-go/tools/cache/controller.go
func processDeltas(
handler ResourceEventHandler,
clientState Store,
transformer TransformFunc,
deltas Deltas) error {
// from oldest to newest
for _, d := range deltas {
obj := d.Object
if transformer != nil {
var err error
obj, err = transformer(obj)
if err != nil {
return err
}
}
switch d.Type {
case Sync, Replaced, Added, Updated:
if old, exists, err := clientState.Get(obj); err == nil && exists {
if err := clientState.Update(obj); err != nil {
return err
}
handler.OnUpdate(old, obj)
} {
err := clientState.Add(obj); err != {
err
}
handler.OnAdd(obj)
}
Deleted:
err := clientState.Delete(obj); err != {
err
}
handler.OnDelete(obj)
}
}
}

