当前位置: 首页 > 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…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

适应性Java用于现代 API:REST、GraphQL 和事件驱动

在快速发展的软件开发领域&#xff0c;REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名&#xff0c;不断适应这些现代范式的需求。随着不断发展的生态系统&#xff0c;Java 在现代 API 方…...