Indexer

Indexer是client-go提供的一种缓存机制,通过检索本地缓存而不是直接请求apiserver,可以大大降低apiserver的负载压力。

20240303202712

Indexer由Store接口与Index相关操作的接口函数组成。而它的实现是由cache来实现,cache主要是涉及两个类型:

  1. ThreadSafeStore
  2. KeyFunc

我们来看一下Indexer接口中的Add方法(也可以认为是Store接口中的方法)

1
2
3
4
5
6
7
8
9
// Add inserts an item into the cache.
func (c *cache) Add(obj interface{}) error {
	key, err := c.keyFunc(obj)
	if err != nil {
		return KeyError{obj, err}
	}
	c.cacheStorage.Add(key, obj)
	return nil
}

keyFunc方法可以获取资源的Key,然后调用cacheStorage.Add方法完成对应的增删改查过程。

1
type KeyFunc func(obj interface{}) (string, error)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
// DeletionHandlingMetaNamespaceKeyFunc checks for
// DeletedFinalStateUnknown objects before calling
// MetaNamespaceKeyFunc.
func DeletionHandlingMetaNamespaceKeyFunc(obj interface{}) (string, error) {
	if d, ok := obj.(DeletedFinalStateUnknown); ok {
		return d.Key, nil
	}
	return MetaNamespaceKeyFunc(obj)
}

func MetaNamespaceKeyFunc(obj interface{}) (string, error) {
	if key, ok := obj.(ExplicitKey); ok {
		return string(key), nil
	}
	objName, err := ObjectToName(obj)
	if err != nil {
		return "", err
	}
	return objName.String(), nil
}