专注于大数据及容器云核心技术解密,可提供全栈的大数据+云原生平台咨询方案,请持续关注本套博客。QQ邮箱地址:1120746959@qq.com,如有任何学术交流,可随时联系。详情请关注《数据云技术社区》公众号。
1 Kubernetes 默认控制器架构
1.1 Reflector资源监控
- Reflector 类型定义在client-go cache 包中(tools/cache/reflector.go:47),它的作用是向 apiserver watch 特定的资源类型。
- Watch 的资源可以是 in-build 的资源也可以是 custom 的资源。
- 当 Reflector 通过 watch API 接收到存在新的资源对象实例的通知后,它使用相应的 list API 获取新创建的资源对象,然后 put 进 Delta Fifo 队列。
1.2 Informer 核心处理器(工具组合|对象检索|回调处理)
- 通过 Informer(实际我们用到的都不是单纯的 informer,而是组合了各种工具的 sharedInformerFactory) ,达到轻松 List/Get 某个资源对象。
- 监听资源对象的各种事件(比如创建和删除)然后触发回调函数,保证能够在各种事件发生的时候能够作出相应的逻辑处理。
- Informer 定义在 cache 包中的基础 controller(tools/cache/controller.go:75),保存这个对象用于后续检索处理,触发自定义控制器来处理这个对象。
- Base controller 提供了 NewIndexerInformer(tools/cache/controller.go:345) 函数来创建 Informer 和 Indexer. 在代码里我们可以直接调用这个函数或者使用工厂方法来创建 informer.
1.3 Indexer 检索管理
- indexer 提供的是 objects 之上的检索能力。Indexer 也定义在 cache 包中(tools/cache/index.go:27)。
- 典型的检索使用方式是基于一个对象的 labels 创建索引。Indexer 可以基于各种索引函数维护索引。
- Indexer 使用一个线程安全的 store 来存储对象和其对应的 key。
- 默认函数 MetaNamespaceKeyFunc(tools/cache/store.go:76) 可以生成对象的 key,类似 / 格式来关联对应的对象。
2 CRD自定义控制器扩展架构
2.1 Informer reference 定义CRD资源核心处理器
- 自定义控制器需要创建对应CRD资源的Informer。
- 自定义资源对象的 Informer 实例的引用
2.2 Indexer reference 定义CRD资源核心处理器
- 自定义控制器代码需要创建这个引用对象,然后用于检索资源对象用于后续的处理。
2.2 其他重要模块
- Resource Event Handlers: 这是一个回调函数,在 Informer 想要分发一个对象给控制器的时候会调用这个函数。典型的用法是写一个函数来获取分发过来的对象的 key,将 key 放入队列中等待进一步的处理。
- Work queue: 这个队列是在自己的控制器代码中创建的,用来解耦一个对象的分发和处理过程。Resource event handler 函数会被写成提取分发来的对象的 key,然后将这个 key 添加到 work queue 里面
- Process Item :在自己代码中实现的用来处理 work queue 中拿到的 items 的函数。这里可以有一个或多个函数来处理具体的过程,这个函数的典型用法是使用 Indexer 索引或者一个 Listing wrapper 来根据相应的 key 检索对象。
2.3 CRD总结
- 通过Kubernetes CRD官方提供的扩展,仅需要继承通用CRD架构生成框架,然后实现Work queue和Process Item的具体资源控制逻辑。
3 收尾
本文先基本流程架构讲起,后续将详细剖析Kubernetes CRD源码细节。
专注于大数据及容器云核心技术解密,可提供全栈的大数据+云原生平台咨询方案,请持续关注本套博客。QQ邮箱地址:1120746959@qq.com,如有任何学术交流,可随时联系。详情请关注《数据云技术社区》公众号。