K8s源码分析(23)-indexer及index和indices组件

上一篇文章里,我们主要介绍了 kubernetes 世界中的 clientset 对象,它的主要作用是用来获取所有资源操作对象的工厂,所以从本质上来说,clientset 就是资源操作对象工厂的工厂。本篇文章里我们主要来介绍和在 client go 组件中和索引相关的一系列对象,其中包括了 indexer,index,以及 indices。

IndexFunc 和 Indexer 对象

对于 IndexFunc 对象和 Indexer 对象, 其图解以及相关源码如下:

4fb59f3806253a2ee93a12d73fe18963.png

//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 其图解和相关源码如下:

2f822ffa0dfdfe4fd2ecd8cc9c431df3.png

//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 其图解和相关源码如下:

536259e895b4db3cc33464877be60053.png

//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 资源对象来说,其建立索引并存储的过程如下:

e69d45b0fbb838cf7113fbdffe952c6e.png

  • 对于资源的索引来说一定是在某个维度上为其建立,例如以 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 组件。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值