client-go系列之4---Indexer

[原文]

1. 写在前面

个人主页: https://gzh.readthedocs.io

关注容器技术、关注Kubernetes

问题或建议,请公众号(double12gzh)留言。

在本系列教程的第一篇中,我们已经对如下这张图作了简单介绍。这张图非常重要,理解这张图对我们正确理解client-goController非常有帮助(出处)。

client-go中对其实现的代码位于tools/cache,如下图:

除了上图中展示的Indexer的定义比较重要外,我们还需要关注Indexer比较重要的数据结构:

[root@xxxx-wsl /ACode/client-go] cat tools/cache/index.go| grep -B 1 -A 1 type

// IndexFunc knows how to compute the set of indexed values for an object.
type IndexFunc func(obj interface{
   }) ([]string, error)

--
// Index maps the indexed value to a set of keys in the store that match on that value
type Index map[string]sets.String

// Indexers maps a name to a IndexFunc
type Indexers map[string]IndexFunc

// Indices maps a name to an Index
type Indices map[string]Index
  • IndexFunc: 从接收的资源对象中,根据一系列的key来获取相应的值。
  • Index: 建立key与被索引值的对应关系并存储到Store中,即它里面的数据都是Key/Value的形式。
  • Indexers: 存储的是索引器的名字与索引器的实现函数。
  • Indices: 存储缓存数据,形式Key/Value,其中Key为缓存器的字,Value为缓存数据。

2. Custom Controller中的组件

如图中所示,Custom Controller是位于下半部分的内容。从图中可以很容易的看到,一个Custom Controller主要包含以下内容:

  • Indexer Reference
  • Informer Reference
  • Resource Event Handler
  • WorkQueue
  • ProcessItem

2.1 Indexer

2.1.1 简单介绍

它是一个知道如何使用CRD对象的 Indexer 实例的引用(reference)。当我们写自定义控制器(Custom Controller)代码时,将使用这个reference去做对象检索。

Indexer是client-go中实现的一个本地存储,它可以建立索引并存储Resource的对象。Reflector通过Delta FIFO Queue将资源对象存储到Indexer中。

需要注意的是,Indexer中的数据与etcd中的数据是完全一致的,这样client-go需要数据时,无须每次都从api-server获取,从而减少了请求过多造成对api-server的压力。

一句话总结:Indexer是用于存储+快速查找资源,即它的目的就是为了能够进行快速查找。

Indexer是如何实现“存储+快速查找资源”的呢?我们来看一下下面这张图,通过这张图方便我们理解一下Indexer的存储结构:

说明: 图中的IndexersIndices虽然都指向了相同的IndexFunc,这并不是说二者的数据是相同的,而是说二者使用的IndexFunc是相同的。

根据上面这个图,我们可以简单的规纳出与之对应的数据结构:

// 包含的所有索引器/分类以及对应的实现
Indexers: {
     
    "namespace": NamespaceIndexFunc,
    "nodeName": NodeNameIndexFunc,
}

// 包含的所有索引分类中所有的索引数据
Indices: {
   
    //namespace 这个索引分类下的所有索引数据
    "namespace": {
     
         // Index 就是一个索引键下所有的对象键列表
        "default": ["pod-1"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值