首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Kubernetes Informer 机制源码解析

您好!Kubernetes Informer 机制是 Kubernetes 中的一个核心组件,用于实现资源对象的缓存和通知机制。在这里,我将为您详细介绍 Kubernetes Informer 机制的源码解析。

Kubernetes Informer 机制源码解析

Kubernetes Informer 机制的源码位于 Kubernetes 项目的 staging/src/k8s.io/client-go/informers 目录下。

源码结构

Kubernetes Informer 机制的源码主要包括以下几个部分:

  • factory.go:定义了 SharedInformerFactory 和 SharedIndexInformer 接口,以及它们的实现。
  • store.go:定义了 ThreadSafeStore 接口和它的实现。
  • controller.go:定义了 Controller 接口和它的实现。
  • lister.go:定义了 Lister 接口和它的实现。

源码解析

接下来,我将为您详细解析 Kubernetes Informer 机制的源码。

  1. SharedInformerFactory

SharedInformerFactory 是 Informer 的工厂类,用于创建 SharedIndexInformer 实例。它的定义如下:

代码语言:go
复制
type SharedInformerFactory interface {
	internalinterfaces.SharedInformerFactory
	ForResource(resource schema.GroupVersionResource) (GenericInformer, error)
	WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool

	Apps() appsv1.Interface
	Autoscaling() autoscalingv1.Interface
	Batch() batchv1.Interface
	...
}

SharedInformerFactory 接口继承自 internalinterfaces.SharedInformerFactory 接口,并定义了一些额外的方法。其中,ForResource() 方法用于通过 GroupVersionResource 来获取对应的 Informer 实例;WaitForCacheSync() 方法用于等待所有 Informer 的缓存同步完成。

  1. SharedIndexInformer

SharedIndexInformer 是 Informer 的核心实现类,用于监控 Kubernetes 中的资源对象,并将它们的状态存储在本地缓存中。它的定义如下:

代码语言:go
复制
type SharedIndexInformer interface {
	AddEventHandler(handler ResourceEventHandler)
	AddEventHandlerWithResyncPeriod(handler ResourceEventHandler, resyncPeriod time.Duration)
	GetStore() ThreadSafeStore
	GetController() Controller
	Run(stopCh <-chan struct{})
	HasSynced() bool
	LastSyncResourceVersion() string
}

SharedIndexInformer 接口继承自 Informer 接口,并定义了一些额外的方法。其中,AddEventHandler() 方法用于添加事件处理器,以便在资源对象发生变化时进行通知;GetStore() 方法用于获取本地缓存的存储实例;GetController() 方法用于获取 Controller 实例;Run() 方法用于启动 Informer。

  1. ThreadSafeStore

ThreadSafeStore 是一个线程安全的存储实现,用于存储 Kubernetes 中的资源对象。它的定义如下:

代码语言:go
复制
type ThreadSafeStore interface {
	Add(key string, obj interface{})
	Update(key string, obj interface{})
	Delete(key string)
	Get(key string) (item interface{}, exists bool)
	List() []interface{}
	ListKeys() []string
	Replace(map[string]interface{}, string)
}

ThreadSafeStore 接口定义了一些基本的存储操作,如添加、更新、删除、查询等。

  1. Controller

Controller 是一个控制器实现,用于监控 Kubernetes 中的资源对象,并将它们的状态存储在本地缓存中。它的定义如下:

代码语言:go
复制
type Controller interface {
	Run(stopCh <-chan struct{})
	HasSynced() bool
	LastSyncResourceVersion() string
}

Controller 接口定义了一些基本的控制器操作,如启动、判断是否同步完成等。

总结

Kubernetes Informer 机制是 Kubernetes 中的一个核心组件,用于实现资源对象的缓存和通知机制。通过阅读 Kubernetes Informer 机制的源码,我们可以更好地理解它的工作原理和实现方式,并在实际开发中更好地使用它。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 《一起读 kubernetes 源码》揭秘 k8s 关键机制 informer

    前言 在第二章我们会去看 k8s 中常用对象的源码,不过在看这些对象之前,我们需要聊一聊 informer 机制。这个机制可以说是 k8s 设计之中的一个重点了。...而在其中我第一次碰到了 informer。从了解了这个机制之后,才逐渐明白 k8s 本身是如何去控制里面的资源的。 还是一样的,本文不涉及具体这个机制的详细原理,更专注在源码本身。...的用法 下面的例子说明了 informer 的用法 https://github.com/kubernetes/community/blob/master/contributors/devel/sig-api-machinery...而 informer 就是后一种。 码前提问 informer 有那几个组件? informer 机制是怎么样的? 为什么需要 informer?...而在 k8s 中太多需要监控对象的地方了,如果无论是谁来都要写一遍监控的代码,并且还要处理各种事件的解析、队列、重试..太麻烦了,于是 k8s 将其抽象为 Informer机制

    16411

    KubernetesInformer 的使用

    这个接口虽然我们可以直接去使用,但是实际上并不建议这样使用,因为往往由于集群中的资源较多,我们需要自己在客户端去维护一套缓存,而这个维护成本也是非常大的,为此 client-go 也提供了自己的实现机制...Informers 的这些高级特性以及超强的鲁棒性,都足以让我们不去直接使用客户端的 Watch() 方法来处理自己的业务逻辑,而且在 Kubernetes 中也有很多地方都有使用到 Informers...示例 首先我们创建一个 Clientset 对象,然后使用 Clientset 来创建一个共享的 Informer 工厂,Informer 是通过 informer-gen 这个代码生成器工具自动生成的.../api/apps/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes...= nil { panic(err.Error()) } } // 创建 Clientset 对象 clientset, err := kubernetes.NewForConfig

    2K20

    Kubernetes Informer基本原理

    informer 包提供了如下的一些功能: 1、本地缓存(store) 2、索引机制(indexer) 3、Handler 注册功能(eventHandler) 1、informer 架构 整个 informer...机制架构如下图(图片源自 Client-go): 可以看到这张图分为上下两个部分,上半部分由 client-go 提供,下半部分则是需要自己实现的控制循环逻辑 本文主要分析上半部分的逻辑,包括下面几个组件...informer = newFunc(f.client, resyncPeriod) f.informers[informerType] = informer return informer }...本质其实就是一个通过 deltaFifo 建立生产消费机制,并且带有本地缓存和索引,以及可以注册回调事件的 apiServer 的客户端库。...5、参考 https://github.com/kubernetes/sample-controller/tree/master https://jimmysong.io/kubernetes-handbook

    37711

    【Dubbo源码】SPI机制源码解析

    文章目录 什么是SPI机制 SPI示例 Java SPI示例 Dubbo SPI 示例 Dubbo SPI机制源码分析 ExtensionLoader静态类和静态方法 new ExtensionLoader...扩展点自动包装 扩展点自动装配 扩展点自动激活 参考文章 什么是SPI机制 SPI 全称为 Service Provider Interface,是一种服务发现机制。...正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。SPI 机制在第三方框架中也有所应用,比如 Dubbo 就是通过 SPI 机制加载所有的组件。...如果大家想要学习 Dubbo 的源码,SPI 机制务必弄懂。接下来,我们先来了解一下 Java SPI 与 Dubbo SPI 的用法,然后再来分析 Dubbo SPI 的源码。...Dubbo SPI机制源码分析 SPI机制的实现类是ExtensionLoader;所以主要本篇文章主要分析这个类的源码; ExtensionLoader静态类和静态方法 如果你有留心dubbo使用

    1.5K50

    Kubernetes Controller 实现机制深度解析

    本文将解析 K8s Controller 的实现机制,并介绍如何编写一个 Controller。。...采用 Informer 库编写的 Controller 的架构如下图所示: Kubernetes Informer 架构2 图中间的虚线将图分为上下两部分,其中上半部分是 Informer 库中的组件...对应的源码: 使用 List 的结果刷新 FIFO 队列 将 Watch 收到的事件加入到 FIFO 队列 Informer 在一个循环中从 FIFO 队列中拿出资源对象进行处理。...对应源码:processLoop。 Informer 将从 FIFO 队列中拿出的资源对象放到 Indexer 中。对应的源码:processDeltas。...下面是采用 Informer 机制来创建 Controller 的例子。该示例代码来自于 Kubernetes Client Go Repository,为方便阅读去掉了部分非关键代码。

    2.3K21

    Kubernetes Pod 删除操作源码解析

    删除状态 我们可以根据 kubectl 操作后看到的状态来进行跟踪,上面的格式化结果是通过代码 https://github.com/kubernetes/kubernetes/blob/v1.22.8...代码位于 https://github.com/kubernetes/kubernetes/blob/v1.22.8/staging/src/k8s.io/apiserver/pkg/registry/...dispatchWork 方法会调用 UpdatePod 函数对 Pod 进行删除,代码位于 https://github.com/kubernetes/kubernetes/blob/v1.22.8/...最终都会调用 killPod 函数去执行删除 Pod: killPod 函数中会调用容器运行时去停止该 Pod 中的容器,代码位于https://github.com/kubernetes/kubernetes...状态管理器在与 apiserver 进行状态同步的时候会去调用该管理器下面的 syncPod 方法进行处理,代码位于 https://github.com/kubernetes/kubernetes/blob

    1.4K20

    datax源码解析-datax的hook机制解析

    datax的hook提供了一种机制,可以让开发者再任务执行完成后做一些定制化的事情,比如给任务的负责人发送一条短信提醒之类的。...对于每个子目录,必须符合ServiceLoader的标准目录格式 hook的目录结构看起来类似这个样子: 简单来讲,ServiceLoader实现了一种机制,可以动态加载指定目录的实现类并且实例化,它是...java SPI机制的重要组成部分。...Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制,提供了通过interface寻找implement的方法。...我们来总结下: datax提供了一种Hook机制,可以在执行完核心逻辑后触发一个开发者自己定义的逻辑。实现的原理是利用了java SPI机制,datax定义了一个Hook接口,开发者实现这个接口。

    1.5K11
    领券