上一篇文章里,我们主要介绍了 kubernetes 世界中的 clientset 对象,它的主要作用是用来获取所有资源操作对象的工厂,所以从本质上来说,clientset 就是资源操作对象工厂的工厂。本篇文章里我们主要来介绍和在 client go 组件中和索引相关的一系列对象,其中包括了 indexer,index,以及 indices。
IndexFunc 和 Indexer 对象
对于 IndexFunc 对象和 Indexer 对象, 其图解以及相关源码如下:
代码语言:javascript复制//staging/src/k8s.io/client-go/tools/cache/index.go
type IndexFunc func(obj interface{}) ([]string, error)
type Indexers map[string]IndexFunc
- 对于 IndexFunc 来说其本质上是一个函数,输入是一个 kubernetes 资源对象,例如我们常见的 deployment/service 等等,输出是一个字符数组,代表这个对象的索引值。所以就本质上来讲,IndexFunc 就是计算 kubernetes 资源对象索引值的函数。
- 对于 Indexers 来说是一个 map对象,key 为字符类型,value 为 IndexFunc 类型。其本质上来讲,是命名的索引函数,当然给资源对象计算索引值的时候可以有不同维度。例如以 namespace 为维度来给资源计算索引,那么在 Indexers 中就会有一个 key 为 "namespace",value 为的 IndexFunc 来实现获取资源的命名空间逻辑。
Index 对象
对于 Index 其图解和相关源码如下:
代码语言:javascript复制//staging/src/k8s.io/client-go/tools/cache/index.go
type Index map[string]sets.String
- 对于 Index 来说是一个 map 对象,key 为字符类型,value 为 set 类型。其本质上来讲,是存储索引值和相关对象 id 集合的影射关系。例如以 namespace 为维度计算资源对象的索引,对于 default namesapce 来说有 deployment 对象 id 为 d-A,有 service 对象 id 为 d-S。那么在 Index 对象中一定存在有一个 key 为 "default",value 为 {d-A, d-S} 的 set。
- 就本质上来说,Index 就是资源对象作为某一个维度的索引值和相关对象 id 集合的对应关系。
Indices 对象
对于 Indices 其图解和相关源码如下:
代码语言:javascript复制//staging/src/k8s.io/client-go/tools/cache/index.go
type Indices map[string]Index
- 对于 Indices 来说是一个 map 对象,key 为字符类型,value 为 Index 类型。其本质上来讲,就是命名的 Index 。例如以 namespace 为维度计算资源对象的索引,对于 default namesapce 来说有 Index 对象 Index-A。那么在 Indices 对象中一定存在有一个 key 为 "namespace",value 为 Index-A 的映射关系。
- 所以就本质上来讲,Indices 对象就是命名索引 Index。
资源对象建立索引并存储的过程
对于 kubernetes 资源对象来说,其建立索引并存储的过程如下:
- 对于资源的索引来说一定是在某个维度上为其建立,例如以 namesapce 为维度建立索引,那么我们可以把 “namesapce" 这个字符对应上图的 key_1。
- 首先以 "namespace" 为键,我们在 Indices 对象中找到相应的 Index 对象,即找到以资源的 namespace 作为维度的索引存储对象 index_one。
- 然后同样还是以 "namespace" 作为键,在 Indexers 对象中找到相应的 IndexFun 对象, 即找到以资源的 namespace 作为维度的索引值计算函数 index_function_one。
- 对于某个资源对象,用上面的 IndexFun 函数计算其索引值为 index_value_1。
- 以资源对象的索引值 index_value_1 作为键,在上面的索引 index_one 中来找到对应的 set 集合。
- 对于该对象其唯一标识符为 object_key,把这个 object_key 加入到在上面步骤中找到的集合对象 set 中。
目前我们先写到这里,在下一篇文章中我们继续介绍 ThreadSafeStore 组件。