k8s怎么监听资源的变更

监听k8s所有的 Deployment 资源

package mainimport ("context""fmt"v1 "k8s.io/api/apps/v1""k8s.io/apimachinery/pkg/util/json""k8s.io/client-go/informers""k8s.io/client-go/kubernetes""k8s.io/client-go/tools/cache""k8s.io/client-go/tools/clientcmd""time"
)func main() {config, err := clientcmd.BuildConfigFromFlags("", "D:\\development\\goWorkSpace\\transport\\cmd\\deploy\\config")if err != nil {fmt.Println(err)return}client, err := kubernetes.NewForConfig(config)if err != nil {fmt.Println(err)return}# defaultResync 参数在 NewSharedInformerFactoryWithOptions 函数中是用来设定资源重新同步(resync)的默认时间间隔。在 Kubernetes 的客户端库 client-go 中,Informer 是一种用于高效监听和缓存 API 资源变化的组件。它通过定期与 Kubernetes API 服务器同步资源列表来确保本地缓存与集群状态保持一致,即使错过了某些事件通知。#重同步(Resync): 默认的重同步间隔定义了Informer多久强制与API服务器同步一次资源列表,即使在此期间没有观察到任何资源变化事件。这对于处理潜在的通知丢失、恢复因网络问题导致的不一致状态非常有用。简而言之,这是一种确保数据最终一致性的机制。#时间间隔(defaultResync): time.Duration 类型的 defaultResync 参数指定了这个默认的重同步周期。例如,如果你设置为 5 * time.Minute,则每五分钟Informer会自动请求API以获取最新的资源列表并与本地缓存对比,进行必要的更新#自定义重同步: 注意,在创建具体的 Informer 时,还可以针对每个资源类型覆盖这个默认的重同步间隔,这就是为什么在代码中还提供了 customResync 字典来存储特定资源类型的自定义重同步时间。#通过合理设置 defaultResync,可以在保持数据新鲜度与减少API服务器负载之间找到平衡。对于资源变化频繁且对实时性要求高的场景,可能需要较短的重同步间隔;而对于相对静态的资源,较长的间隔有助于减轻集群负担。# 当 defaultResync 设置为 0 时,这意味着不启用默认的自动重同步功能。换句话说,Informer 不会按照固定的时间间隔主动与 Kubernetes API 服务器同步资源列表,除非有明确的资源变动事件触发更新。# 下面这个意思是说 每隔10秒资源重新同步informerFactory := informers.NewSharedInformerFactory(client, time.Second*10)informer := informerFactory.Apps().V1().Deployments().Informer()informer.AddEventHandler(cache.ResourceEventHandlerFuncs{AddFunc: func(obj interface{}) {object := obj.(*v1.Deployment)marshal, _ := json.Marshal(object)fmt.Println("AddFunc", string(marshal))},UpdateFunc: func(old, new interface{}) {object := old.(*v1.Deployment)marshal, _ := json.Marshal(object)fmt.Println()fmt.Println("UpdateFunc", string(marshal))},DeleteFunc: func(obj interface{}) {fmt.Println("DeleteFunc")},})informer.Run(context.Background().Done())}

监听指定命名空间的 Deployment 资源

package mainimport ("context""encoding/json""fmt"v1 "k8s.io/api/apps/v1""k8s.io/client-go/informers""k8s.io/client-go/kubernetes""k8s.io/client-go/tools/cache""k8s.io/client-go/tools/clientcmd""time"
)func main() {config, _ := clientcmd.BuildConfigFromFlags("", "D:\\development\\goWorkSpace\\transport\\cmd\\deploy\\config")clientset, _ := kubernetes.NewForConfig(config)options := informers.NewSharedInformerFactoryWithOptions(clientset, time.Minute*1, informers.WithNamespace("default"))informer := options.Apps().V1().Deployments().Informer()informer.AddEventHandler(cache.ResourceEventHandlerFuncs{AddFunc: func(obj interface{}) {object := obj.(*v1.Deployment)marshal, _ := json.Marshal(object)fmt.Println("AddFunc", string(marshal))},UpdateFunc: func(old, new interface{}) {object := old.(*v1.Deployment)marshal, _ := json.Marshal(object)fmt.Println()fmt.Println("UpdateFunc", string(marshal))},DeleteFunc: func(obj interface{}) {object := obj.(*v1.Deployment)marshal, _ := json.Marshal(object)fmt.Println("DeleteFunc", string(marshal))},})informer.Run(context.Background().Done())
}
一开始运行时结果如下

image.png

删除资源

image.png
可以看到收到了删除的通知,也能看到收到 1分钟自动同步资源数据
image.png

新增资源

image.png
image.png
可以看到收到了 新增的通知,所以 defaultResync 并不会影响 实时的通知,可以得出如下结论:

结论

defaultResync 参数代表了Informer在没有其他配置干预的情况下,与Kubernetes API服务器进行资源列表全量同步的默认时间间隔。当你设置 defaultResync 为1分钟时,这意味着如果没有更具体的自定义同步策略或其他因素影响,Informer将会每1分钟主动请求API服务器来检查资源是否有变化,并更新其本地缓存。
然而,这并不直接意味着如果Kubernetes资源在这1分钟内发生变化,你的程序需要等待整整1分钟后才能收到通知。实际上,Informer的设计不仅仅是依赖于这个全量同步(resync)来获取更新,它还依赖于基于事件的机制来实现近乎实时的更新
当资源发生变化时(如创建、更新或删除),Kubernetes API服务器会通过Watch机制即时推送给监听该资源的Informer,这样你的程序几乎可以立即(网络延迟范围内)通过之前注册的事件处理器(如 AddFunc, UpdateFunc, DeleteFunc)收到这些变更通知。
总结来说,defaultResync 设置为1分钟意味着至少每分钟Informer会做一次全量检查以确保数据的最终一致性,但这不影响它通过实时事件机制在资源变化时迅速得到通知。所以,如果你的程序已经正确设置了事件处理器,资源变化后通常无需等待1分钟就能接收到变更信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/21888.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

本人自己Python安装和配置无套路分享

初学者是不是经常被python的各种问题困扰,教你轻松配置好这一切 如果你已经安装了python可以直接跳到你需要的内容 安装python 如果你是Linux系统可以直接使用包管理器安装包(对于linux系统管理员应该是轻车熟路了) Debian/Ubuntu系统: sudo apt update sudo ap…

【GD32】06 - SPI (含ST7735S TFT-LCD屏幕驱动)

这篇文章我们看看GD32中如何实现SPI,软件SPI的话可以参考我之前的文章,把对应操作GPIO口的代码从STM32改成GD32就可以使用了。 【快速上手STM32】SPI通信协议&&1.8寸TFT-LCD(ST7735S)_tftlcdst7735和stm32-CSDN博客文章浏…

攻防世界maze做法(迷宫题)

首先查壳64bit,直接丢进ida64中进行反编译就完事儿了,然后直接进入main函数打注释分析首先,题目已经提示了这是个迷宫题,我们抓住做迷宫题的两个要点,一找玩法,二找地图, 玩法在主函数中&#…

Linux防火墙入门——iptables、firewalld配置详解

合理的防火墙是你的计算机防止网络入侵的第一道屏障。你在家里上网,通常互联网服务提供会在路由中搭建一层防火墙。当你离开家时,那么你计算机上的那层防火墙就是仅有的一层,所以配置和控制好你 Linux 电脑上的防火墙很重要。 很多 Linux 发…

微信视频号上是怎么开店铺的?从入驻到发货,具体流程来了!

这两年,视频号逐渐走入大家视野 单价高,商家又少,很多类目都属于空白无商家入驻阶段,于是好多商家,都准备去视频号小店这个新“黑马”发展发展 那视频号是怎么开店卖东西的?今天我就来给大家分享一下&…

外汇天眼:总是权衡利弊,投资注定失败

投资股票的人往往会频繁地评估自己的投资结果,尤其是在信息时代,手机上随时可以查看股票行情,导致很多人时不时地打开行情软件,看一看自己的股票是涨了还是跌了,盈利了还是亏损了。 频繁评估结果的弊端 一、引发急躁…

导入和使用标准模块

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Python中,自带了很多实用的模块,称为标准模块(也可以称为标准库),对于标准模块&#xf…

每日一练——分糖果2

1103. 分糖果 II - 力扣(LeetCode) /*** Note: The returned array must be malloced, assume caller calls free().*/ int* distributeCandies(int candies, int num_people, int* returnSize) {int num 0;int* arr (int*)malloc(sizeof(int)*num_peo…

学习小心意——简单的循坏语句

for循坏 基本语法格式 for 变量 in 序列:代码块 示例代码如下 for i in range(10):print(i)#输出结果:0 1 2 3 4 5 6 7 8 9 简单案例代码如下 利用for语句遍历序列 # 遍历字符串打印每个字母 for letter in "python":print(letter)# 遍历列表并打印每个元素 a …

软件功能测试内容简析,第三方软件测试机构进行功能测试的好处

软件功能测试是指对软件产品的各项功能进行验证和确认的过程。它是软件开发过程中非常重要的一环,通过对软件的功能进行全面测试,可以确保软件在交付给用户之前达到预期的质量要求。 在进行功能测试时,需要包括以下几个方面的测试内容&#…

索尼CEO宣布全力推进AI电影制作,《蜘蛛侠》制片人坚称不用AI

原标题:索尼互娱制片人与CEO唱反调 易采游戏网6月3日消息:在最近的一次行业会议上,索尼影业高层首席执行官托尼文西奎拉向媒体透露,索尼正在全力推进人工智能(AI)技术的研发与应用,特别是在电影制作流程中。这一策略旨…

React@16.x(17)Portals

目录 1,使用2,事件冒泡 一句话总结:和 Vue3 的 Teleport 一个效果。 1,使用 import React, { PureComponent } from "react"; import ReactDOM from "react-dom";// 返回一个 React 元素(ReactNo…

如何快速的将Excel定义的表结构变成MySQL的建表语句

如何快速的将Excel定义的表结构变成MySQL的建表语句 最近需求有点多啊,做一个小需求就有一堆表结构,一个一个实行CV大法,实在太伤身体了,有没有能够快速便捷的方法将一大堆Excel表转换成MySQL的表结构建表语句呢,网上…

Kafka之Consumer原理

1. Kafka消息消费流程 kafka的消费流程,首先是producer生产消息经过处理后放入到Broker服务器中,然后进入到内存中,内存再进行刷盘到磁盘中,kafak提供了两种刷盘策略,同步刷盘(flush.message 一次IO刷盘多少消息)和异…

音频pop音的数学与物理解释

音频数据跳变太大的时候通常会有pop音,此时频谱上看pop音位置能量较高 音频中的“pop”音通常是由于信号的不连续性或瞬态变化造成的。这种不连续性的数学和物理原因可以从以下几个方面解释: 数学解释 信号不连续性 当音频信号发生突变时,…

jdk的组成和跨平台原理

为什么 1.笔试会用到 2. 方便理解程序的运行 java跨平台的原因: sun公司提供了各种平台可以使用的jvm,所以java将程序一次编译成字节码之后可以给各种平台运行。这也是java这么多年深受欢迎的原因

c++ lambda学习

一. 书写形式 [ capture clause ] (parameters) -> return-type { definition of method } [ 捕获 ] ( 参数列表 ) -> 返回类型 { 函数定义 } return-type返回值一般可以推导出来, 可以不用写, 所以可以简化为 [ capture clause ] (parameters) { definition of meth…

循环购模式!增加用户复购的不二之选!

大家好,我是吴军,来自一家专注于软件开发与商业模式设计的公司。我们主要业务是构建商城系统,并为各类企业提供全面的商业模式解决方案。目前,我们已经成功开发了超过200种独特的商业模式,帮助许多企业实现了他们的商业…

TCP协议的核心机制

TCP协议的核心机制 一:确认应答机制1.2:超时重传接收缓冲区 超时重传时间重置连接 一:确认应答机制 对于TCP协议来说,要解决的一个很重要的问题,就是可靠传输 可靠传输,不是指发送方能够100%的把数据发送给接收方,而是尽可能. 尤其是让发送方知道,接收方是否收到. 举个例子: …

详解:重庆耶非凡的选品师项目有哪些优势?

在竞争激烈的电商市场中,重庆耶非凡科技有限公司凭借其独特的选品师项目,成功地在众多企业中脱颖而出。这一项目不仅体现了公司对市场趋势的敏锐洞察力,更彰显了其专业的选品能力和对消费者需求的深刻理解。 首先,耶非凡的选品师项…