当前位置: 首页 > news >正文

K8S学习指南(70)-K8S中的informa机制

引言

在 Kubernetes 集群中,Informer 是一种重要的机制,用于监控和处理集群中资源对象的变化。它是基于观察者模式设计的,允许开发者注册对某类资源对象的关注,并在对象发生变化时得到通知。本文将深入介绍 Kubernetes 中的 Informer 机制,包括其设计思想、工作原理、示例和最佳实践。

什么是 Informer?

Informer 是 Kubernetes 中用于监控和处理资源对象变化的框架。它建立在 Kubernetes 的客户端库 client-go 之上,提供了高级别的 API,简化了开发者对资源对象状态变化的监听和处理。

Informer 的核心思想是将对资源对象的监听和处理逻辑进行模块化,以便更容易地维护和扩展。通过 Informer,开发者可以注册关注的资源类型,并在资源状态发生变化时执行自定义的业务逻辑。

Informer 的工作原理

Informer 机制的核心工作原理主要包括以下几个步骤:

  1. List-Watch 机制: Informer 使用 Kubernetes API 的 List-Watch 机制来获取资源对象的初始列表,并通过 Watch 机制实时接收对象的变化事件。
  2. SharedInformerFactory: SharedInformerFactory 是 Informer 的工厂,负责创建和管理多个 SharedInformer。每个 SharedInformer 监听一种资源对象的变化。
  3. Event Handlers: 开发者可以注册事件处理器(Event Handlers),在资源对象发生变化时触发相应的处理逻辑。Event Handlers 是 Informer 的核心扩展点,用于实现自定义的业务逻辑。
  4. Delta FIFO Queue: 通过 Delta FIFO Queue,Informer 在收到资源对象的变化事件时,将事件推送到队列中。Event Handlers 从队列中取出事件进行处理。
  5. Resync: Informer 支持定期的全量同步(Resync)机制,以确保本地缓存与实际状态的一致性。定期地对资源对象进行全量同步,更新本地缓存。

如何使用 Informer

1. 创建 SharedInformerFactory

首先,创建一个 SharedInformerFactory 对象:

clientset, err := kubernetes.NewForConfig(config)
if err != nil {panic(err.Error())
}informerFactory := informers.NewSharedInformerFactory(clientset, time.Second*30)

2. 注册关注的资源类型

使用 SharedInformerFactory 注册对某一种资源类型的关注:

podInformer := informerFactory.Core().V1().Pods()

3. 注册 Event Handlers

注册事件处理器,定义在资源对象发生变化时的处理逻辑:

podInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{AddFunc: func(obj interface{}) {// 处理资源对象新增事件pod := obj.(*corev1.Pod)fmt.Printf("Pod added: %s\n", pod.Name)},UpdateFunc: func(oldObj, newObj interface{}) {// 处理资源对象更新事件oldPod := oldObj.(*corev1.Pod)newPod := newObj.(*corev1.Pod)fmt.Printf("Pod updated: %s\n", newPod.Name)},DeleteFunc: func(obj interface{}) {// 处理资源对象删除事件pod := obj.(*corev1.Pod)fmt.Printf("Pod deleted: %s\n", pod.Name)},
})

4. 启动 Informer

启动 SharedInformerFactory,开始监听资源对象的变化:

informerFactory.Start(stopCh)

5. 处理资源对象变化事件

在 Event Handlers 中定义的逻辑将在资源对象发生变化时被触发:

<-stopCh

通过以上步骤,就可以使用 Informer 监听和处理 Kubernetes 集群中资源对象的变化。

示例:使用 Informer 监听 Pod 变化

下面是一个简单的示例,演示如何使用 Informer 监听 Pod 对象的变化:

package mainimport ("context""flag""fmt""os""os/signal""time""k8s.io/client-go/kubernetes""k8s.io/client-go/tools/cache""k8s.io/client-go/tools/clientcmd""k8s.io/client-go/util/homedir""k8s.io/client-go/util/wait"
)func main() {var kubeconfig *stringif home := homedir.HomeDir(); home != "" {kubeconfig = flag.String("kubeconfig", home+"/.kube/config", "kubeconfig file")} else {kubeconfig = flag.String("kubeconfig", "", "kubeconfig file")}config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)if err != nil {panic(err.Error())}clientset, err := kubernetes.NewForConfig(config)if err != nil {panic(err.Error())}stopCh := make(chan struct{})defer close(stopCh)informerFactory := cache.NewSharedInformerFactory(clientset, time.Second*30)podInformer := informerFactory.Core().V1().Pods()podInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{AddFunc: func(obj interface{}) {pod := obj.(*corev1.Pod)fmt.Printf("Pod added: %s\n", pod.Name)},UpdateFunc: func(oldObj, newObj interface{}) {oldPod := oldObj.(*corev1.Pod)newPod := newObj.(*corev1.Pod)fmt.Printf("Pod updated: %s\n", newPod.Name)},DeleteFunc: func(obj interface{}) {pod := obj.(*corev1.Pod)fmt.Printf("Pod deleted: %s\n", pod.Name)},})go informerFactory.Start(stopCh)if !cache.WaitForCacheSync(stopCh, podInformer.Informer().HasSynced) {fmt.Println("Timed out waiting for caches to sync")return}fmt.Println("Informer started. Waiting for Pod events...")c := make(chan os.Signal, 1)signal.Notify(c, os.Interrupt)<-cfmt.Println("Received interrupt signal. Stopping Informer...")
}

结语

Informer 机制是 Kubernetes 中强大且灵活的一部分,为开发者提供了便捷的方式监听和处理集群中资源对象的变化。通过 SharedInformerFactory 的注册和 Event Handlers 的定义,可以轻松实现对特定资源类型的关注和处理逻辑。Informer 的应用范围广泛,涉及到许多领域,包括控制器开发、自动伸缩、日志收集等。希望本文的详细介绍和示例能够帮助你更好地理解和应用 Kubernetes 中的 Informer 机制。

相关文章:

K8S学习指南(70)-K8S中的informa机制

引言 在 Kubernetes 集群中&#xff0c;Informer 是一种重要的机制&#xff0c;用于监控和处理集群中资源对象的变化。它是基于观察者模式设计的&#xff0c;允许开发者注册对某类资源对象的关注&#xff0c;并在对象发生变化时得到通知。本文将深入介绍 Kubernetes 中的 Info…...

「MCU」SD NAND芯片之国产新选择优秀

文章目录 前言 传统SD卡和可贴片SD卡 传统SD卡 可贴片SD卡 实际使用 总结 前言 随着目前时代的快速发展&#xff0c;即使是使用MCU的项目上也经常有大数据存储的需求。可以看到经常有小伙伴这样提问&#xff1a; 大家好&#xff0c;请问有没有SD卡芯片&#xff0c;可以…...

【QML COOK】- 002-添加一个图片

1. 编辑main.qml import QtQuickWindow {width: 800height: 800visible: truetitle: qsTr("Hello World")Image {anchors.fill: parentsource: "qrc:/Resources/Images/arrow.png"} }将Window的width和height都改成800&#xff0c;因为我们要添加的图片大…...

Java10:内部类

7 内部类&#xff08;了解&#xff09;7.1 成员内部类7.2 静态内部类7.3 局部内部类7.4 匿名内部类 2.3. 静态内部类2.4. Lambda表达式&#xff0c; 7 内部类&#xff08;了解&#xff09; 内部类&#xff1a;就是在一个类的内部再定义一个类。 分类&#xff1a; 成员内部类 静…...

PostgreSQL 支持的字段类型

PostgreSQL 支持多种字段类型&#xff0c;以下是 PostgreSQL 13 版本中支持的所有字段类型&#xff1a; 数值类型&#xff1a; smallint&#xff1a;小整数类型。integer&#xff1a;整数类型。bigint&#xff1a;大整数类型。decimal&#xff1a;精确小数类型。numeric&#x…...

npm报错error:03000086:digital envelope routines::initialization error

可能是因为node版本过高&#xff0c;与现在的项目不符合 这是降低node版本的命令&#xff0c;然后重新运行 npm install npm8.1.2 -g...

el-table 展开行表格,展开的内容高度可以变化时,导致的固定列错位的问题

问题描述 一个可展开的表格&#xff08;列设置了type“expand”&#xff09;&#xff0c;并且展开后的内容高度可以变化&#xff0c;会导致后面所有行的固定列错位&#xff0c;图如下&#xff0c;展示行中是一个树形表格&#xff0c;默认不展示子级&#xff0c;点击树形表格的…...

python插入排序

插入排序&#xff08;Insertion Sort&#xff09;是一种简单直观的排序算法。它的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。插入排序在实现上&#xff0c;通常使用in-place排序&#xff0…...

怎么将营业执照图片转为excel表格?(批量合并识别技巧)

一、为何要将营业执照转为excel表格&#xff1f; 1、方便管理&#xff1a;将营业执照转为excel格式&#xff0c;可以方便地进行管理和整理&#xff0c;快速查找需要的信息。 2、数据处理&#xff1a;Excel可以提供丰富的计算和数据分析功能&#xff0c;转化为excel后方便数据…...

关于java数组Arrays类

关于java数组Arrays类 前面的文章中&#xff0c;我们了解了数组创建方法等&#xff0c;我们本篇文章来了解一下数组的方法类Arrays&#xff0c;有了这个类&#xff0c;我们在日常写代码的时候就不不用自己去手动创建方法了&#x1f600;。 Arrays类 数组的工具类java.util.A…...

LeetCode-58/709

1.最后一个单词的长度&#xff08;58&#xff09; 题目描述&#xff1a; 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 思路&…...

linux 流量监控

linux 流量监控 Linux 网络流量监控利器 iftop命令详解及实战 https://blog.csdn.net/qq_50247813/article/details/134164093 iftop命令详解 https://www.cnblogs.com/gaoyuechen/p/17300017.html 1 ubuntu如何查看流量监控 Ubuntu是一种非常流行的Linux发行版&#xff0c…...

AUTOSAR从入门到精通-漫谈autosar软件架构(八)

目录 前言 原理 AUTOSAR的方法论 AUTOSAR架构的优点 AUTOSAR 软件架构 1.应用层...

C#设计模式之单例模式

介绍 单例模式&#xff08;Singleton&#xff09;保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。 单例模式的结构图如下所示&#xff1a; 使用单例模式的原因 对一些类来说&#xff0c;只有一个实例是很重要的。如何才能保证一个类只有一个实例并且这个…...

【源码预备】Calcite基础知识与概念:关系代数概念、查询优化、sql关键字执行顺序以及calcite基础概念

文章目录 一. 关系代数的基本知识二. 查询优化三. SQL语句的解析顺序1. FROM2. WHERE3. GROUP BY4. HAVING5. SELECT 四. Apache Calcite中的基本概念1. Adapter2. Calcite中的关系表达式2.1. 关系表达式例子2.2. 源码底层结构 3. Calcite的优化规则4. Calcite的Trait--算子物理…...

【Java 设计模式】23 种设计模式

文章目录 设计模式是什么计算机行业里的设计模式创建型模式&#xff08;共 5 种&#xff09;结构型模式&#xff08;共 7 种&#xff09;行为型模式&#xff08;共 11 种&#xff09; 总结 设计模式是什么 “每一个模式描述了一个在我们周围不断重复发生的问题&#xff0c;以及…...

ElasticSearch深度分页解决方案

一、前言 ElasticSearch是一个基于Lucene的搜索引擎&#xff0c;它支持复杂的全文搜索和实时数据分析。在实际应用中&#xff0c;我们经常需要对大量数据进行分页查询&#xff0c;但是传统的分页方式在处理大量数据时会遇到性能瓶颈。本文将介绍ElasticSearch分页工作原理、深…...

nginx下upstream模块详解

目录 一&#xff1a;介绍 二&#xff1a;特性介绍 一&#xff1a;介绍 Nginx的upstream模块用于定义后端服务器组&#xff0c;以及与这些服务器进行通信的方式。它是Nginx负载均衡功能的核心部分&#xff0c;允许将请求转发到多个后端服务器&#xff0c;并平衡负载。 在upst…...

基于ssm的双减后初小教育课外学习生活活动平台的设计与实现论文

双减后初小教育课外学习生活活动平台的设计与实现 摘 要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。以前学校对于课外学习活动信息的管理和控制&#xff0c;采用人工登记的方式保存相关…...

wblogic中间件配置数据源

配置数据源 1.服务-数据源-配置-新建 2.单机选一般数据源 3.选择源名称、jndi名称、数据库类型 4.选择驱动 5.下一步 6.输入连接串信息 参考&#xff1a; 格式二&#xff1a;jdbc:oracle:thin:<host>:<port>:<SID> 数据库名称配置的sid 7.测试配置&#xff…...

Java数据结构之装箱拆箱

装箱和拆箱 也叫装包拆包&#xff0c;装包是把那八种基本数据类型转换为它的包装类&#xff0c;拆包则相反 上面这俩种方式都是装包&#xff0c;下面是它的字节码文件 用到了Integer的ValueOf方法&#xff1a; 就是返回了一个Integer类的对象&#xff0c;把它的value属性设置成…...

各版本 操作系统 对 .NET Framework 与 .NET Core 支持

有两种类型的受支持版本&#xff1a;长期支持 (LTS) 版本和标准期限支持 (STS) 版本。 所有版本的质量都是一样的。 唯一的区别是支持的时间长短。 LTS 版本可获得为期三年的免费支持和补丁。 STS 版本可获得 18 个月的免费支持和修补程序。 有关详细信息&#xff0c;请参阅 .N…...

Golang 线程安全与 sync.Map

前言 线程安全通常是指在并发环境下&#xff0c;共享资源的访问被适当地管理&#xff0c;以防止竞争条件&#xff08;race conditions&#xff09;导致的数据不一致 Go语言中的线程安全可以通过多种方式实现 实现方式 互斥锁&#xff08;Mutexes&#xff09; Go的sync包提供…...

1.2 Hadoop概述

小肥柴的Hadoop之旅 1.2 Hadoop概述 目录1.2 Hadoop概述1.2.1 回归问题1.2.2 Google的三篇论文1.2.3 Hadoop的诞生过程1.2.4 Hadoop特点简介 参考文献和资料 ) 目录 1.2 Hadoop概述 1.2.1 回归问题 通过前一篇帖子的介绍&#xff0c;特别是问题思考部分的说明&#xff0c;我…...

Adams许可管理安全控制策略

随着全球信息化的快速发展&#xff0c;信息安全和许可管理问题日益凸显。在这场无形的挑战中&#xff0c;Adams许可管理安全控制策略以其卓越的性能和可靠性&#xff0c;引领着解决这类问题的新潮流。 Adams许可管理安全控制策略是一种全方位、多层次的安全控制方案&#xff0…...

无人地磅系统|内蒙古中兴首创无人地磅和远程高效管理的突破

走进标杆企业&#xff0c;感受名企力量&#xff0c;探寻学习优秀企业领先之道。 本期要跟砼行们推介的标杆企业是内蒙古赤峰市砼行业的龙头企业&#xff1a;赤峰中兴首创混凝土搅拌有限责任公司&#xff08;以下简称为中兴首创&#xff09;。 中兴首创成立于2011年初&#xff…...

【SpringCloud】7、Spring Cloud Gateway限流配置

1、限流介绍 Spring Cloud Gateway 的限流配置主要涉及到令牌桶算法的实现。令牌桶算法可以对某一时间窗口内的请求数进行限制,保持系统的可用性和稳定性,防止因流量暴增而导致的系统运行缓慢或宕机。 在 Spring Cloud Gateway 中,官方提供了 RequestRateLimiterGatewayFi…...

【gRPC学习】使用go学习gRPC

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 RPC是远程调用,而google实现了grpc比较方便地实现了远程调用,gRPC是一个现代的开源远程过程调用(RPC)框架 概念介绍 在gRPC中&#xff0c;客户端应用程序可以直接调用另一台计算机上的服务器应用程序上的方法&#…...

C语言中常用的字符串函数(strlen、sizeof、sscanf、sprintf、strcpy)

C语言中常用的字符串函数 文章目录 C语言中常用的字符串函数1 strlen函数2 sizeof函数2.1 sizeof介绍2.2 sizeof用法 3 sscanf函数3.1 sscanf介绍3.2 sscanf用法3.3 sscanf高级用法 4 sprintf函数4.1 背景4.2 sprintf用法 5 strcpy函数5.1 strcpy介绍5.1 strcpy用法 1 strlen函…...

域名解析服务器:连接你与互联网的桥梁

域名解析服务器&#xff1a;连接你与互联网的桥梁 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我们将探讨一个网络世界中至关重要却鲜为人知的角…...

网站建设推广销售人员/爱站站长工具

1. 人远比技术重要 你开发软件是为了供别人使用&#xff0c;没有人使用的软件只是没有意义的数据的集合而已。许多在软件方面很有成就的行家在他们事业的初期却表现平平&#xff0c;因为他们那时侯将主要精力都集中在技术上。显然&#xff0c;构件&#xff08;components&…...

个人网站备案注销/百度竞价代理公司

先来查看下效果 1.beautyOfCode 是什么&#xff1f; SyntaxHighlighter 是一个非常流行的代码高亮方案&#xff0c;世界上最流行的开源博客程序 WordPress 官方&#xff0c;以及众多基于 WordPress 搭建的第三方博客或网站都在使用。而 beautyOfCode 是基于 SyntaxHighlighter …...

自动做网页的网站/刷网站软件

本人是做ASP.Net开发的&#xff0c;学习Flex的时间不长&#xff0c;这里我介绍下我所学到的DataGrid的一些常用的用法,如果讲得不够全面请各位多多指点&#xff01; 我们先来了解下Flex里面DataGrid是个什么样的控件&#xff0c;学过ASP.Net的应该多用过微软的服务器控件里面的…...

怎样手机网站建设/搜索热词排行榜

最近学习es&#xff0c;先是在图书馆借了几本书&#xff0c;但是发现与es现在的版本相差太远了&#xff0c;所以就选择直接在网上看The Definitive Guide&#xff0c;感觉这本书讲得倒还挺好&#xff0c;不过在看到这个地方的时候&#xff0c;按照书上的代码总是出现错误&#…...

网站建设的书 推荐/智慧软文网站

0x00 前提条件 权限&#xff1a; 必须是ROOT secure_file_priv的限制 可以使用 mysql命令查询 show variables like %secure%’; secure_file_priv的值为null &#xff0c;表示限制mysqld 不允许导入|导出 secure_file_priv的值为/tmp/ &#xff0c;表示限制mysqld 的导入|导出…...

做设计的靠谱兼职网站有哪些/网站怎么制作教程

【背景介绍】 SSH中另一个重要的角色是Hibernate。它是用来把程序的Dao层和数据库打交道用的&#xff0c;它封装了JDBC的步骤&#xff0c;是我们对数据库的操作更加简单&#xff0c;更加快捷。利用Hibernate框架我们就可以不再编写重复的JDBC代码&#xff0c;不再反复的…...