前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >K8s源码分析(23)-indexer及index和indices组件

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

作者头像
TA码字
发布2022-10-30 13:24:39
4970
发布2022-10-30 13:24:39
举报
文章被收录于专栏:TA码字TA码字

上一篇文章里,我们主要介绍了 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 组件。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-07-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 TA码字 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档