乐趣区

关于k8s:k8s-indexer

Indexer 笔记

Indexer 是 client-go 自带索引的本地对象存储

数据结构

type cache struct {
  // 并发平安存储
    cacheStorage ThreadSafeStore
  // 依据资源对象计算出 key 值
    keyFunc KeyFunc
}

type KeyFunc func(obj interface{}) (string, error)

type threadSafeMap struct {
    lock  sync.RWMutex
  // 存了 keyFunc => obj 的对应关系
    items map[string]interface{}

  // 自定义的 index 办法
    indexers Indexers
  // 索引器
    indices Indices
}

type Indexers map[string]IndexFunc
type Indices map[string]Index
type Index map[string]sets.String

demo

c := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{"custom": func(obj interface{}) ([]string, error) {pod := obj.(*corev1.Secret)
  return []string{pod.Name, "qwer"}, nil
}})
c.Add(&corev1.Secret{
  ObjectMeta: metav1.ObjectMeta{
    Name:      "secret1",
    Namespace: "duc",
  },
})
c.Add(&corev1.Secret{
  ObjectMeta: metav1.ObjectMeta{
    Name:      "secret2",
    Namespace: "duc",
  },
})
pp.Println(c)

type Indexer interface {
    Store
  
  // 返回 indexName 下的,和 obj.indexFunc 获取到的索引值雷同的所有对象
    Index(indexName string, obj interface{}) ([]interface{}, error)
    // 获取 indexName 下的 索引值为 indexedValue 汇合的所有 key
    IndexKeys(indexName, indexedValue string) ([]string, error)
    // 获取 indexName 下的所有 key 值
    ListIndexFuncValues(indexName string) []string
  // 搜寻 indices[indexName][indexedValue] 而后检索 items, 返回 []obj
    ByIndex(indexName, indexedValue string) ([]interface{}, error)
    // 返回 indexers
    GetIndexers() Indexers

    // AddIndexers adds more indexers to this store.  If you call this after you already have data
    // in the store, the results are undefined.
    AddIndexers(newIndexers Indexers) error
}
退出移动版