百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

Kubernetes Informer 揭秘:资源监听的幕后魔法师

yuyutoo 2025-03-30 22:52 2 浏览 0 评论

一、什么是 Informer?

Informer 是 Kubernetes 客户端库(client-go)中的一种工具,用于简化与 Kubernetes API Server 的交互。它的核心作用是监听和缓存 Kubernetes 资源(如 Pod、Deployment、Service 等)的状态,帮助开发者高效地获取和处理这些资源的变化。

在 Kubernetes 中,所有资源的状态都存储在 API Server(背后是 etcd),客户端(比如控制器、调度器)需要频繁查询或监听这些资源。如果直接通过 REST API 调用,会导致性能问题(频繁请求、高延迟)。Informer 就像一个“智能助手”,通过缓存和事件机制,大幅提高效率。


二、Informer 的核心组件和工作机制

1.Informer 的架构

Informer 不是单独运行的组件,而是 client-go 提供的一套机制,主要由以下部分组成:

  • Reflector:负责从 API Server 监听资源变化,并更新本地缓存。
  • Delta FIFO:一个队列,存储资源的变化事件(新增、更新、删除)。
  • Indexer:本地缓存,基于键值对存储资源的最新状态。
  • Controller:协调 Reflector 和 Informer 的工作,处理事件并触发回调。
  • Callbacks(回调函数):用户定义的函数,当资源变化时被调用(比如 OnAdd、OnUpdate、OnDelete)。

这些组件一起形成了一个高效的事件驱动系统。

2.工作流程

以监听 Pod 资源为例,来说明 Informer 的机制:

  1. 初始化
    用户通过 client-go 创建一个 Informer(比如 NewSharedInformerFactory),指定要监听的资源类型(Pod)和命名空间。
    Informer 启动时,通过 List 请求从 API Server 获取所有 Pod 的初始状态,存入 Indexer(本地缓存)。
  2. 监听变化
    Reflector 通过 HTTP 长连接(Watch 机制)监听 API Server,获取 Pod 的实时变化。
    Watch 返回的是增量事件(Added、Modified、Deleted),每次变化会被放入 Delta FIFO 队列。
  3. 处理事件
    Controller 从 Delta FIFO 取出事件,更新 Indexer 中的缓存。
    根据事件类型,触发用户注册的回调函数:
    OnAdd:新 Pod 创建。
    OnUpdate:Pod 状态更新。
    OnDelete:Pod 被删除。
  4. 本地查询
    用户代码无需直接访问 API Server,可以通过 Informer 的 Lister 或 Indexer 从本地缓存查询资源状态。
  5. 同步与重试
    如果 Watch 连接断开,Reflector 会重新建立连接,并通过 ResourceVersion 确保不漏掉任何变化。
    Delta FIFO 支持重试机制,确保事件处理可靠。

三、Informer 的设计原理和实现细节

1.缓存与事件驱动

Informer 的核心优势在于“缓存 + 事件”:

  • 缓存:初始通过 List 获取全量数据,之后用 Watch 增量更新,减少对 API Server 的压力。
  • 事件驱动:不轮询,而是被动接收变化通知,实时性强且高效。

2.ResourceVersion

Kubernetes 用 ResourceVersion(资源的版本号)来追踪变化:

  • Informer 启动时记录当前的 ResourceVersion。
  • Watch 从这个版本号开始监听,确保不遗漏事件。
  • 如果缓存和 API Server 不同步(比如长时间断连),Informer 会重新全量同步。

3.SharedInformer

在实际使用中,通常用 SharedInformer,允许多个客户端共享同一个 Informer:

  • 减少重复的 Watch 连接,节省资源。
  • 多个控制器可以注册不同的回调,监听同一资源的不同逻辑。

4.Indexer 的作用

Indexer 是一个键值存储,默认用资源的 namespace/name 作为 key,支持自定义索引函数:

  • 比如按标签(label)索引 Pod,方便快速查询特定条件的资源。

四、实际例子

假设你写一个控制器,监听所有 Pod 的变化,用 Go 语言和 client-go 实现:

Bash
package main

import (
	"fmt"
	"time"
	"k8s.io/client-go/informers"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
)

func main() {
	// 加载 kubeconfig 文件(通常是 ~/.kube/config)
	config, err := clientcmd.BuildConfigFromFlags("", "/path/to/kubeconfig")
	if err != nil {
		panic(err)
	}

	// 创建 Kubernetes 客户端
	clientset, err := kubernetes.NewForConfig(config)
	if err != nil {
		panic(err)
	}

	// 创建 SharedInformerFactory,监听所有命名空间的 Pod
	factory := informers.NewSharedInformerFactory(clientset, time.Minute*30) // 每30分钟全量同步一次
	podInformer := factory.Core().V1().Pods().Informer()

	// 注册回调函数
	podInformer.AddEventHandler(&cache.ResourceEventHandlerFuncs{
		AddFunc: func(obj interface{}) {
			pod := obj.(*v1.Pod)
			fmt.Printf("Pod Added: %s/%s\n", pod.Namespace, pod.Name)
		},
		UpdateFunc: func(oldObj, newObj interface{}) {
			pod := newObj.(*v1.Pod)
			fmt.Printf("Pod Updated: %s/%s\n", pod.Namespace, pod.Name)
		},
		DeleteFunc: func(obj interface{}) {
			pod := obj.(*v1.Pod)
			fmt.Printf("Pod Deleted: %s/%s\n", pod.Namespace, pod.Name)
		},
	})

	// 启动 Informer
	stopCh := make(chan struct{})
	factory.Start(stopCh)
	factory.WaitForCacheSync(stopCh) // 等待缓存同步完成

	// 保持程序运行
	<-stopCh
}

运行这个代码后:

  • Informer 会先从 API Server 获取所有 Pod 的初始状态,存入缓存。
  • 然后通过 Watch 监听 Pod 的变化,触发对应的回调函数。
  • 你会在终端看到类似输出:
Bash
Pod Added: default/my-pod
Pod Updated: default/my-pod
Pod Deleted: default/my-pod

五、Informer 的优势

  1. 高效性:通过缓存和 Watch,避免频繁请求 API Server。
  2. 实时性:事件驱动,资源变化立刻通知。
  3. 共享性:SharedInformer 允许多个控制器复用,减少资源浪费。
  4. 可靠性:通过 ResourceVersion 和重试机制,保证数据一致性。

六、背后的挑战与优化

  1. 缓存一致性
    如果 Watch 断连时间过长,缓存可能落后,Informer 会重新全量同步。
    为避免同步风暴,可以调整 resyncPeriod(全量同步周期)。
  2. 性能开销
    大规模集群中,监听所有资源可能导致内存占用高。可以限制命名空间或用 Label Selector 过滤。
  3. 错误处理
    Delta FIFO 队列满时会丢弃老事件,需确保回调逻辑足够快。

七、总结

Informer 是 Kubernetes 控制器开发中的“得力助手”,通过缓存和事件机制,把复杂的 API Server 交互简化成了本地查询和回调。它就像一个“资源监听器”,默默帮你跟踪集群状态,让自定义控制器开发变得高效而优雅。

相关推荐

3种方式自动化控制APP(自动化控制方式有哪些)

自动化控制APP不管是在工作还是生活方面,都可以帮助我们高效地完成任务,节省时间和精力。本文主要介绍自动化控制APP的3种常用方式。1、Python+adb...

ADB 下载、安装及使用教程:让你更好地管理 Android 设备

简介作为一名测试工程师,我们经常需要在我们的Android设备上进行调试、管理或者定制。而Android调试桥(ADB)是Google官方提供的工具,可以帮助我们在计算机上与Androi...

手把手教你如何使用免费自动化工具——Appium(安卓版)

上次在上传了一篇Appium后,有人来问我有没有Andriod版的安装教程,这个当然有,抱着负责任的心,在上班摸鱼小半天之后,可算是把教程编辑好了准备环境JDKPython...

基于 Kotlin KMP 实现 HarmonyOS 与 Android 双平台 SDK 开发实践

背景随着鸿蒙平台的进一步发展,大家的态度也逐渐从观望转向实际投入,越来越多的公司开始考虑将自家应用迁移到鸿蒙平台。但是这一过程并非想象中的那么简单,尤其对于已经存在很多年的大型项目来说,直接投入大量人...

Android SDK——adb常见命令(android的adb)

1、adbdevices:检查设备2、adbinstallAPP安装包路径:安装APP3、adbuninstallAPP的程序包名(使用aapt可获取,也可问开发):卸载APP...

Android apk 打包流程(android怎么打包apk)

打包流程①打包资源文件,生成R.java文件打包资源的工具是aapt(TheAndroidAssetPackaingTool),位于android-sdk/platform-tools目录下。...

穿越时间·一步到位,教你完美安装Windows 11 Android 安卓子系统

一、适用于AndroidTM的Windows子系统...

Android 5.1 内置应用抢先用,附安装教程

其实在Google低调发布Android5.1更新之前,一些Android5.1的系统应用已提前泄露。虽然Android5.0与Android5.1在版本号上只相差0.1...

零基础入门Android-kotlin开发之开发工具的安装

Android与kotlinAndroid:美国谷歌公司开发的移动操作系统Kotlin:是一个用于现代多平台应用的静态编程语言,由JetBrains开发。2017年Google宣布Kotlin正式...

Xamarin.Android使用教程:简介和安装

简介目前,有超过1亿的Android设备被激活,因此大约有十亿人开发Android应用程序。那么接下来,小编将为大家介绍一系列的Xamarin.Android使用教程,希望能对大家的Android开发...

安卓APP开发中,如何使用加密芯片?

加密芯片是一种专门设计用于保护信息安全的硬件设备,它通过内置的加密算法对数据进行加密和解密,以防止敏感数据被窃取或篡改。如下图HD-RK3568-IOT工控板,搭载ATSHA204A加密芯片,常用于有...

第7篇:手机APP逆向之开发环境搭建(3)NDK安装与配置

第7篇:手机APP逆向之开发环境搭建(3)NDK安装与配置作为手机APP逆向开发环境要有以下几个部分。昨天讲了SDK安装与配置,今天,我们就要讲NDK环境配置。NDK的意思是Nativedevel...

手把手教零基础小白搭建APP的UI自动化环境

前言帮助零基础小白一步步搭建UI自动化环境,完成Python+Appium+模拟器/真机的UI自动化环境搭建。...

用Java开发Android App(用Java开发微信小程序)

使用Java开发AndroidApp主要依赖AndroidStudio,以下是详细步骤:1.安装开发环境...

nRF52832使用官方SDK开发入门教程

1.开发工具下载安装针对nRF52832的开发,首先需要下载安装对应工具,主要安装的工具有nRFgoStudio、Command-Line-Tools、IAR。IAR是编程者必须的工具,因此在这里...

取消回复欢迎 发表评论: