k8s怎么监听资源的变更

监听k8s所有的 Deployment 资源

package main

import (
	"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 main

import (
	"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分钟就能接收到变更信息。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux,lseek,append用法

打开写的.c文件 内容为 代码 <sys/stat.h> #include <fcntl.h> #include<stdio.h> #include<unistd.h> #include<string.h>//off_t lseek(int fd, off_t offset, int whence); //int open(const char *pathname, int flags); //int open(const …

一个AI板卡电脑--香橙派 AIpro

本文算是一个开箱测评&#xff0c;主要评估它和一个电脑的距离。 香橙派官网&#xff1a;香橙派(Orange Pi)-Orange Pi官网-香橙派开发板,开源硬件,开源软件,开源芯片,电脑键盘香橙派&#xff08;Orange Pi&#xff09;是深圳市迅龙软件有限公司旗下开源产品品牌;香橙派&#x…

【触想智能】工业平板电脑在高铁上的应用分析

随着科技的快速发展&#xff0c;平板电脑作为一种新型的电子设备&#xff0c;已经逐渐成为人们日常生活中的必需品。而工业平板电脑则是一种更为专业的平板电脑&#xff0c;可以应用于各种工业领域&#xff0c;如交通、制造业、医疗、金融、人工智能等。 今天&#xff0c;小编为…

Oracle Hint /*+APPEND*/插入性能总结

oracle append用法 Oracle中的APPEND用法主要用于提高数据插入的效率。 基本用法&#xff1a;在使用了APPEND选项后&#xff0c;插入数据会直接加到表的最后面&#xff0c;而不会在表的空闲块中插入数据。这种做法不需要寻找freelist中的free block&#xff0c;从而避免了在…

推荐一个图片识别的llama3微调版本 清华面壁项目

水一篇&#xff1a; MiniCPM-V是面向图文理解的端侧多模态大模型系列。该系列模型接受图像和文本输入&#xff0c;并提供高质量的文本输出。自2024年2月以来&#xff0c;我们共发布了4个版本模型&#xff0c;旨在实现领先的性能和高效的部署&#xff0c;目前该系列最值得关注的…

36【Aseprite 作图】蒸笼盖——拆解

1 蒸笼盖框架 里圈和外圈的形状都是一样的 扶手处&#xff0c;2 1 2 2 2&#xff08;最好都是2&#xff0c;拐角处用1&#xff09; 2 上色 中间的波浪&#xff0c;是2 2 2 上&#xff08;再 2 2 2 下&#xff09; 下方阴影&#xff0c;左边的阴影&#xff0c;右边的阴影颜色…

【Elasticsearch】es基础入门-02.RestClient操作索引库

RestClient操作索引库 示例&#xff1a; 一.分析数据结构&#xff0c;写索引库 #酒店的mapper PUT /hotel {"mappings": {"properties": {"id":{"type": "keyword"},"name":{"type": "text",…

p5开发helloworld

注意&#xff0c;执行的时候&#xff0c;后面不用带class的后缀

速递FineWeb:一个拥有无限潜力的15T Tokens的开源数据集

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…

SuperMap GIS基础产品FAQ集锦(20240603)

一、SuperMap iDesktopX 问题1&#xff1a;请教一下&#xff0c;桌面把火星坐标系的数据投影转换为4326坐标系数据如何才能没有偏移呢&#xff1f; 11.1.1 【解决办法】可以使用iDesktopX提供的“电子地图坐标转换”插件实现对火星坐标系数据的纠偏。 问题2&#xff1a;请教…

基于鲲鹏服务器搭建简单的开源论坛系统(LAMP)实践分享

LAMPLinux apache mysql( mariadb) PHP 结合利用华为云弹性负载均衡ELB弹性伸缩AS服务 优点&#xff1a; 将访问流量自动分发到多台云服务器&#xff0c;扩展应用系统对外的服务能力&#xff0c;实现更高水平的应用容错&#xff1b; 根据不同的业务、访问需求和预设策略&…

Kafka之Consumer原理

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

PTA字符串删除

已知del_str为字符串str中要删除的子串&#xff0c;请结合所学字符串操作实现在str中删除所有del_str子串&#xff0c;并统计del_str在str中出现的次数。 输入格式: 123dufvdfv123dfljvb 123 输出格式: dufvdfvdfljvb #include<stdio.h> #include<string.h> in…

SSM物流管理系统的设计与实现-计算机毕业设计源码44323

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作…

Java编程常见问题汇总一

系列文章目录 文章目录 系列文章目录前言一、字符串连接误用二、错误的使用StringBuffer三、测试字符串相等性四、数字转换成字符串五、利用不可变对象(Immutable) 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分…

企业数字化转型的测度难题:基于大语言模型的新方法与新发现

《经济研究》新文章《企业数字化转型的测度难题&#xff1a;基于大语言模型的新方法与新发现》运用机器学习和大语言模型构造一套新的企业数字化转型指标。理论分析和数据交叉验证均表明&#xff0c;构建的指标相对已有方法更准确&#xff1a; 1.第一步&#xff1a;选择“管理…

45.自定义线程池(三)-拒绝策略

拒绝策略采用函数式接口参数传入&#xff0c;策略模式 FunctionalInterface public interface RejectPolicy<T> {void reject(BlockingQueue<T> queue, T task); } package com.xkj.thread.pool;import com.aspose.words.Run; import lombok.extern.slf4j.Slf4j;…

拒绝服务攻击

文章目录 拒绝服务攻击概述拒绝服务攻击简介分布式拒绝服务攻击DDoS与DoS的关系拒绝服务攻击分类 剧毒包型拒绝服务攻击WinNuke攻击泪滴(Teardrop) 攻击Land 攻击Ping of death攻击循环攻击 风暴型拒绝服务攻击风暴型DoS攻击风暴型攻击用的分组直接风暴型DDoSPING风暴攻击(直接…

03_03_初识SpringAOP和应用

一、SpringAOP的初识与原理 1、概述 AOP&#xff1a;面向切面编程OOP&#xff1a;面向对象编程面相切面编程&#xff1a;是基于OOP基础之上的新编程思想&#xff0c;OOP面向的主要是对象是类&#xff0c;而AOP面向的主要对象是切面&#xff0c;它在处理日志、安全管理、事务管…

第二十六章CSS3续~

3.CSS3渐变属性 CSS3渐变(gradients)可以在两个或多个指定的颜色之间显示平稳的过渡。 以前&#xff0c;我们必须使用图像来实现这些效果。但是&#xff0c;通过使用CSS3渐变(gradients)&#xff0c;可以减少下载的事件和宽带的使用。由于渐变(gradient)是由浏览器生成的&…